diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json new file mode 100644 index 00000000..c97b3047 --- /dev/null +++ b/dev/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-04-02T15:50:30","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/dev/aliasing/index.html b/dev/aliasing/index.html index c4374342..485b411d 100644 --- a/dev/aliasing/index.html +++ b/dev/aliasing/index.html @@ -1,5 +1,5 @@ -Aliasing · GeophysicalFlows.jl

Aliasing

In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

De-aliasing scheme

FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
+Aliasing · GeophysicalFlows.jl

Aliasing

In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

De-aliasing scheme

FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
 
 julia> OneDimensionalGrid
          ├─────────── Device: CPU
@@ -19,4 +19,4 @@
   └──── timestepper: RK4TimeStepper
   
 julia> prob.grid.aliased_fraction
-0.5

Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

+0.5

Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

diff --git a/dev/assets/README/index.html b/dev/assets/README/index.html index 365666df..d733cf8d 100644 --- a/dev/assets/README/index.html +++ b/dev/assets/README/index.html @@ -1,2 +1,2 @@ -- · GeophysicalFlows.jl
+- · GeophysicalFlows.jl
diff --git a/dev/assets/documenter.js b/dev/assets/documenter.js index 6adfbbbf..c6562b55 100644 --- a/dev/assets/documenter.js +++ b/dev/assets/documenter.js @@ -1,15 +1,15 @@ // Generated by Documenter.jl requirejs.config({ paths: { - 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min', + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', - 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min', - 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min', - 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', - 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min', - 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min', - 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', }, shim: { "highlight-julia": { @@ -70,13 +70,91 @@ $(document).ready(function() { hljs.highlightAll(); }) +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function (event) { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + let animationSpeed = event.noToggleAnimation ? 0 : 400; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(animationSpeed); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(animationSpeed); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + }) //////////////////////////////////////////////////////////////////////////////// require([], function() { function addCopyButtonCallbacks() { for (const el of document.getElementsByTagName("pre")) { const button = document.createElement("button"); - button.classList.add("copy-button", "fas", "fa-copy"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + el.appendChild(button); const success = function () { @@ -85,7 +163,7 @@ function addCopyButtonCallbacks() { }; const failure = function () { - button.classList.add("error", "fa-times"); + button.classList.add("error", "fa-xmark"); button.classList.remove("fa-copy"); }; @@ -94,7 +172,7 @@ function addCopyButtonCallbacks() { setTimeout(function () { button.classList.add("fa-copy"); - button.classList.remove("success", "fa-check", "fa-times"); + button.classList.remove("success", "fa-check", "fa-xmark"); }, 5000); }); } @@ -138,30 +216,682 @@ require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { // Manages the top navigation bar (hides it when the user starts scrolling down on the // mobile). window.Headroom = Headroom; // work around buggy module loading? -$(document).ready(function() { - $('#documenter .docs-navbar').headroom({ - "tolerance": {"up": 10, "down": 10}, +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, }); +}); + }) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let meta = $("div[data-docstringscollapsed]").data(); + + if (meta?.docstringscollapsed) { + $("#documenter-article-toggle-button").trigger({ + type: "click", + noToggleAnimation: true, + }); + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +/* +To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +PSEUDOCODE: + +Searching happens automatically as the user types or adjusts the selected filters. +To preserve responsiveness, as much as possible of the slow parts of the search are done +in a web worker. Searching and result generation are done in the worker, and filtering and +DOM updates are done in the main thread. The filters are in the main thread as they should +be very quick to apply. This lets filters be changed without re-searching with minisearch +(which is possible even if filtering is on the worker thread) and also lets filters be +changed _while_ the worker is searching and without message passing (neither of which are +possible if filtering is on the worker thread) + +SEARCH WORKER: + +Import minisearch + +Build index + +On message from main thread + run search + find the first 200 unique results from each category, and compute their divs for display + note that this is necessary and sufficient information for the main thread to find the + first 200 unique results from any given filter set + post results to main thread + +MAIN: + +Launch worker + +Declare nonconstant globals (worker_is_running, last_search_text, unfiltered_results) + +On text update + if worker is not running, launch_search() + +launch_search + set worker_is_running to true, set last_search_text to the search text + post the search query to worker + +on message from worker + if last_search_text is not the same as the text in the search field, + the latest search result is not reflective of the latest search query, so update again + launch_search() + otherwise + set worker_is_running to false + + regardless, display the new search results to the user + save the unfiltered_results as a global + update_search() + +on filter click + adjust the filter selection + update_search() + +update_search + apply search filters by looping through the unfiltered_results and finding the first 200 + unique results that match the filters + + Update the DOM +*/ + +/////// SEARCH WORKER /////// + +function worker_function(documenterSearchIndex, documenterBaseURL, filters) { + importScripts( + "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" + ); + + let data = documenterSearchIndex.map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; + }); + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", + ]); + + let index = new MiniSearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + + word = word.toLowerCase(); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not + // find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + prefix: true, + boost: { title: 100 }, + fuzzy: 2, + }, + }); + + index.addAll(data); + + /** + * Used to map characters to HTML entities. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }; + + /** + * Used to match HTML entities and HTML characters. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** + * Escape function from lodash + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + function escape(string) { + return string && reHasUnescapedHtml.test(string) + ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) + : string || ""; + } + + /** + * Make the result component given a minisearch result data object and the value + * of the search input as queryString. To view the result object structure, refer: + * https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ + function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`${querystring}`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + text = text.length ? escape(text) : ""; + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`${escape(querystring)}`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${escape(result.title)}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; + } + + self.onmessage = function (e) { + let query = e.data; + let results = index.search(query, { + filter: (result) => { + // Only return relevant results + return result.score >= 1; + }, + }); + + // Pre-filter to deduplicate and limit to 200 per category to the extent + // possible without knowing what the filters are. + let filtered_results = []; + let counts = {}; + for (let filter of filters) { + counts[filter] = 0; + } + let present = {}; + + for (let result of results) { + cat = result.category; + cnt = counts[cat]; + if (cnt < 200) { + id = cat + "---" + result.location; + if (present[id]) { + continue; + } + present[id] = true; + filtered_results.push({ + location: result.location, + category: cat, + div: make_search_result(result, query), + }); + } + } + + postMessage(filtered_results); + }; +} + +// `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! +const filters = [ + ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), +]; +const worker_str = + "(" + + worker_function.toString() + + ")(" + + JSON.stringify(documenterSearchIndex["docs"]) + + "," + + JSON.stringify(documenterBaseURL) + + "," + + JSON.stringify(filters) + + ")"; +const worker_blob = new Blob([worker_str], { type: "text/javascript" }); +const worker = new Worker(URL.createObjectURL(worker_blob)); + +/////// SEARCH MAIN /////// + +// Whether the worker is currently handling a search. This is a boolean +// as the worker only ever handles 1 or 0 searches at a time. +var worker_is_running = false; + +// The last search text that was sent to the worker. This is used to determine +// if the worker should be launched again when it reports back results. +var last_search_text = ""; + +// The results of the last search. This, in combination with the state of the filters +// in the DOM, is used compute the results to display on calls to update_search. +var unfiltered_results = []; + +// Which filter is currently selected +var selected_filter = ""; + +$(document).on("input", ".documenter-search-input", function (event) { + if (!worker_is_running) { + launch_search(); + } +}); + +function launch_search() { + worker_is_running = true; + last_search_text = $(".documenter-search-input").val(); + worker.postMessage(last_search_text); +} + +worker.onmessage = function (e) { + if (last_search_text !== $(".documenter-search-input").val()) { + launch_search(); + } else { + worker_is_running = false; + } + + unfiltered_results = e.data; + update_search(); +}; + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + selected_filter = ""; + } else { + selected_filter = $(this).text().toLowerCase(); + } + + // This updates search results and toggles classes for UI: + update_search(); +}); + +/** + * Make/Update the search component + */ +function update_search() { + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + if (selected_filter == "") { + results = unfiltered_results; + } else { + results = unfiltered_results.filter((result) => { + return selected_filter == result.category.toLowerCase(); + }); + } + + let search_result_container = ``; + let modal_filters = make_modal_body_filters(); + let search_divider = `
`; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + for (var i = 0, n = results.length; i < n && count < 200; ++i) { + let result = results[i]; + if (result.location && !links.includes(result.location)) { + search_results += result.div; + count++; + links.push(result.location); + } + } + + if (count == 1) { + count_str = "1 result"; + } else if (count == 200) { + count_str = "200+ results"; + } else { + count_str = count + " results"; + } + let result_count = `
${count_str}
`; + + search_result_container = ` +
+ ${modal_filters} + ${search_divider} + ${result_count} +
+ ${search_results} +
+
+ `; + } else { + search_result_container = ` +
+ ${modal_filters} + ${search_divider} +
0 result(s)
+
+
No result found!
+ `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(` +
Type something to get started!
+ `); + } +} + +/** + * Make the modal filter html + * + * @returns string + */ +function make_modal_body_filters() { + let str = filters + .map((val) => { + if (selected_filter == val.toLowerCase()) { + return `${val}`; + } else { + return `${val}`; + } + }) + .join(""); + + return ` +
+ Filters: + ${str} +
`; +} }) //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { // Modal settings dialog -$(document).ready(function() { - var settings = $('#documenter-settings'); - $('#documenter-settings-button').click(function(){ - settings.toggleClass('is-active'); +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); }); // Close the dialog if X is clicked - $('#documenter-settings button.delete').click(function(){ - settings.removeClass('is-active'); + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); }); // Close dialog if ESC is pressed - $(document).keyup(function(e) { - if (e.keyCode == 27) settings.removeClass('is-active'); + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let search_modal_header = ` + + `; + + let initial_search_body = ` +
Type something to get started!
+ `; + + let search_modal_footer = ` + + `; + + $(document.body).append( + ` + + ` + ); + + document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); + }); + + document + .querySelector(".close-search-modal") + .addEventListener("click", () => { + closeModal(); + }); + + $(document).on("click", ".search-result-link", function () { + closeModal(); + }); + + document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; }); + + // Functions to open and close a modal + function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); + } + + function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
Type something to get started!
+ `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); + } + + document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); }); }) @@ -169,150 +899,139 @@ $(document).ready(function() { require(['jquery'], function($) { // Manages the showing and hiding of the sidebar. -$(document).ready(function() { +$(document).ready(function () { var sidebar = $("#documenter > .docs-sidebar"); - var sidebar_button = $("#documenter-sidebar-button") - sidebar_button.click(function(ev) { + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { ev.preventDefault(); - sidebar.toggleClass('visible'); - if (sidebar.hasClass('visible')) { + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { // Makes sure that the current menu item is visible in the sidebar. $("#documenter .docs-menu a.is-active").focus(); } }); - $("#documenter > .docs-main").bind('click', function(ev) { + $("#documenter > .docs-main").bind("click", function (ev) { if ($(ev.target).is(sidebar_button)) { return; } - if (sidebar.hasClass('visible')) { - sidebar.removeClass('visible'); + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); } }); -}) +}); // Resizes the package name / sitename in the sidebar if it is too wide. // Inspired by: https://github.com/davatron5000/FitText.js -$(document).ready(function() { +$(document).ready(function () { e = $("#documenter .docs-autofit"); function resize() { - var L = parseInt(e.css('max-width'), 10); + var L = parseInt(e.css("max-width"), 10); var L0 = e.width(); - if(L0 > L) { - var h0 = parseInt(e.css('font-size'), 10); - e.css('font-size', L * h0 / L0); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); // TODO: make sure it survives resizes? } } // call once and then register events resize(); $(window).resize(resize); - $(window).on('orientationchange', resize); + $(window).on("orientationchange", resize); }); // Scroll the navigation bar to the currently selected menu item -$(document).ready(function() { +$(document).ready(function () { var sidebar = $("#documenter .docs-menu").get(0); var active = $("#documenter .docs-menu .is-active").get(0); - if(typeof active !== 'undefined') { + if (typeof active !== "undefined") { sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; } -}) +}); }) //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { -function set_theme(theme) { - var active = null; - var disabled = []; - for (var i = 0; i < document.styleSheets.length; i++) { - var ss = document.styleSheets[i]; - var themename = ss.ownerNode.getAttribute("data-theme-name"); - if(themename === null) continue; // ignore non-theme stylesheets - // Find the active theme - if(themename === theme) active = ss; - else disabled.push(ss); - } - if(active !== null) { - active.disabled = false; - if(active.ownerNode.getAttribute("data-theme-primary") === null) { - document.getElementsByTagName('html')[0].className = "theme--" + theme; - } else { - document.getElementsByTagName('html')[0].className = ""; - } - disabled.forEach(function(ss){ - ss.disabled = true; - }); - } - - // Store the theme in localStorage - if(typeof(window.localStorage) !== "undefined") { - window.localStorage.setItem("documenter-theme", theme); - } else { - console.error("Browser does not support window.localStorage"); - } -} - // Theme picker setup -$(document).ready(function() { +$(document).ready(function () { // onchange callback - $('#documenter-themepicker').change(function themepick_callback(ev){ - var themename = $('#documenter-themepicker option:selected').attr('value'); - set_theme(themename); + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); }); // Make sure that the themepicker displays the correct theme when the theme is retrieved // from localStorage - if(typeof(window.localStorage) !== "undefined") { - var theme = window.localStorage.getItem("documenter-theme"); - if(theme !== null) { - $('#documenter-themepicker option').each(function(i,e) { - e.selected = (e.value === theme); - }) - } else { - $('#documenter-themepicker option').each(function(i,e) { - e.selected = $("html").hasClass(`theme--${e.value}`); - }) + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); } } -}) +}); }) //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { // update the version selector with info from the siteinfo.js and ../versions.js files -$(document).ready(function() { +$(document).ready(function () { // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the // siteinfo.js file, we just return immediately and not display the version selector. - if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) { + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { return; } var version_selector = $("#documenter .docs-version-selector"); var version_selector_select = $("#documenter .docs-version-selector select"); - version_selector_select.change(function(x) { - target_href = version_selector_select.children("option:selected").get(0).value; + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; window.location.href = target_href; }); // add the current version to the selector based on siteinfo.js, but only if the selector is empty - if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) { - var option = $(""); + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); version_selector_select.append(option); } - if (typeof DOC_VERSIONS !== 'undefined') { + if (typeof DOC_VERSIONS !== "undefined") { var existing_versions = version_selector_select.children("option"); - var existing_versions_texts = existing_versions.map(function(i,x){return x.text}); - DOC_VERSIONS.forEach(function(each) { - var version_url = documenterBaseURL + "/../" + each; + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; var existing_id = $.inArray(each, existing_versions_texts); // if not already in the version selector, add it as a new option, // otherwise update the old option with the URL and enable it if (existing_id == -1) { - var option = $(""); + var option = $( + "" + ); version_selector_select.append(option); } else { var option = existing_versions[existing_id]; @@ -326,6 +1045,6 @@ $(document).ready(function() { if (version_selector_select.children("option").length > 0) { version_selector.toggleClass("visible"); } -}) +}); }) diff --git a/dev/assets/energy_budgets_Ito.svg b/dev/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..fd5b62fd --- /dev/null +++ b/dev/assets/energy_budgets_Ito.svg @@ -0,0 +1,1208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/assets/energy_budgets_Stratonovich.svg b/dev/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..f7da023c --- /dev/null +++ b/dev/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/assets/energy_comparison.svg b/dev/assets/energy_comparison.svg new file mode 100644 index 00000000..4ab4ca22 --- /dev/null +++ b/dev/assets/energy_comparison.svg @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/assets/themes/documenter-dark.css b/dev/assets/themes/documenter-dark.css index 0bf1af7d..53889fb9 100644 --- a/dev/assets/themes/documenter-dark.css +++ b/dev/assets/themes/documenter-dark.css @@ -1,7702 +1,7 @@ -@charset "UTF-8"; -/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ -@keyframes spinAround { - from { - transform: rotate(0deg); } - to { - transform: rotate(359deg); } } - -html.theme--documenter-dark .tabs, html.theme--documenter-dark .pagination-previous, -html.theme--documenter-dark .pagination-next, -html.theme--documenter-dark .pagination-link, -html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .breadcrumb, html.theme--documenter-dark .file, html.theme--documenter-dark .button, .is-unselectable, html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after, html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - transform: rotate(-45deg); - transform-origin: center; - width: 0.625em; } - -html.theme--documenter-dark .admonition:not(:last-child), html.theme--documenter-dark .tabs:not(:last-child), html.theme--documenter-dark .message:not(:last-child), html.theme--documenter-dark .list:not(:last-child), html.theme--documenter-dark .level:not(:last-child), html.theme--documenter-dark .breadcrumb:not(:last-child), html.theme--documenter-dark .highlight:not(:last-child), html.theme--documenter-dark .block:not(:last-child), html.theme--documenter-dark .title:not(:last-child), -html.theme--documenter-dark .subtitle:not(:last-child), html.theme--documenter-dark .table-container:not(:last-child), html.theme--documenter-dark .table:not(:last-child), html.theme--documenter-dark .progress:not(:last-child), html.theme--documenter-dark .notification:not(:last-child), html.theme--documenter-dark .content:not(:last-child), html.theme--documenter-dark .box:not(:last-child) { - margin-bottom: 1.5rem; } - -html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; } - html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before, html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before { - height: 2px; - width: 50%; } - html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { - height: 50%; - width: 2px; } - html.theme--documenter-dark .modal-close:hover, html.theme--documenter-dark .delete:hover, html.theme--documenter-dark .modal-close:focus, html.theme--documenter-dark .delete:focus { - background-color: rgba(10, 10, 10, 0.3); } - html.theme--documenter-dark .modal-close:active, html.theme--documenter-dark .delete:active { - background-color: rgba(10, 10, 10, 0.4); } - html.theme--documenter-dark .is-small.modal-close, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.modal-close, html.theme--documenter-dark .is-small.delete, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.delete { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; } - html.theme--documenter-dark .is-medium.modal-close, html.theme--documenter-dark .is-medium.delete { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; } - html.theme--documenter-dark .is-large.modal-close, html.theme--documenter-dark .is-large.delete { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; } - -html.theme--documenter-dark .control.is-loading::after, html.theme--documenter-dark .select.is-loading::after, html.theme--documenter-dark .loader, html.theme--documenter-dark .button.is-loading::after { - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdee0; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; } - -html.theme--documenter-dark .hero-video, html.theme--documenter-dark .modal-background, html.theme--documenter-dark .modal, html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, -html.theme--documenter-dark .image.is-square .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, -html.theme--documenter-dark .image.is-1by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, -html.theme--documenter-dark .image.is-5by4 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, -html.theme--documenter-dark .image.is-4by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, -html.theme--documenter-dark .image.is-3by2 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, -html.theme--documenter-dark .image.is-5by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, -html.theme--documenter-dark .image.is-16by9 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, -html.theme--documenter-dark .image.is-2by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, -html.theme--documenter-dark .image.is-3by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, -html.theme--documenter-dark .image.is-4by5 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, -html.theme--documenter-dark .image.is-3by4 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, -html.theme--documenter-dark .image.is-2by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, -html.theme--documenter-dark .image.is-3by5 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, -html.theme--documenter-dark .image.is-9by16 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, -html.theme--documenter-dark .image.is-1by2 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, -html.theme--documenter-dark .image.is-1by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; } - -html.theme--documenter-dark .pagination-previous, -html.theme--documenter-dark .pagination-next, -html.theme--documenter-dark .pagination-link, -html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .file-cta, -html.theme--documenter-dark .file-name, html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark .button { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 0.4em; - box-shadow: none; - display: inline-flex; - font-size: 15px; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; } - html.theme--documenter-dark .pagination-previous:focus, - html.theme--documenter-dark .pagination-next:focus, - html.theme--documenter-dark .pagination-link:focus, - html.theme--documenter-dark .pagination-ellipsis:focus, html.theme--documenter-dark .file-cta:focus, - html.theme--documenter-dark .file-name:focus, html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .button:focus, html.theme--documenter-dark .is-focused.pagination-previous, - html.theme--documenter-dark .is-focused.pagination-next, - html.theme--documenter-dark .is-focused.pagination-link, - html.theme--documenter-dark .is-focused.pagination-ellipsis, html.theme--documenter-dark .is-focused.file-cta, - html.theme--documenter-dark .is-focused.file-name, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-focused.button, html.theme--documenter-dark .pagination-previous:active, - html.theme--documenter-dark .pagination-next:active, - html.theme--documenter-dark .pagination-link:active, - html.theme--documenter-dark .pagination-ellipsis:active, html.theme--documenter-dark .file-cta:active, - html.theme--documenter-dark .file-name:active, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .button:active, html.theme--documenter-dark .is-active.pagination-previous, - html.theme--documenter-dark .is-active.pagination-next, - html.theme--documenter-dark .is-active.pagination-link, - html.theme--documenter-dark .is-active.pagination-ellipsis, html.theme--documenter-dark .is-active.file-cta, - html.theme--documenter-dark .is-active.file-name, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .is-active.button { - outline: none; } - html.theme--documenter-dark .pagination-previous[disabled], - html.theme--documenter-dark .pagination-next[disabled], - html.theme--documenter-dark .pagination-link[disabled], - html.theme--documenter-dark .pagination-ellipsis[disabled], html.theme--documenter-dark .file-cta[disabled], - html.theme--documenter-dark .file-name[disabled], html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .pagination-previous, html.theme--documenter-dark fieldset[disabled] .pagination-previous, - fieldset[disabled] html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark fieldset[disabled] .pagination-next, - fieldset[disabled] html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark fieldset[disabled] .pagination-link, - fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis, - html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis, fieldset[disabled] html.theme--documenter-dark .file-cta, html.theme--documenter-dark fieldset[disabled] .file-cta, - fieldset[disabled] html.theme--documenter-dark .file-name, - html.theme--documenter-dark fieldset[disabled] .file-name, fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark fieldset[disabled] .select select, html.theme--documenter-dark .select fieldset[disabled] select, html.theme--documenter-dark fieldset[disabled] .textarea, html.theme--documenter-dark fieldset[disabled] .input, html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] html.theme--documenter-dark .button, html.theme--documenter-dark fieldset[disabled] .button { - cursor: not-allowed; } - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; } - -ul { - list-style: none; } - -button, -input, -select, -textarea { - margin: 0; } - -html { - box-sizing: border-box; } - -*, *::before, *::after { - box-sizing: inherit; } - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; } - -audio { - max-width: 100%; } - -iframe { - border: 0; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - td:not([align]), - th:not([align]) { - text-align: left; } - -.is-clearfix::after { - clear: both; - content: " "; - display: table; } - -.is-pulled-left { - float: left !important; } - -.is-pulled-right { - float: right !important; } - -.is-clipped { - overflow: hidden !important; } - -.is-size-1 { - font-size: 3rem !important; } - -.is-size-2 { - font-size: 2.5rem !important; } - -.is-size-3 { - font-size: 2rem !important; } - -.is-size-4 { - font-size: 1.5rem !important; } - -.is-size-5 { - font-size: 1.25rem !important; } - -.is-size-6 { - font-size: 15px !important; } - -.is-size-7, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - font-size: 0.85em !important; } - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; } - .is-size-2-mobile { - font-size: 2.5rem !important; } - .is-size-3-mobile { - font-size: 2rem !important; } - .is-size-4-mobile { - font-size: 1.5rem !important; } - .is-size-5-mobile { - font-size: 1.25rem !important; } - .is-size-6-mobile { - font-size: 15px !important; } - .is-size-7-mobile { - font-size: 0.85em !important; } } - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; } - .is-size-2-tablet { - font-size: 2.5rem !important; } - .is-size-3-tablet { - font-size: 2rem !important; } - .is-size-4-tablet { - font-size: 1.5rem !important; } - .is-size-5-tablet { - font-size: 1.25rem !important; } - .is-size-6-tablet { - font-size: 15px !important; } - .is-size-7-tablet { - font-size: 0.85em !important; } } - -@media screen and (max-width: 1055px) { - .is-size-1-touch { - font-size: 3rem !important; } - .is-size-2-touch { - font-size: 2.5rem !important; } - .is-size-3-touch { - font-size: 2rem !important; } - .is-size-4-touch { - font-size: 1.5rem !important; } - .is-size-5-touch { - font-size: 1.25rem !important; } - .is-size-6-touch { - font-size: 15px !important; } - .is-size-7-touch { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1056px) { - .is-size-1-desktop { - font-size: 3rem !important; } - .is-size-2-desktop { - font-size: 2.5rem !important; } - .is-size-3-desktop { - font-size: 2rem !important; } - .is-size-4-desktop { - font-size: 1.5rem !important; } - .is-size-5-desktop { - font-size: 1.25rem !important; } - .is-size-6-desktop { - font-size: 15px !important; } - .is-size-7-desktop { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1216px) { - .is-size-1-widescreen { - font-size: 3rem !important; } - .is-size-2-widescreen { - font-size: 2.5rem !important; } - .is-size-3-widescreen { - font-size: 2rem !important; } - .is-size-4-widescreen { - font-size: 1.5rem !important; } - .is-size-5-widescreen { - font-size: 1.25rem !important; } - .is-size-6-widescreen { - font-size: 15px !important; } - .is-size-7-widescreen { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1408px) { - .is-size-1-fullhd { - font-size: 3rem !important; } - .is-size-2-fullhd { - font-size: 2.5rem !important; } - .is-size-3-fullhd { - font-size: 2rem !important; } - .is-size-4-fullhd { - font-size: 1.5rem !important; } - .is-size-5-fullhd { - font-size: 1.25rem !important; } - .is-size-6-fullhd { - font-size: 15px !important; } - .is-size-7-fullhd { - font-size: 0.85em !important; } } - -.has-text-centered { - text-align: center !important; } - -.has-text-justified { - text-align: justify !important; } - -.has-text-left { - text-align: left !important; } - -.has-text-right { - text-align: right !important; } - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; } } - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-centered-tablet-only { - text-align: center !important; } } - -@media screen and (max-width: 1055px) { - .has-text-centered-touch { - text-align: center !important; } } - -@media screen and (min-width: 1056px) { - .has-text-centered-desktop { - text-align: center !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-centered-desktop-only { - text-align: center !important; } } - -@media screen and (min-width: 1216px) { - .has-text-centered-widescreen { - text-align: center !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-centered-widescreen-only { - text-align: center !important; } } - -@media screen and (min-width: 1408px) { - .has-text-centered-fullhd { - text-align: center !important; } } - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; } } - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-justified-tablet-only { - text-align: justify !important; } } - -@media screen and (max-width: 1055px) { - .has-text-justified-touch { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) { - .has-text-justified-desktop { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-justified-desktop-only { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) { - .has-text-justified-widescreen { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-justified-widescreen-only { - text-align: justify !important; } } - -@media screen and (min-width: 1408px) { - .has-text-justified-fullhd { - text-align: justify !important; } } - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; } } - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-left-tablet-only { - text-align: left !important; } } - -@media screen and (max-width: 1055px) { - .has-text-left-touch { - text-align: left !important; } } - -@media screen and (min-width: 1056px) { - .has-text-left-desktop { - text-align: left !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-left-desktop-only { - text-align: left !important; } } - -@media screen and (min-width: 1216px) { - .has-text-left-widescreen { - text-align: left !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-left-widescreen-only { - text-align: left !important; } } - -@media screen and (min-width: 1408px) { - .has-text-left-fullhd { - text-align: left !important; } } - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; } } - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-right-tablet-only { - text-align: right !important; } } - -@media screen and (max-width: 1055px) { - .has-text-right-touch { - text-align: right !important; } } - -@media screen and (min-width: 1056px) { - .has-text-right-desktop { - text-align: right !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-right-desktop-only { - text-align: right !important; } } - -@media screen and (min-width: 1216px) { - .has-text-right-widescreen { - text-align: right !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-right-widescreen-only { - text-align: right !important; } } - -@media screen and (min-width: 1408px) { - .has-text-right-fullhd { - text-align: right !important; } } - -.is-capitalized { - text-transform: capitalize !important; } - -.is-lowercase { - text-transform: lowercase !important; } - -.is-uppercase { - text-transform: uppercase !important; } - -.is-italic { - font-style: italic !important; } - -.has-text-white { - color: white !important; } - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; } - -.has-background-white { - background-color: white !important; } - -.has-text-black { - color: #0a0a0a !important; } - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; } - -.has-background-black { - background-color: #0a0a0a !important; } - -.has-text-light { - color: #ecf0f1 !important; } - -a.has-text-light:hover, a.has-text-light:focus { - color: #cfd9db !important; } - -.has-background-light { - background-color: #ecf0f1 !important; } - -.has-text-dark { - color: #282f2f !important; } - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #111414 !important; } - -.has-background-dark { - background-color: #282f2f !important; } - -.has-text-primary { - color: #375a7f !important; } - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #28415b !important; } - -.has-background-primary { - background-color: #375a7f !important; } - -.has-text-link { - color: #1abc9c !important; } - -a.has-text-link:hover, a.has-text-link:focus { - color: #148f77 !important; } - -.has-background-link { - background-color: #1abc9c !important; } - -.has-text-info { - color: #024c7d !important; } - -a.has-text-info:hover, a.has-text-info:focus { - color: #012d4b !important; } - -.has-background-info { - background-color: #024c7d !important; } - -.has-text-success { - color: #008438 !important; } - -a.has-text-success:hover, a.has-text-success:focus { - color: #005122 !important; } - -.has-background-success { - background-color: #008438 !important; } - -.has-text-warning { - color: #ad8100 !important; } - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #7a5b00 !important; } - -.has-background-warning { - background-color: #ad8100 !important; } - -.has-text-danger { - color: #9e1b0d !important; } - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #6f1309 !important; } - -.has-background-danger { - background-color: #9e1b0d !important; } - -.has-text-black-bis { - color: #121212 !important; } - -.has-background-black-bis { - background-color: #121212 !important; } - -.has-text-black-ter { - color: #242424 !important; } - -.has-background-black-ter { - background-color: #242424 !important; } - -.has-text-grey-darker { - color: #282f2f !important; } - -.has-background-grey-darker { - background-color: #282f2f !important; } - -.has-text-grey-dark { - color: #343c3d !important; } - -.has-background-grey-dark { - background-color: #343c3d !important; } - -.has-text-grey { - color: #5e6d6f !important; } - -.has-background-grey { - background-color: #5e6d6f !important; } - -.has-text-grey-light { - color: #8c9b9d !important; } - -.has-background-grey-light { - background-color: #8c9b9d !important; } - -.has-text-grey-lighter { - color: #dbdee0 !important; } - -.has-background-grey-lighter { - background-color: #dbdee0 !important; } - -.has-text-white-ter { - color: #ecf0f1 !important; } - -.has-background-white-ter { - background-color: #ecf0f1 !important; } - -.has-text-white-bis { - color: #fafafa !important; } - -.has-background-white-bis { - background-color: #fafafa !important; } - -.has-text-weight-light { - font-weight: 300 !important; } - -.has-text-weight-normal { - font-weight: 400 !important; } - -.has-text-weight-medium { - font-weight: 500 !important; } - -.has-text-weight-semibold { - font-weight: 600 !important; } - -.has-text-weight-bold { - font-weight: 700 !important; } - -.is-family-primary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-secondary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-sans-serif { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-monospace { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-family-code { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-block { - display: block !important; } - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; } } - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-block-tablet-only { - display: block !important; } } - -@media screen and (max-width: 1055px) { - .is-block-touch { - display: block !important; } } - -@media screen and (min-width: 1056px) { - .is-block-desktop { - display: block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-block-desktop-only { - display: block !important; } } - -@media screen and (min-width: 1216px) { - .is-block-widescreen { - display: block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-block-widescreen-only { - display: block !important; } } - -@media screen and (min-width: 1408px) { - .is-block-fullhd { - display: block !important; } } - -.is-flex { - display: flex !important; } - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; } } - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-flex-tablet-only { - display: flex !important; } } - -@media screen and (max-width: 1055px) { - .is-flex-touch { - display: flex !important; } } - -@media screen and (min-width: 1056px) { - .is-flex-desktop { - display: flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-flex-desktop-only { - display: flex !important; } } - -@media screen and (min-width: 1216px) { - .is-flex-widescreen { - display: flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-flex-widescreen-only { - display: flex !important; } } - -@media screen and (min-width: 1408px) { - .is-flex-fullhd { - display: flex !important; } } - -.is-inline { - display: inline !important; } - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-tablet-only { - display: inline !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-touch { - display: inline !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-desktop { - display: inline !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-desktop-only { - display: inline !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-widescreen { - display: inline !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-widescreen-only { - display: inline !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-fullhd { - display: inline !important; } } - -.is-inline-block { - display: inline-block !important; } - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-block-tablet-only { - display: inline-block !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-block-touch { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-block-desktop { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-block-desktop-only { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-block-widescreen { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-block-widescreen-only { - display: inline-block !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-block-fullhd { - display: inline-block !important; } } - -.is-inline-flex { - display: inline-flex !important; } - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-flex-touch { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-flex-desktop { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-flex-widescreen { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-flex-fullhd { - display: inline-flex !important; } } - -.is-hidden { - display: none !important; } - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; } - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; } } - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-hidden-tablet-only { - display: none !important; } } - -@media screen and (max-width: 1055px) { - .is-hidden-touch { - display: none !important; } } - -@media screen and (min-width: 1056px) { - .is-hidden-desktop { - display: none !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-hidden-desktop-only { - display: none !important; } } - -@media screen and (min-width: 1216px) { - .is-hidden-widescreen { - display: none !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-hidden-widescreen-only { - display: none !important; } } - -@media screen and (min-width: 1408px) { - .is-hidden-fullhd { - display: none !important; } } - -.is-invisible { - visibility: hidden !important; } - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; } } - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-invisible-tablet-only { - visibility: hidden !important; } } - -@media screen and (max-width: 1055px) { - .is-invisible-touch { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) { - .is-invisible-desktop { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-invisible-desktop-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) { - .is-invisible-widescreen { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-invisible-widescreen-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1408px) { - .is-invisible-fullhd { - visibility: hidden !important; } } - -.is-marginless { - margin: 0 !important; } - -.is-paddingless { - padding: 0 !important; } - -.is-radiusless { - border-radius: 0 !important; } - -.is-shadowless { - box-shadow: none !important; } - -.is-relative { - position: relative !important; } - -html.theme--documenter-dark { - /* This file contain the overall layout. - * - * The main container is
that is identified by id #documenter. - */ - /*! +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! Theme: a11y-dark Author: @ericwbailey Maintainer: @ericwbailey Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css -*/ - /* Comment */ - /* Red */ - /* Orange */ - /* Yellow */ - /* Green */ - /* Blue */ - /* Purple */ } - html.theme--documenter-dark html { - background-color: #1f2424; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - html.theme--documenter-dark article, - html.theme--documenter-dark aside, - html.theme--documenter-dark figure, - html.theme--documenter-dark footer, - html.theme--documenter-dark header, - html.theme--documenter-dark hgroup, - html.theme--documenter-dark section { - display: block; } - html.theme--documenter-dark body, - html.theme--documenter-dark button, - html.theme--documenter-dark input, - html.theme--documenter-dark select, - html.theme--documenter-dark textarea { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } - html.theme--documenter-dark code, - html.theme--documenter-dark pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } - html.theme--documenter-dark body { - color: #fff; - font-size: 1em; - font-weight: 400; - line-height: 1.5; } - html.theme--documenter-dark a { - color: #1abc9c; - cursor: pointer; - text-decoration: none; } - html.theme--documenter-dark a strong { - color: currentColor; } - html.theme--documenter-dark a:hover { - color: #1dd2af; } - html.theme--documenter-dark code { - background-color: rgba(255, 255, 255, 0.05); - color: #ececec; - font-size: 0.875em; - font-weight: normal; - padding: 0.1em; } - html.theme--documenter-dark hr { - background-color: #282f2f; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; } - html.theme--documenter-dark img { - height: auto; - max-width: 100%; } - html.theme--documenter-dark input[type="checkbox"], - html.theme--documenter-dark input[type="radio"] { - vertical-align: baseline; } - html.theme--documenter-dark small { - font-size: 0.875em; } - html.theme--documenter-dark span { - font-style: inherit; - font-weight: inherit; } - html.theme--documenter-dark strong { - color: #f2f2f2; - font-weight: 700; } - html.theme--documenter-dark fieldset { - border: none; } - html.theme--documenter-dark pre { - -webkit-overflow-scrolling: touch; - background-color: #282f2f; - color: #fff; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; } - html.theme--documenter-dark pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; } - html.theme--documenter-dark table td, - html.theme--documenter-dark table th { - vertical-align: top; } - html.theme--documenter-dark table td:not([align]), - html.theme--documenter-dark table th:not([align]) { - text-align: left; } - html.theme--documenter-dark table th { - color: #f2f2f2; } - html.theme--documenter-dark .box { - background-color: #343c3d; - border-radius: 8px; - box-shadow: none; - color: #fff; - display: block; - padding: 1.25rem; } - html.theme--documenter-dark a.box:hover, html.theme--documenter-dark a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #1abc9c; } - html.theme--documenter-dark a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #1abc9c; } - html.theme--documenter-dark .button { - background-color: #282f2f; - border-color: #4c5759; - border-width: 1px; - color: #375a7f; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; } - html.theme--documenter-dark .button strong { - color: inherit; } - html.theme--documenter-dark .button .icon, html.theme--documenter-dark .button .icon.is-small, html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search > input.icon, html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search > input.icon, html.theme--documenter-dark .button .icon.is-medium, html.theme--documenter-dark .button .icon.is-large { - height: 1.5em; - width: 1.5em; } - html.theme--documenter-dark .button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; } - html.theme--documenter-dark .button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); } - html.theme--documenter-dark .button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); } - html.theme--documenter-dark .button:hover, html.theme--documenter-dark .button.is-hovered { - border-color: #8c9b9d; - color: #f2f2f2; } - html.theme--documenter-dark .button:focus, html.theme--documenter-dark .button.is-focused { - border-color: #8c9b9d; - color: #17a689; } - html.theme--documenter-dark .button:focus:not(:active), html.theme--documenter-dark .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .button:active, html.theme--documenter-dark .button.is-active { - border-color: #343c3d; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text { - background-color: transparent; - border-color: transparent; - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .button.is-text:hover, html.theme--documenter-dark .button.is-text.is-hovered, html.theme--documenter-dark .button.is-text:focus, html.theme--documenter-dark .button.is-text.is-focused { - background-color: #282f2f; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text:active, html.theme--documenter-dark .button.is-text.is-active { - background-color: #1d2122; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:hover, html.theme--documenter-dark .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:focus, html.theme--documenter-dark .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:focus:not(:active), html.theme--documenter-dark .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-hovered { - background-color: black; } - html.theme--documenter-dark .button.is-white.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - html.theme--documenter-dark .button.is-white.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-outlined.is-focused { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-white.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:hover, html.theme--documenter-dark .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:focus, html.theme--documenter-dark .button.is-black.is-focused { - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:focus:not(:active), html.theme--documenter-dark .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-black.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-loading::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-outlined.is-focused { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-black.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-light { - background-color: #ecf0f1; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:hover, html.theme--documenter-dark .button.is-light.is-hovered { - background-color: #e5eaec; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:focus, html.theme--documenter-dark .button.is-light.is-focused { - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:focus:not(:active), html.theme--documenter-dark .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light.is-active { - background-color: #dde4e6; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light { - background-color: #ecf0f1; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-light.is-inverted { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-hovered { - background-color: #1d2122; } - html.theme--documenter-dark .button.is-light.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted { - background-color: #282f2f; - border-color: transparent; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-loading::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-light.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-outlined.is-focused { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-light.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #282f2f; - color: #282f2f; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #282f2f; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark, html.theme--documenter-dark .content kbd.button { - background-color: #282f2f; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover, html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered { - background-color: #232829; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused { - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:focus:not(:active), html.theme--documenter-dark .content kbd.button:focus:not(:active), html.theme--documenter-dark .button.is-dark.is-focused:not(:active), html.theme--documenter-dark .content kbd.button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active { - background-color: #1d2122; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark[disabled], html.theme--documenter-dark .content kbd.button[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark, fieldset[disabled] html.theme--documenter-dark .content kbd.button { - background-color: #282f2f; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-dark.is-inverted, html.theme--documenter-dark .content kbd.button.is-inverted { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted:hover, html.theme--documenter-dark .content kbd.button.is-inverted:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered { - background-color: #dde4e6; } - html.theme--documenter-dark .button.is-dark.is-inverted[disabled], html.theme--documenter-dark .content kbd.button.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted { - background-color: #ecf0f1; - border-color: transparent; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-loading::after, html.theme--documenter-dark .content kbd.button.is-loading::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-dark.is-outlined, html.theme--documenter-dark .content kbd.button.is-outlined { - background-color: transparent; - border-color: #282f2f; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-outlined.is-focused { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-dark.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined { - background-color: transparent; - border-color: #282f2f; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-primary, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { - background-color: #375a7f; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink { - background-color: #335476; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:focus:not(:active), html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus:not(:active), html.theme--documenter-dark .button.is-primary.is-focused:not(:active), html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink { - background-color: #2f4d6d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary[disabled], html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { - background-color: #375a7f; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-primary.is-inverted, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-primary.is-inverted[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-loading.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-primary.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #375a7f; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { - background-color: #375a7f; - border-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { - border-color: transparent transparent #375a7f #375a7f !important; } - html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-primary.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #375a7f; - box-shadow: none; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { - background-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #375a7f #375a7f !important; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-link { - background-color: #1abc9c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:hover, html.theme--documenter-dark .button.is-link.is-hovered { - background-color: #18b193; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:focus, html.theme--documenter-dark .button.is-link.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:focus:not(:active), html.theme--documenter-dark .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link.is-active { - background-color: #17a689; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link { - background-color: #1abc9c; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-link.is-inverted { - background-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-link.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-link.is-outlined { - background-color: transparent; - border-color: #1abc9c; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-outlined.is-focused { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #1abc9c #1abc9c !important; } - html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-link.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined { - background-color: transparent; - border-color: #1abc9c; - box-shadow: none; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #1abc9c #1abc9c !important; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-info { - background-color: #024c7d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:hover, html.theme--documenter-dark .button.is-info.is-hovered { - background-color: #024470; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:focus, html.theme--documenter-dark .button.is-info.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:focus:not(:active), html.theme--documenter-dark .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info.is-active { - background-color: #023d64; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info { - background-color: #024c7d; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-info.is-inverted { - background-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-info.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-info.is-outlined { - background-color: transparent; - border-color: #024c7d; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-outlined.is-focused { - background-color: #024c7d; - border-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #024c7d #024c7d !important; } - html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-info.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined { - background-color: transparent; - border-color: #024c7d; - box-shadow: none; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #024c7d #024c7d !important; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-success { - background-color: #008438; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:hover, html.theme--documenter-dark .button.is-success.is-hovered { - background-color: #007733; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:focus, html.theme--documenter-dark .button.is-success.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:focus:not(:active), html.theme--documenter-dark .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success.is-active { - background-color: #006b2d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success { - background-color: #008438; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-success.is-inverted { - background-color: #fff; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-success.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-success.is-outlined { - background-color: transparent; - border-color: #008438; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-outlined.is-focused { - background-color: #008438; - border-color: #008438; - color: #fff; } - html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #008438 #008438 !important; } - html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-success.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined { - background-color: transparent; - border-color: #008438; - box-shadow: none; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #008438 #008438 !important; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-warning { - background-color: #ad8100; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:hover, html.theme--documenter-dark .button.is-warning.is-hovered { - background-color: #a07700; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:focus, html.theme--documenter-dark .button.is-warning.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:focus:not(:active), html.theme--documenter-dark .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning.is-active { - background-color: #946e00; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning { - background-color: #ad8100; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-warning.is-inverted { - background-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-warning.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ad8100; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-outlined.is-focused { - background-color: #ad8100; - border-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ad8100 #ad8100 !important; } - html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-warning.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ad8100; - box-shadow: none; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ad8100 #ad8100 !important; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-danger { - background-color: #9e1b0d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:hover, html.theme--documenter-dark .button.is-danger.is-hovered { - background-color: #92190c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:focus, html.theme--documenter-dark .button.is-danger.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:focus:not(:active), html.theme--documenter-dark .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger.is-active { - background-color: #86170b; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger { - background-color: #9e1b0d; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-danger.is-inverted { - background-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-danger.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-danger.is-outlined { - background-color: transparent; - border-color: #9e1b0d; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-outlined.is-focused { - background-color: #9e1b0d; - border-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #9e1b0d #9e1b0d !important; } - html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-danger.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined { - background-color: transparent; - border-color: #9e1b0d; - box-shadow: none; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #9e1b0d #9e1b0d !important; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .button.is-normal { - font-size: 15px; } - html.theme--documenter-dark .button.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .button.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .button { - background-color: #8c9b9d; - border-color: #dbdee0; - box-shadow: none; - opacity: 0.5; } - html.theme--documenter-dark .button.is-fullwidth { - display: flex; - width: 100%; } - html.theme--documenter-dark .button.is-loading { - color: transparent !important; - pointer-events: none; } - html.theme--documenter-dark .button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; } - html.theme--documenter-dark .button.is-static { - background-color: #282f2f; - border-color: #5e6d6f; - color: #dbdee0; - box-shadow: none; - pointer-events: none; } - html.theme--documenter-dark .button.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .buttons .button { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; } - html.theme--documenter-dark .buttons:last-child { - margin-bottom: -0.5rem; } - html.theme--documenter-dark .buttons:not(:last-child) { - margin-bottom: 1rem; } - html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; } - html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; } - html.theme--documenter-dark .buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; } - html.theme--documenter-dark .buttons.has-addons .button:last-child { - margin-right: 0; } - html.theme--documenter-dark .buttons.has-addons .button:hover, html.theme--documenter-dark .buttons.has-addons .button.is-hovered { - z-index: 2; } - html.theme--documenter-dark .buttons.has-addons .button:focus, html.theme--documenter-dark .buttons.has-addons .button.is-focused, html.theme--documenter-dark .buttons.has-addons .button:active, html.theme--documenter-dark .buttons.has-addons .button.is-active, html.theme--documenter-dark .buttons.has-addons .button.is-selected { - z-index: 3; } - html.theme--documenter-dark .buttons.has-addons .button:focus:hover, html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover, html.theme--documenter-dark .buttons.has-addons .button:active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover { - z-index: 4; } - html.theme--documenter-dark .buttons.has-addons .button.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .buttons.is-centered { - justify-content: center; } - html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - html.theme--documenter-dark .buttons.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - html.theme--documenter-dark .container { - flex-grow: 1; - margin: 0 auto; - position: relative; - width: auto; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .container { - max-width: 992px; } - html.theme--documenter-dark .container.is-fluid { - margin-left: 32px; - margin-right: 32px; - max-width: none; } } - @media screen and (max-width: 1215px) { - html.theme--documenter-dark .container.is-widescreen { - max-width: 1152px; } } - @media screen and (max-width: 1407px) { - html.theme--documenter-dark .container.is-fullhd { - max-width: 1344px; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .container { - max-width: 1152px; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .container { - max-width: 1344px; } } - html.theme--documenter-dark .content li + li { - margin-top: 0.25em; } - html.theme--documenter-dark .content p:not(:last-child), - html.theme--documenter-dark .content dl:not(:last-child), - html.theme--documenter-dark .content ol:not(:last-child), - html.theme--documenter-dark .content ul:not(:last-child), - html.theme--documenter-dark .content blockquote:not(:last-child), - html.theme--documenter-dark .content pre:not(:last-child), - html.theme--documenter-dark .content table:not(:last-child) { - margin-bottom: 1em; } - html.theme--documenter-dark .content h1, - html.theme--documenter-dark .content h2, - html.theme--documenter-dark .content h3, - html.theme--documenter-dark .content h4, - html.theme--documenter-dark .content h5, - html.theme--documenter-dark .content h6 { - color: #f2f2f2; - font-weight: 600; - line-height: 1.125; } - html.theme--documenter-dark .content h1 { - font-size: 2em; - margin-bottom: 0.5em; } - html.theme--documenter-dark .content h1:not(:first-child) { - margin-top: 1em; } - html.theme--documenter-dark .content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; } - html.theme--documenter-dark .content h2:not(:first-child) { - margin-top: 1.1428em; } - html.theme--documenter-dark .content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; } - html.theme--documenter-dark .content h3:not(:first-child) { - margin-top: 1.3333em; } - html.theme--documenter-dark .content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; } - html.theme--documenter-dark .content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; } - html.theme--documenter-dark .content h6 { - font-size: 1em; - margin-bottom: 1em; } - html.theme--documenter-dark .content blockquote { - background-color: #282f2f; - border-left: 5px solid #5e6d6f; - padding: 1.25em 1.5em; } - html.theme--documenter-dark .content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; } - html.theme--documenter-dark .content ol:not([type]) { - list-style-type: decimal; } - html.theme--documenter-dark .content ol.is-lower-alpha:not([type]) { - list-style-type: lower-alpha; } - html.theme--documenter-dark .content ol.is-lower-roman:not([type]) { - list-style-type: lower-roman; } - html.theme--documenter-dark .content ol.is-upper-alpha:not([type]) { - list-style-type: upper-alpha; } - html.theme--documenter-dark .content ol.is-upper-roman:not([type]) { - list-style-type: upper-roman; } - html.theme--documenter-dark .content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; } - html.theme--documenter-dark .content ul ul { - list-style-type: circle; - margin-top: 0.5em; } - html.theme--documenter-dark .content ul ul ul { - list-style-type: square; } - html.theme--documenter-dark .content dd { - margin-left: 2em; } - html.theme--documenter-dark .content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; } - html.theme--documenter-dark .content figure:not(:first-child) { - margin-top: 2em; } - html.theme--documenter-dark .content figure:not(:last-child) { - margin-bottom: 2em; } - html.theme--documenter-dark .content figure img { - display: inline-block; } - html.theme--documenter-dark .content figure figcaption { - font-style: italic; } - html.theme--documenter-dark .content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 0; - white-space: pre; - word-wrap: normal; } - html.theme--documenter-dark .content sup, - html.theme--documenter-dark .content sub { - font-size: 75%; } - html.theme--documenter-dark .content table { - width: 100%; } - html.theme--documenter-dark .content table td, - html.theme--documenter-dark .content table th { - border: 1px solid #5e6d6f; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - html.theme--documenter-dark .content table th { - color: #f2f2f2; } - html.theme--documenter-dark .content table th:not([align]) { - text-align: left; } - html.theme--documenter-dark .content table thead td, - html.theme--documenter-dark .content table thead th { - border-width: 0 0 2px; - color: #f2f2f2; } - html.theme--documenter-dark .content table tfoot td, - html.theme--documenter-dark .content table tfoot th { - border-width: 2px 0 0; - color: #f2f2f2; } - html.theme--documenter-dark .content table tbody tr:last-child td, - html.theme--documenter-dark .content table tbody tr:last-child th { - border-bottom-width: 0; } - html.theme--documenter-dark .content .tabs li + li { - margin-top: 0; } - html.theme--documenter-dark .content.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.content { - font-size: 0.85em; } - html.theme--documenter-dark .content.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .content.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; } - html.theme--documenter-dark .icon.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.icon { - height: 1rem; - width: 1rem; } - html.theme--documenter-dark .icon.is-medium { - height: 2rem; - width: 2rem; } - html.theme--documenter-dark .icon.is-large { - height: 3rem; - width: 3rem; } - html.theme--documenter-dark .image, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { - display: block; - position: relative; } - html.theme--documenter-dark .image img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img { - display: block; - height: auto; - width: 100%; } - html.theme--documenter-dark .image img.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img.is-rounded { - border-radius: 290486px; } - html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, - html.theme--documenter-dark .image.is-square .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, - html.theme--documenter-dark .image.is-1by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, - html.theme--documenter-dark .image.is-5by4 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, - html.theme--documenter-dark .image.is-4by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, - html.theme--documenter-dark .image.is-3by2 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, - html.theme--documenter-dark .image.is-5by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, - html.theme--documenter-dark .image.is-16by9 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, - html.theme--documenter-dark .image.is-2by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, - html.theme--documenter-dark .image.is-3by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, - html.theme--documenter-dark .image.is-4by5 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, - html.theme--documenter-dark .image.is-3by4 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, - html.theme--documenter-dark .image.is-2by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, - html.theme--documenter-dark .image.is-3by5 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, - html.theme--documenter-dark .image.is-9by16 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, - html.theme--documenter-dark .image.is-1by2 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, - html.theme--documenter-dark .image.is-1by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { - height: 100%; - width: 100%; } - html.theme--documenter-dark .image.is-square, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square, html.theme--documenter-dark .image.is-1by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 { - padding-top: 100%; } - html.theme--documenter-dark .image.is-5by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 { - padding-top: 80%; } - html.theme--documenter-dark .image.is-4by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 { - padding-top: 75%; } - html.theme--documenter-dark .image.is-3by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 { - padding-top: 66.6666%; } - html.theme--documenter-dark .image.is-5by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 { - padding-top: 60%; } - html.theme--documenter-dark .image.is-16by9, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 { - padding-top: 56.25%; } - html.theme--documenter-dark .image.is-2by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 { - padding-top: 50%; } - html.theme--documenter-dark .image.is-3by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 { - padding-top: 33.3333%; } - html.theme--documenter-dark .image.is-4by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 { - padding-top: 125%; } - html.theme--documenter-dark .image.is-3by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 { - padding-top: 133.3333%; } - html.theme--documenter-dark .image.is-2by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 { - padding-top: 150%; } - html.theme--documenter-dark .image.is-3by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 { - padding-top: 166.6666%; } - html.theme--documenter-dark .image.is-9by16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 { - padding-top: 177.7777%; } - html.theme--documenter-dark .image.is-1by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 { - padding-top: 200%; } - html.theme--documenter-dark .image.is-1by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 { - padding-top: 300%; } - html.theme--documenter-dark .image.is-16x16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16x16 { - height: 16px; - width: 16px; } - html.theme--documenter-dark .image.is-24x24, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-24x24 { - height: 24px; - width: 24px; } - html.theme--documenter-dark .image.is-32x32, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-32x32 { - height: 32px; - width: 32px; } - html.theme--documenter-dark .image.is-48x48, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-48x48 { - height: 48px; - width: 48px; } - html.theme--documenter-dark .image.is-64x64, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-64x64 { - height: 64px; - width: 64px; } - html.theme--documenter-dark .image.is-96x96, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-96x96 { - height: 96px; - width: 96px; } - html.theme--documenter-dark .image.is-128x128, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-128x128 { - height: 128px; - width: 128px; } - html.theme--documenter-dark .notification { - background-color: #282f2f; - border-radius: 0.4em; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; } - html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - html.theme--documenter-dark .notification strong { - color: currentColor; } - html.theme--documenter-dark .notification code, - html.theme--documenter-dark .notification pre { - background: white; } - html.theme--documenter-dark .notification pre code { - background: transparent; } - html.theme--documenter-dark .notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; } - html.theme--documenter-dark .notification .title, - html.theme--documenter-dark .notification .subtitle, - html.theme--documenter-dark .notification .content { - color: currentColor; } - html.theme--documenter-dark .notification.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .notification.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .notification.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .notification.is-dark, html.theme--documenter-dark .content kbd.notification { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .notification.is-primary, html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .notification.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .notification.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .notification.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .notification.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .notification.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 15px; - overflow: hidden; - padding: 0; - width: 100%; } - html.theme--documenter-dark .progress::-webkit-progress-bar { - background-color: #5e6d6f; } - html.theme--documenter-dark .progress::-webkit-progress-value { - background-color: #dbdee0; } - html.theme--documenter-dark .progress::-moz-progress-bar { - background-color: #dbdee0; } - html.theme--documenter-dark .progress::-ms-fill { - background-color: #dbdee0; - border: none; } - html.theme--documenter-dark .progress.is-white::-webkit-progress-value { - background-color: white; } - html.theme--documenter-dark .progress.is-white::-moz-progress-bar { - background-color: white; } - html.theme--documenter-dark .progress.is-white::-ms-fill { - background-color: white; } - html.theme--documenter-dark .progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black::-ms-fill { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-light::-webkit-progress-value { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light::-moz-progress-bar { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light::-ms-fill { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light:indeterminate { - background-image: linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-dark::-webkit-progress-value, html.theme--documenter-dark .content kbd.progress::-webkit-progress-value { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark::-moz-progress-bar, html.theme--documenter-dark .content kbd.progress::-moz-progress-bar { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark::-ms-fill, html.theme--documenter-dark .content kbd.progress::-ms-fill { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark:indeterminate, html.theme--documenter-dark .content kbd.progress:indeterminate { - background-image: linear-gradient(to right, #282f2f 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-primary::-webkit-progress-value, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary::-moz-progress-bar, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary::-ms-fill, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-ms-fill { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary:indeterminate, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink:indeterminate { - background-image: linear-gradient(to right, #375a7f 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-link::-webkit-progress-value { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link::-moz-progress-bar { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link::-ms-fill { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link:indeterminate { - background-image: linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-info::-webkit-progress-value { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info::-moz-progress-bar { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info::-ms-fill { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info:indeterminate { - background-image: linear-gradient(to right, #024c7d 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-success::-webkit-progress-value { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success::-moz-progress-bar { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success::-ms-fill { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success:indeterminate { - background-image: linear-gradient(to right, #008438 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-warning::-webkit-progress-value { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning::-moz-progress-bar { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning::-ms-fill { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ad8100 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-danger::-webkit-progress-value { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger::-moz-progress-bar { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger::-ms-fill { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress:indeterminate { - animation-duration: 1.5s; - animation-iteration-count: infinite; - animation-name: moveIndeterminate; - animation-timing-function: linear; - background-color: #5e6d6f; - background-image: linear-gradient(to right, #fff 30%, #5e6d6f 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; } - html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar { - background-color: transparent; } - html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar { - background-color: transparent; } - html.theme--documenter-dark .progress.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.progress { - height: 0.85em; } - html.theme--documenter-dark .progress.is-medium { - height: 1.25rem; } - html.theme--documenter-dark .progress.is-large { - height: 1.5rem; } - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; } - to { - background-position: -200% 0; } } - html.theme--documenter-dark .table { - background-color: #343c3d; - color: #fff; } - html.theme--documenter-dark .table td, - html.theme--documenter-dark .table th { - border: 1px solid #5e6d6f; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - html.theme--documenter-dark .table td.is-white, - html.theme--documenter-dark .table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .table td.is-black, - html.theme--documenter-dark .table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .table td.is-light, - html.theme--documenter-dark .table th.is-light { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .table td.is-dark, - html.theme--documenter-dark .table th.is-dark { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .table td.is-primary, - html.theme--documenter-dark .table th.is-primary { - background-color: #375a7f; - border-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table td.is-link, - html.theme--documenter-dark .table th.is-link { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .table td.is-info, - html.theme--documenter-dark .table th.is-info { - background-color: #024c7d; - border-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .table td.is-success, - html.theme--documenter-dark .table th.is-success { - background-color: #008438; - border-color: #008438; - color: #fff; } - html.theme--documenter-dark .table td.is-warning, - html.theme--documenter-dark .table th.is-warning { - background-color: #ad8100; - border-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .table td.is-danger, - html.theme--documenter-dark .table th.is-danger { - background-color: #9e1b0d; - border-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .table td.is-narrow, - html.theme--documenter-dark .table th.is-narrow { - white-space: nowrap; - width: 1%; } - html.theme--documenter-dark .table td.is-selected, - html.theme--documenter-dark .table th.is-selected { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table td.is-selected a, - html.theme--documenter-dark .table td.is-selected strong, - html.theme--documenter-dark .table th.is-selected a, - html.theme--documenter-dark .table th.is-selected strong { - color: currentColor; } - html.theme--documenter-dark .table th { - color: #f2f2f2; } - html.theme--documenter-dark .table th:not([align]) { - text-align: left; } - html.theme--documenter-dark .table tr.is-selected { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table tr.is-selected a, - html.theme--documenter-dark .table tr.is-selected strong { - color: currentColor; } - html.theme--documenter-dark .table tr.is-selected td, - html.theme--documenter-dark .table tr.is-selected th { - border-color: #fff; - color: currentColor; } - html.theme--documenter-dark .table thead { - background-color: transparent; } - html.theme--documenter-dark .table thead td, - html.theme--documenter-dark .table thead th { - border-width: 0 0 2px; - color: #f2f2f2; } - html.theme--documenter-dark .table tfoot { - background-color: transparent; } - html.theme--documenter-dark .table tfoot td, - html.theme--documenter-dark .table tfoot th { - border-width: 2px 0 0; - color: #f2f2f2; } - html.theme--documenter-dark .table tbody { - background-color: transparent; } - html.theme--documenter-dark .table tbody tr:last-child td, - html.theme--documenter-dark .table tbody tr:last-child th { - border-bottom-width: 0; } - html.theme--documenter-dark .table.is-bordered td, - html.theme--documenter-dark .table.is-bordered th { - border-width: 1px; } - html.theme--documenter-dark .table.is-bordered tr:last-child td, - html.theme--documenter-dark .table.is-bordered tr:last-child th { - border-bottom-width: 1px; } - html.theme--documenter-dark .table.is-fullwidth { - width: 100%; } - html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #282f2f; } - html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #282f2f; } - html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: #2d3435; } - html.theme--documenter-dark .table.is-narrow td, - html.theme--documenter-dark .table.is-narrow th { - padding: 0.25em 0.5em; } - html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #282f2f; } - html.theme--documenter-dark .table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; } - html.theme--documenter-dark .tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .tags .tag, html.theme--documenter-dark .tags .content kbd, html.theme--documenter-dark .content .tags kbd, html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .tags .tag:not(:last-child), html.theme--documenter-dark .tags .content kbd:not(:last-child), html.theme--documenter-dark .content .tags kbd:not(:last-child), html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0.5rem; } - html.theme--documenter-dark .tags:last-child { - margin-bottom: -0.5rem; } - html.theme--documenter-dark .tags:not(:last-child) { - margin-bottom: 1rem; } - html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { - font-size: 15px; } - html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; } - html.theme--documenter-dark .tags.is-centered { - justify-content: center; } - html.theme--documenter-dark .tags.is-centered .tag, html.theme--documenter-dark .tags.is-centered .content kbd, html.theme--documenter-dark .content .tags.is-centered kbd, html.theme--documenter-dark .tags.is-centered .docstring > section > a.docs-sourcelink { - margin-right: 0.25rem; - margin-left: 0.25rem; } - html.theme--documenter-dark .tags.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .tags.is-right .tag:not(:first-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0.5rem; } - html.theme--documenter-dark .tags.is-right .tag:not(:last-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0; } - html.theme--documenter-dark .tags.has-addons .tag, html.theme--documenter-dark .tags.has-addons .content kbd, html.theme--documenter-dark .content .tags.has-addons kbd, html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink { - margin-right: 0; } - html.theme--documenter-dark .tags.has-addons .tag:not(:first-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .tags.has-addons .tag:not(:last-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .tag:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { - align-items: center; - background-color: #282f2f; - border-radius: 0.4em; - color: #fff; - display: inline-flex; - font-size: 0.85em; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - html.theme--documenter-dark .tag:not(body) .delete, html.theme--documenter-dark .content kbd:not(body) .delete, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; } - html.theme--documenter-dark .tag.is-white:not(body), html.theme--documenter-dark .content kbd.is-white:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-white:not(body) { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .tag.is-black:not(body), html.theme--documenter-dark .content kbd.is-black:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-black:not(body) { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .tag.is-light:not(body), html.theme--documenter-dark .content kbd.is-light:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-light:not(body) { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .tag.is-dark:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-dark:not(body), html.theme--documenter-dark .content .docstring > section > kbd:not(body) { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .tag.is-primary:not(body), html.theme--documenter-dark .content kbd.is-primary:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .tag.is-link:not(body), html.theme--documenter-dark .content kbd.is-link:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-link:not(body) { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .tag.is-info:not(body), html.theme--documenter-dark .content kbd.is-info:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-info:not(body) { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .tag.is-success:not(body), html.theme--documenter-dark .content kbd.is-success:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-success:not(body) { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .tag.is-warning:not(body), html.theme--documenter-dark .content kbd.is-warning:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-warning:not(body) { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .tag.is-danger:not(body), html.theme--documenter-dark .content kbd.is-danger:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-danger:not(body) { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .tag.is-normal:not(body), html.theme--documenter-dark .content kbd.is-normal:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-normal:not(body) { - font-size: 0.85em; } - html.theme--documenter-dark .tag.is-medium:not(body), html.theme--documenter-dark .content kbd.is-medium:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-medium:not(body) { - font-size: 15px; } - html.theme--documenter-dark .tag.is-large:not(body), html.theme--documenter-dark .content kbd.is-large:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-large:not(body) { - font-size: 1.25rem; } - html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; } - html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; } - html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child, html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; } - html.theme--documenter-dark .tag.is-delete:not(body), html.theme--documenter-dark .content kbd.is-delete:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body) { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; } - html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { - height: 1px; - width: 50%; } - html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - height: 50%; - width: 1px; } - html.theme--documenter-dark .tag.is-delete:not(body):hover, html.theme--documenter-dark .content kbd.is-delete:not(body):hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, html.theme--documenter-dark .tag.is-delete:not(body):focus, html.theme--documenter-dark .content kbd.is-delete:not(body):focus, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { - background-color: #1d2122; } - html.theme--documenter-dark .tag.is-delete:not(body):active, html.theme--documenter-dark .content kbd.is-delete:not(body):active, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):active { - background-color: #111414; } - html.theme--documenter-dark .tag.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:not(body), html.theme--documenter-dark .content kbd.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-rounded:not(body) { - border-radius: 290486px; } - html.theme--documenter-dark a.tag:hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:hover { - text-decoration: underline; } - html.theme--documenter-dark .title, - html.theme--documenter-dark .subtitle { - word-break: break-word; } - html.theme--documenter-dark .title em, - html.theme--documenter-dark .title span, - html.theme--documenter-dark .subtitle em, - html.theme--documenter-dark .subtitle span { - font-weight: inherit; } - html.theme--documenter-dark .title sub, - html.theme--documenter-dark .subtitle sub { - font-size: 0.75em; } - html.theme--documenter-dark .title sup, - html.theme--documenter-dark .subtitle sup { - font-size: 0.75em; } - html.theme--documenter-dark .title .tag, html.theme--documenter-dark .title .content kbd, html.theme--documenter-dark .content .title kbd, html.theme--documenter-dark .title .docstring > section > a.docs-sourcelink, - html.theme--documenter-dark .subtitle .tag, - html.theme--documenter-dark .subtitle .content kbd, - html.theme--documenter-dark .content .subtitle kbd, - html.theme--documenter-dark .subtitle .docstring > section > a.docs-sourcelink { - vertical-align: middle; } - html.theme--documenter-dark .title { - color: #fff; - font-size: 2rem; - font-weight: 500; - line-height: 1.125; } - html.theme--documenter-dark .title strong { - color: inherit; - font-weight: inherit; } - html.theme--documenter-dark .title + .highlight { - margin-top: -0.75rem; } - html.theme--documenter-dark .title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; } - html.theme--documenter-dark .title.is-1 { - font-size: 3rem; } - html.theme--documenter-dark .title.is-2 { - font-size: 2.5rem; } - html.theme--documenter-dark .title.is-3 { - font-size: 2rem; } - html.theme--documenter-dark .title.is-4 { - font-size: 1.5rem; } - html.theme--documenter-dark .title.is-5 { - font-size: 1.25rem; } - html.theme--documenter-dark .title.is-6 { - font-size: 15px; } - html.theme--documenter-dark .title.is-7 { - font-size: 0.85em; } - html.theme--documenter-dark .subtitle { - color: #8c9b9d; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; } - html.theme--documenter-dark .subtitle strong { - color: #8c9b9d; - font-weight: 600; } - html.theme--documenter-dark .subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; } - html.theme--documenter-dark .subtitle.is-1 { - font-size: 3rem; } - html.theme--documenter-dark .subtitle.is-2 { - font-size: 2.5rem; } - html.theme--documenter-dark .subtitle.is-3 { - font-size: 2rem; } - html.theme--documenter-dark .subtitle.is-4 { - font-size: 1.5rem; } - html.theme--documenter-dark .subtitle.is-5 { - font-size: 1.25rem; } - html.theme--documenter-dark .subtitle.is-6 { - font-size: 15px; } - html.theme--documenter-dark .subtitle.is-7 { - font-size: 0.85em; } - html.theme--documenter-dark .heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; } - html.theme--documenter-dark .highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; } - html.theme--documenter-dark .highlight pre { - overflow: auto; - max-width: 100%; } - html.theme--documenter-dark .number { - align-items: center; - background-color: #282f2f; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; } - html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - background-color: #1f2424; - border-color: #5e6d6f; - border-radius: 0.4em; - color: #dbdee0; } - html.theme--documenter-dark .select select::-moz-placeholder, html.theme--documenter-dark .textarea::-moz-placeholder, html.theme--documenter-dark .input::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select::-webkit-input-placeholder, html.theme--documenter-dark .textarea::-webkit-input-placeholder, html.theme--documenter-dark .input::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:-moz-placeholder, html.theme--documenter-dark .textarea:-moz-placeholder, html.theme--documenter-dark .input:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:-ms-input-placeholder, html.theme--documenter-dark .textarea:-ms-input-placeholder, html.theme--documenter-dark .input:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:hover, html.theme--documenter-dark .textarea:hover, html.theme--documenter-dark .input:hover, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:hover, html.theme--documenter-dark .select select.is-hovered, html.theme--documenter-dark .is-hovered.textarea, html.theme--documenter-dark .is-hovered.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-hovered { - border-color: #8c9b9d; } - html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - border-color: #1abc9c; - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - background-color: #8c9b9d; - border-color: #282f2f; - box-shadow: none; - color: white; } - html.theme--documenter-dark .select select[disabled]::-moz-placeholder, html.theme--documenter-dark .textarea[disabled]::-moz-placeholder, html.theme--documenter-dark .input[disabled]::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]:-moz-placeholder, html.theme--documenter-dark .textarea[disabled]:-moz-placeholder, html.theme--documenter-dark .input[disabled]:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder, html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder, html.theme--documenter-dark .input[disabled]:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; } - html.theme--documenter-dark .textarea[readonly], html.theme--documenter-dark .input[readonly], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[readonly] { - box-shadow: none; } - html.theme--documenter-dark .is-white.textarea, html.theme--documenter-dark .is-white.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white { - border-color: white; } - html.theme--documenter-dark .is-white.textarea:focus, html.theme--documenter-dark .is-white.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:focus, html.theme--documenter-dark .is-white.is-focused.textarea, html.theme--documenter-dark .is-white.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-white.textarea:active, html.theme--documenter-dark .is-white.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:active, html.theme--documenter-dark .is-white.is-active.textarea, html.theme--documenter-dark .is-white.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .is-black.textarea, html.theme--documenter-dark .is-black.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black { - border-color: #0a0a0a; } - html.theme--documenter-dark .is-black.textarea:focus, html.theme--documenter-dark .is-black.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:focus, html.theme--documenter-dark .is-black.is-focused.textarea, html.theme--documenter-dark .is-black.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-black.textarea:active, html.theme--documenter-dark .is-black.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:active, html.theme--documenter-dark .is-black.is-active.textarea, html.theme--documenter-dark .is-black.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .is-light.textarea, html.theme--documenter-dark .is-light.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light { - border-color: #ecf0f1; } - html.theme--documenter-dark .is-light.textarea:focus, html.theme--documenter-dark .is-light.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:focus, html.theme--documenter-dark .is-light.is-focused.textarea, html.theme--documenter-dark .is-light.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-light.textarea:active, html.theme--documenter-dark .is-light.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:active, html.theme--documenter-dark .is-light.is-active.textarea, html.theme--documenter-dark .is-light.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .is-dark.textarea, html.theme--documenter-dark .content kbd.textarea, html.theme--documenter-dark .is-dark.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark, html.theme--documenter-dark .content kbd.input { - border-color: #282f2f; } - html.theme--documenter-dark .is-dark.textarea:focus, html.theme--documenter-dark .content kbd.textarea:focus, html.theme--documenter-dark .is-dark.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:focus, html.theme--documenter-dark .content kbd.input:focus, html.theme--documenter-dark .is-dark.is-focused.textarea, html.theme--documenter-dark .content kbd.is-focused.textarea, html.theme--documenter-dark .is-dark.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .content kbd.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-focused, html.theme--documenter-dark .is-dark.textarea:active, html.theme--documenter-dark .content kbd.textarea:active, html.theme--documenter-dark .is-dark.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:active, html.theme--documenter-dark .content kbd.input:active, html.theme--documenter-dark .is-dark.is-active.textarea, html.theme--documenter-dark .content kbd.is-active.textarea, html.theme--documenter-dark .is-dark.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .content kbd.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .is-primary.textarea, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink { - border-color: #375a7f; } - html.theme--documenter-dark .is-primary.textarea:focus, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:focus, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.is-focused.textarea, html.theme--documenter-dark .docstring > section > a.is-focused.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .docstring > section > a.is-focused.input.docs-sourcelink, html.theme--documenter-dark .is-primary.textarea:active, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:active, html.theme--documenter-dark .is-primary.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:active, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:active, html.theme--documenter-dark .is-primary.is-active.textarea, html.theme--documenter-dark .docstring > section > a.is-active.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .docstring > section > a.is-active.input.docs-sourcelink { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .is-link.textarea, html.theme--documenter-dark .is-link.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link { - border-color: #1abc9c; } - html.theme--documenter-dark .is-link.textarea:focus, html.theme--documenter-dark .is-link.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:focus, html.theme--documenter-dark .is-link.is-focused.textarea, html.theme--documenter-dark .is-link.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-link.textarea:active, html.theme--documenter-dark .is-link.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:active, html.theme--documenter-dark .is-link.is-active.textarea, html.theme--documenter-dark .is-link.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .is-info.textarea, html.theme--documenter-dark .is-info.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info { - border-color: #024c7d; } - html.theme--documenter-dark .is-info.textarea:focus, html.theme--documenter-dark .is-info.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:focus, html.theme--documenter-dark .is-info.is-focused.textarea, html.theme--documenter-dark .is-info.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-info.textarea:active, html.theme--documenter-dark .is-info.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:active, html.theme--documenter-dark .is-info.is-active.textarea, html.theme--documenter-dark .is-info.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .is-success.textarea, html.theme--documenter-dark .is-success.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success { - border-color: #008438; } - html.theme--documenter-dark .is-success.textarea:focus, html.theme--documenter-dark .is-success.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:focus, html.theme--documenter-dark .is-success.is-focused.textarea, html.theme--documenter-dark .is-success.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-success.textarea:active, html.theme--documenter-dark .is-success.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:active, html.theme--documenter-dark .is-success.is-active.textarea, html.theme--documenter-dark .is-success.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .is-warning.textarea, html.theme--documenter-dark .is-warning.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning { - border-color: #ad8100; } - html.theme--documenter-dark .is-warning.textarea:focus, html.theme--documenter-dark .is-warning.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:focus, html.theme--documenter-dark .is-warning.is-focused.textarea, html.theme--documenter-dark .is-warning.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-warning.textarea:active, html.theme--documenter-dark .is-warning.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:active, html.theme--documenter-dark .is-warning.is-active.textarea, html.theme--documenter-dark .is-warning.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .is-danger.textarea, html.theme--documenter-dark .is-danger.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger { - border-color: #9e1b0d; } - html.theme--documenter-dark .is-danger.textarea:focus, html.theme--documenter-dark .is-danger.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:focus, html.theme--documenter-dark .is-danger.is-focused.textarea, html.theme--documenter-dark .is-danger.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-danger.textarea:active, html.theme--documenter-dark .is-danger.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:active, html.theme--documenter-dark .is-danger.is-active.textarea, html.theme--documenter-dark .is-danger.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .is-small.textarea, html.theme--documenter-dark .is-small.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .is-medium.textarea, html.theme--documenter-dark .is-medium.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .is-large.textarea, html.theme--documenter-dark .is-large.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .is-fullwidth.textarea, html.theme--documenter-dark .is-fullwidth.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-fullwidth { - display: block; - width: 100%; } - html.theme--documenter-dark .is-inline.textarea, html.theme--documenter-dark .is-inline.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-inline { - display: inline; - width: auto; } - html.theme--documenter-dark .input.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .input.is-static, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; } - html.theme--documenter-dark .textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; } - html.theme--documenter-dark .textarea:not([rows]) { - max-height: 600px; - min-height: 120px; } - html.theme--documenter-dark .textarea[rows] { - height: initial; } - html.theme--documenter-dark .textarea.has-fixed-size { - resize: none; } - html.theme--documenter-dark .radio, html.theme--documenter-dark .checkbox { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; } - html.theme--documenter-dark .radio input, html.theme--documenter-dark .checkbox input { - cursor: pointer; } - html.theme--documenter-dark .radio:hover, html.theme--documenter-dark .checkbox:hover { - color: #8c9b9d; } - html.theme--documenter-dark .radio[disabled], html.theme--documenter-dark .checkbox[disabled], fieldset[disabled] html.theme--documenter-dark .radio, fieldset[disabled] html.theme--documenter-dark .checkbox { - color: white; - cursor: not-allowed; } - html.theme--documenter-dark .radio + .radio { - margin-left: 0.5em; } - html.theme--documenter-dark .select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; } - html.theme--documenter-dark .select:not(.is-multiple) { - height: 2.25em; } - html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { - border-color: #1abc9c; - right: 1.125em; - z-index: 4; } - html.theme--documenter-dark .select.is-rounded select, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select select { - border-radius: 290486px; - padding-left: 1em; } - html.theme--documenter-dark .select select { - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; } - html.theme--documenter-dark .select select::-ms-expand { - display: none; } - html.theme--documenter-dark .select select[disabled]:hover, fieldset[disabled] html.theme--documenter-dark .select select:hover { - border-color: #282f2f; } - html.theme--documenter-dark .select select:not([multiple]) { - padding-right: 2.5em; } - html.theme--documenter-dark .select select[multiple] { - height: auto; - padding: 0; } - html.theme--documenter-dark .select select[multiple] option { - padding: 0.5em 1em; } - html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #8c9b9d; } - html.theme--documenter-dark .select.is-white:not(:hover)::after { - border-color: white; } - html.theme--documenter-dark .select.is-white select { - border-color: white; } - html.theme--documenter-dark .select.is-white select:hover, html.theme--documenter-dark .select.is-white select.is-hovered { - border-color: #f2f2f2; } - html.theme--documenter-dark .select.is-white select:focus, html.theme--documenter-dark .select.is-white select.is-focused, html.theme--documenter-dark .select.is-white select:active, html.theme--documenter-dark .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .select.is-black:not(:hover)::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .select.is-black select { - border-color: #0a0a0a; } - html.theme--documenter-dark .select.is-black select:hover, html.theme--documenter-dark .select.is-black select.is-hovered { - border-color: black; } - html.theme--documenter-dark .select.is-black select:focus, html.theme--documenter-dark .select.is-black select.is-focused, html.theme--documenter-dark .select.is-black select:active, html.theme--documenter-dark .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .select.is-light:not(:hover)::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .select.is-light select { - border-color: #ecf0f1; } - html.theme--documenter-dark .select.is-light select:hover, html.theme--documenter-dark .select.is-light select.is-hovered { - border-color: #dde4e6; } - html.theme--documenter-dark .select.is-light select:focus, html.theme--documenter-dark .select.is-light select.is-focused, html.theme--documenter-dark .select.is-light select:active, html.theme--documenter-dark .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .select.is-dark:not(:hover)::after, html.theme--documenter-dark .content kbd.select:not(:hover)::after { - border-color: #282f2f; } - html.theme--documenter-dark .select.is-dark select, html.theme--documenter-dark .content kbd.select select { - border-color: #282f2f; } - html.theme--documenter-dark .select.is-dark select:hover, html.theme--documenter-dark .content kbd.select select:hover, html.theme--documenter-dark .select.is-dark select.is-hovered, html.theme--documenter-dark .content kbd.select select.is-hovered { - border-color: #1d2122; } - html.theme--documenter-dark .select.is-dark select:focus, html.theme--documenter-dark .content kbd.select select:focus, html.theme--documenter-dark .select.is-dark select.is-focused, html.theme--documenter-dark .content kbd.select select.is-focused, html.theme--documenter-dark .select.is-dark select:active, html.theme--documenter-dark .content kbd.select select:active, html.theme--documenter-dark .select.is-dark select.is-active, html.theme--documenter-dark .content kbd.select select.is-active { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .select.is-primary:not(:hover)::after, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink:not(:hover)::after { - border-color: #375a7f; } - html.theme--documenter-dark .select.is-primary select, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select { - border-color: #375a7f; } - html.theme--documenter-dark .select.is-primary select:hover, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:hover, html.theme--documenter-dark .select.is-primary select.is-hovered, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-hovered { - border-color: #2f4d6d; } - html.theme--documenter-dark .select.is-primary select:focus, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:focus, html.theme--documenter-dark .select.is-primary select.is-focused, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-focused, html.theme--documenter-dark .select.is-primary select:active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:active, html.theme--documenter-dark .select.is-primary select.is-active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-active { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .select.is-link:not(:hover)::after { - border-color: #1abc9c; } - html.theme--documenter-dark .select.is-link select { - border-color: #1abc9c; } - html.theme--documenter-dark .select.is-link select:hover, html.theme--documenter-dark .select.is-link select.is-hovered { - border-color: #17a689; } - html.theme--documenter-dark .select.is-link select:focus, html.theme--documenter-dark .select.is-link select.is-focused, html.theme--documenter-dark .select.is-link select:active, html.theme--documenter-dark .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .select.is-info:not(:hover)::after { - border-color: #024c7d; } - html.theme--documenter-dark .select.is-info select { - border-color: #024c7d; } - html.theme--documenter-dark .select.is-info select:hover, html.theme--documenter-dark .select.is-info select.is-hovered { - border-color: #023d64; } - html.theme--documenter-dark .select.is-info select:focus, html.theme--documenter-dark .select.is-info select.is-focused, html.theme--documenter-dark .select.is-info select:active, html.theme--documenter-dark .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .select.is-success:not(:hover)::after { - border-color: #008438; } - html.theme--documenter-dark .select.is-success select { - border-color: #008438; } - html.theme--documenter-dark .select.is-success select:hover, html.theme--documenter-dark .select.is-success select.is-hovered { - border-color: #006b2d; } - html.theme--documenter-dark .select.is-success select:focus, html.theme--documenter-dark .select.is-success select.is-focused, html.theme--documenter-dark .select.is-success select:active, html.theme--documenter-dark .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .select.is-warning:not(:hover)::after { - border-color: #ad8100; } - html.theme--documenter-dark .select.is-warning select { - border-color: #ad8100; } - html.theme--documenter-dark .select.is-warning select:hover, html.theme--documenter-dark .select.is-warning select.is-hovered { - border-color: #946e00; } - html.theme--documenter-dark .select.is-warning select:focus, html.theme--documenter-dark .select.is-warning select.is-focused, html.theme--documenter-dark .select.is-warning select:active, html.theme--documenter-dark .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .select.is-danger:not(:hover)::after { - border-color: #9e1b0d; } - html.theme--documenter-dark .select.is-danger select { - border-color: #9e1b0d; } - html.theme--documenter-dark .select.is-danger select:hover, html.theme--documenter-dark .select.is-danger select.is-hovered { - border-color: #86170b; } - html.theme--documenter-dark .select.is-danger select:focus, html.theme--documenter-dark .select.is-danger select.is-focused, html.theme--documenter-dark .select.is-danger select:active, html.theme--documenter-dark .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .select.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .select.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .select.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .select.is-disabled::after { - border-color: white; } - html.theme--documenter-dark .select.is-fullwidth { - width: 100%; } - html.theme--documenter-dark .select.is-fullwidth select { - width: 100%; } - html.theme--documenter-dark .select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - transform: none; } - html.theme--documenter-dark .select.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.85em; } - html.theme--documenter-dark .select.is-loading.is-medium:after { - font-size: 1.25rem; } - html.theme--documenter-dark .select.is-loading.is-large:after { - font-size: 1.5rem; } - html.theme--documenter-dark .file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; } - html.theme--documenter-dark .file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:hover .file-cta, html.theme--documenter-dark .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:focus .file-cta, html.theme--documenter-dark .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:active .file-cta, html.theme--documenter-dark .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-black:hover .file-cta, html.theme--documenter-dark .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-black:focus .file-cta, html.theme--documenter-dark .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; } - html.theme--documenter-dark .file.is-black:active .file-cta, html.theme--documenter-dark .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-light .file-cta { - background-color: #ecf0f1; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-light:hover .file-cta, html.theme--documenter-dark .file.is-light.is-hovered .file-cta { - background-color: #e5eaec; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-light:focus .file-cta, html.theme--documenter-dark .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(236, 240, 241, 0.25); - color: #282f2f; } - html.theme--documenter-dark .file.is-light:active .file-cta, html.theme--documenter-dark .file.is-light.is-active .file-cta { - background-color: #dde4e6; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-dark .file-cta, html.theme--documenter-dark .content kbd.file .file-cta { - background-color: #282f2f; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:hover .file-cta, html.theme--documenter-dark .content kbd.file:hover .file-cta, html.theme--documenter-dark .file.is-dark.is-hovered .file-cta, html.theme--documenter-dark .content kbd.file.is-hovered .file-cta { - background-color: #232829; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:focus .file-cta, html.theme--documenter-dark .content kbd.file:focus .file-cta, html.theme--documenter-dark .file.is-dark.is-focused .file-cta, html.theme--documenter-dark .content kbd.file.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(40, 47, 47, 0.25); - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:active .file-cta, html.theme--documenter-dark .content kbd.file:active .file-cta, html.theme--documenter-dark .file.is-dark.is-active .file-cta, html.theme--documenter-dark .content kbd.file.is-active .file-cta { - background-color: #1d2122; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-primary .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink .file-cta { - background-color: #375a7f; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-primary:hover .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:hover .file-cta, html.theme--documenter-dark .file.is-primary.is-hovered .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { - background-color: #335476; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-primary:focus .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:focus .file-cta, html.theme--documenter-dark .file.is-primary.is-focused .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(55, 90, 127, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-primary:active .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:active .file-cta, html.theme--documenter-dark .file.is-primary.is-active .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-active.docs-sourcelink .file-cta { - background-color: #2f4d6d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link .file-cta { - background-color: #1abc9c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link:hover .file-cta, html.theme--documenter-dark .file.is-link.is-hovered .file-cta { - background-color: #18b193; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link:focus .file-cta, html.theme--documenter-dark .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(26, 188, 156, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-link:active .file-cta, html.theme--documenter-dark .file.is-link.is-active .file-cta { - background-color: #17a689; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info .file-cta { - background-color: #024c7d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info:hover .file-cta, html.theme--documenter-dark .file.is-info.is-hovered .file-cta { - background-color: #024470; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info:focus .file-cta, html.theme--documenter-dark .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(2, 76, 125, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-info:active .file-cta, html.theme--documenter-dark .file.is-info.is-active .file-cta { - background-color: #023d64; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success .file-cta { - background-color: #008438; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success:hover .file-cta, html.theme--documenter-dark .file.is-success.is-hovered .file-cta { - background-color: #007733; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success:focus .file-cta, html.theme--documenter-dark .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(0, 132, 56, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-success:active .file-cta, html.theme--documenter-dark .file.is-success.is-active .file-cta { - background-color: #006b2d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning .file-cta { - background-color: #ad8100; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning:hover .file-cta, html.theme--documenter-dark .file.is-warning.is-hovered .file-cta { - background-color: #a07700; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning:focus .file-cta, html.theme--documenter-dark .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(173, 129, 0, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-warning:active .file-cta, html.theme--documenter-dark .file.is-warning.is-active .file-cta { - background-color: #946e00; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger .file-cta { - background-color: #9e1b0d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger:hover .file-cta, html.theme--documenter-dark .file.is-danger.is-hovered .file-cta { - background-color: #92190c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger:focus .file-cta, html.theme--documenter-dark .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(158, 27, 13, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-danger:active .file-cta, html.theme--documenter-dark .file.is-danger.is-active .file-cta { - background-color: #86170b; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.file { - font-size: 0.85em; } - html.theme--documenter-dark .file.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .file.is-medium .file-icon .fa { - font-size: 21px; } - html.theme--documenter-dark .file.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .file.is-large .file-icon .fa { - font-size: 28px; } - html.theme--documenter-dark .file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .file.has-name.is-empty .file-cta { - border-radius: 0.4em; } - html.theme--documenter-dark .file.has-name.is-empty .file-name { - display: none; } - html.theme--documenter-dark .file.is-boxed .file-label { - flex-direction: column; } - html.theme--documenter-dark .file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; } - html.theme--documenter-dark .file.is-boxed .file-name { - border-width: 0 1px 1px; } - html.theme--documenter-dark .file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; } - html.theme--documenter-dark .file.is-boxed .file-icon .fa { - font-size: 21px; } - html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { - font-size: 14px; } - html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; } - html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa { - font-size: 35px; } - html.theme--documenter-dark .file.is-boxed.has-name .file-cta { - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .file.is-boxed.has-name .file-name { - border-radius: 0 0 0.4em 0.4em; - border-width: 0 1px 1px; } - html.theme--documenter-dark .file.is-centered { - justify-content: center; } - html.theme--documenter-dark .file.is-fullwidth .file-label { - width: 100%; } - html.theme--documenter-dark .file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; } - html.theme--documenter-dark .file.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .file.is-right .file-cta { - border-radius: 0 0.4em 0.4em 0; } - html.theme--documenter-dark .file.is-right .file-name { - border-radius: 0.4em 0 0 0.4em; - border-width: 1px 0 1px 1px; - order: -1; } - html.theme--documenter-dark .file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; } - html.theme--documenter-dark .file-label:hover .file-cta { - background-color: #e5eaec; - color: #282f2f; } - html.theme--documenter-dark .file-label:hover .file-name { - border-color: #596668; } - html.theme--documenter-dark .file-label:active .file-cta { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .file-label:active .file-name { - border-color: #535f61; } - html.theme--documenter-dark .file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; } - html.theme--documenter-dark .file-cta, - html.theme--documenter-dark .file-name { - border-color: #5e6d6f; - border-radius: 0.4em; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; } - html.theme--documenter-dark .file-cta { - background-color: #ecf0f1; - color: #343c3d; } - html.theme--documenter-dark .file-name { - border-color: #5e6d6f; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; } - html.theme--documenter-dark .file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; } - html.theme--documenter-dark .file-icon .fa { - font-size: 14px; } - html.theme--documenter-dark .label { - color: #282f2f; - display: block; - font-size: 15px; - font-weight: 700; } - html.theme--documenter-dark .label:not(:last-child) { - margin-bottom: 0.5em; } - html.theme--documenter-dark .label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.label { - font-size: 0.85em; } - html.theme--documenter-dark .label.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .label.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .help { - display: block; - font-size: 0.85em; - margin-top: 0.25rem; } - html.theme--documenter-dark .help.is-white { - color: white; } - html.theme--documenter-dark .help.is-black { - color: #0a0a0a; } - html.theme--documenter-dark .help.is-light { - color: #ecf0f1; } - html.theme--documenter-dark .help.is-dark, html.theme--documenter-dark .content kbd.help { - color: #282f2f; } - html.theme--documenter-dark .help.is-primary, html.theme--documenter-dark .docstring > section > a.help.docs-sourcelink { - color: #375a7f; } - html.theme--documenter-dark .help.is-link { - color: #1abc9c; } - html.theme--documenter-dark .help.is-info { - color: #024c7d; } - html.theme--documenter-dark .help.is-success { - color: #008438; } - html.theme--documenter-dark .help.is-warning { - color: #ad8100; } - html.theme--documenter-dark .help.is-danger { - color: #9e1b0d; } - html.theme--documenter-dark .field:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .field.has-addons { - display: flex; - justify-content: flex-start; } - html.theme--documenter-dark .field.has-addons .control:not(:last-child) { - margin-right: -1px; } - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; } - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]) { - z-index: 2; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]), html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]) { - z-index: 3; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover { - z-index: 4; } - html.theme--documenter-dark .field.has-addons .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .field.has-addons.has-addons-centered { - justify-content: center; } - html.theme--documenter-dark .field.has-addons.has-addons-right { - justify-content: flex-end; } - html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .field.is-grouped { - display: flex; - justify-content: flex-start; } - html.theme--documenter-dark .field.is-grouped > .control { - flex-shrink: 0; } - html.theme--documenter-dark .field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - html.theme--documenter-dark .field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .field.is-grouped.is-grouped-centered { - justify-content: center; } - html.theme--documenter-dark .field.is-grouped.is-grouped-right { - justify-content: flex-end; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:last-child, html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field.is-horizontal { - display: flex; } } - html.theme--documenter-dark .field-label .label { - font-size: inherit; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .field-label { - margin-bottom: 0.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; } - html.theme--documenter-dark .field-label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.field-label { - font-size: 0.85em; - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-normal { - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; } } - html.theme--documenter-dark .field-body .field .field { - margin-bottom: 0; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; } - html.theme--documenter-dark .field-body .field { - margin-bottom: 0; } - html.theme--documenter-dark .field-body > .field { - flex-shrink: 1; } - html.theme--documenter-dark .field-body > .field:not(.is-narrow) { - flex-grow: 1; } - html.theme--documenter-dark .field-body > .field:not(:last-child) { - margin-right: 0.75rem; } } - html.theme--documenter-dark .control { - box-sizing: border-box; - clear: both; - font-size: 15px; - position: relative; - text-align: left; } - html.theme--documenter-dark .control.has-icons-left .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select:focus ~ .icon { - color: #5e6d6f; } - html.theme--documenter-dark .control.has-icons-left .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-small ~ .icon { - font-size: 0.85em; } - html.theme--documenter-dark .control.has-icons-left .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; } - html.theme--documenter-dark .control.has-icons-left .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; } - html.theme--documenter-dark .control.has-icons-left .icon, html.theme--documenter-dark .control.has-icons-right .icon { - color: #dbdee0; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; } - html.theme--documenter-dark .control.has-icons-left .input, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, - html.theme--documenter-dark .control.has-icons-left .select select { - padding-left: 2.25em; } - html.theme--documenter-dark .control.has-icons-left .icon.is-left { - left: 0; } - html.theme--documenter-dark .control.has-icons-right .input, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, - html.theme--documenter-dark .control.has-icons-right .select select { - padding-right: 2.25em; } - html.theme--documenter-dark .control.has-icons-right .icon.is-right { - right: 0; } - html.theme--documenter-dark .control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; } - html.theme--documenter-dark .control.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.85em; } - html.theme--documenter-dark .control.is-loading.is-medium:after { - font-size: 1.25rem; } - html.theme--documenter-dark .control.is-loading.is-large:after { - font-size: 1.5rem; } - html.theme--documenter-dark .breadcrumb { - font-size: 15px; - white-space: nowrap; } - html.theme--documenter-dark .breadcrumb a { - align-items: center; - color: #1abc9c; - display: flex; - justify-content: center; - padding: 0 0.75em; } - html.theme--documenter-dark .breadcrumb a:hover { - color: #1dd2af; } - html.theme--documenter-dark .breadcrumb li { - align-items: center; - display: flex; } - html.theme--documenter-dark .breadcrumb li:first-child a { - padding-left: 0; } - html.theme--documenter-dark .breadcrumb li.is-active a { - color: #f2f2f2; - cursor: default; - pointer-events: none; } - html.theme--documenter-dark .breadcrumb li + li::before { - color: #8c9b9d; - content: "\0002f"; } - html.theme--documenter-dark .breadcrumb ul, - html.theme--documenter-dark .breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .breadcrumb .icon:first-child { - margin-right: 0.5em; } - html.theme--documenter-dark .breadcrumb .icon:last-child { - margin-left: 0.5em; } - html.theme--documenter-dark .breadcrumb.is-centered ol, - html.theme--documenter-dark .breadcrumb.is-centered ul { - justify-content: center; } - html.theme--documenter-dark .breadcrumb.is-right ol, - html.theme--documenter-dark .breadcrumb.is-right ul { - justify-content: flex-end; } - html.theme--documenter-dark .breadcrumb.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.breadcrumb { - font-size: 0.85em; } - html.theme--documenter-dark .breadcrumb.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .breadcrumb.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; } - html.theme--documenter-dark .breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; } - html.theme--documenter-dark .breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; } - html.theme--documenter-dark .breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; } - html.theme--documenter-dark .card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #fff; - max-width: 100%; - position: relative; } - html.theme--documenter-dark .card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; } - html.theme--documenter-dark .card-header-title { - align-items: center; - color: #f2f2f2; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; } - html.theme--documenter-dark .card-header-title.is-centered { - justify-content: center; } - html.theme--documenter-dark .card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; } - html.theme--documenter-dark .card-image { - display: block; - position: relative; } - html.theme--documenter-dark .card-content { - background-color: transparent; - padding: 1.5rem; } - html.theme--documenter-dark .card-footer { - background-color: transparent; - border-top: 1px solid #5e6d6f; - align-items: stretch; - display: flex; } - html.theme--documenter-dark .card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; } - html.theme--documenter-dark .card-footer-item:not(:last-child) { - border-right: 1px solid #5e6d6f; } - html.theme--documenter-dark .card .media:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .dropdown { - display: inline-flex; - position: relative; - vertical-align: top; } - html.theme--documenter-dark .dropdown.is-active .dropdown-menu, html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu { - display: block; } - html.theme--documenter-dark .dropdown.is-right .dropdown-menu { - left: auto; - right: 0; } - html.theme--documenter-dark .dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; } - html.theme--documenter-dark .dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; } - html.theme--documenter-dark .dropdown-content { - background-color: #282f2f; - border-radius: 0.4em; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - html.theme--documenter-dark .dropdown-item { - color: #fff; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; } - html.theme--documenter-dark a.dropdown-item, - html.theme--documenter-dark button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; } - html.theme--documenter-dark a.dropdown-item:hover, - html.theme--documenter-dark button.dropdown-item:hover { - background-color: #282f2f; - color: #0a0a0a; } - html.theme--documenter-dark a.dropdown-item.is-active, - html.theme--documenter-dark button.dropdown-item.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .dropdown-divider { - background-color: #5e6d6f; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; } - html.theme--documenter-dark .level { - align-items: center; - justify-content: space-between; } - html.theme--documenter-dark .level code { - border-radius: 0.4em; } - html.theme--documenter-dark .level img { - display: inline-block; - vertical-align: top; } - html.theme--documenter-dark .level.is-mobile { - display: flex; } - html.theme--documenter-dark .level.is-mobile .level-left, - html.theme--documenter-dark .level.is-mobile .level-right { - display: flex; } - html.theme--documenter-dark .level.is-mobile .level-left + .level-right { - margin-top: 0; } - html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level { - display: flex; } - html.theme--documenter-dark .level > .level-item:not(.is-narrow) { - flex-grow: 1; } } - html.theme--documenter-dark .level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; } - html.theme--documenter-dark .level-item .title, - html.theme--documenter-dark .level-item .subtitle { - margin-bottom: 0; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .level-item:not(:last-child) { - margin-bottom: 0.75rem; } } - html.theme--documenter-dark .level-left, - html.theme--documenter-dark .level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .level-left .level-item.is-flexible, - html.theme--documenter-dark .level-right .level-item.is-flexible { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-left .level-item:not(:last-child), - html.theme--documenter-dark .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; } } - html.theme--documenter-dark .level-left { - align-items: center; - justify-content: flex-start; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .level-left + .level-right { - margin-top: 1.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-left { - display: flex; } } - html.theme--documenter-dark .level-right { - align-items: center; - justify-content: flex-end; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-right { - display: flex; } } - html.theme--documenter-dark .list { - background-color: white; - border-radius: 0.4em; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .list-item { - display: block; - padding: 0.5em 1em; } - html.theme--documenter-dark .list-item:not(a) { - color: #fff; } - html.theme--documenter-dark .list-item:first-child { - border-top-left-radius: 0.4em; - border-top-right-radius: 0.4em; } - html.theme--documenter-dark .list-item:last-child { - border-bottom-left-radius: 0.4em; - border-bottom-right-radius: 0.4em; } - html.theme--documenter-dark .list-item:not(:last-child) { - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .list-item.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark a.list-item { - background-color: #282f2f; - cursor: pointer; } - html.theme--documenter-dark .media { - align-items: flex-start; - display: flex; - text-align: left; } - html.theme--documenter-dark .media .content:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .media .media { - border-top: 1px solid rgba(94, 109, 111, 0.5); - display: flex; - padding-top: 0.75rem; } - html.theme--documenter-dark .media .media .content:not(:last-child), - html.theme--documenter-dark .media .media .control:not(:last-child) { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .media .media .media { - padding-top: 0.5rem; } - html.theme--documenter-dark .media .media .media + .media { - margin-top: 0.5rem; } - html.theme--documenter-dark .media + .media { - border-top: 1px solid rgba(94, 109, 111, 0.5); - margin-top: 1rem; - padding-top: 1rem; } - html.theme--documenter-dark .media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; } - html.theme--documenter-dark .media-left, - html.theme--documenter-dark .media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .media-left { - margin-right: 1rem; } - html.theme--documenter-dark .media-right { - margin-left: 1rem; } - html.theme--documenter-dark .media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .media-content { - overflow-x: auto; } } - html.theme--documenter-dark .menu { - font-size: 15px; } - html.theme--documenter-dark .menu.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.menu { - font-size: 0.85em; } - html.theme--documenter-dark .menu.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .menu.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .menu-list { - line-height: 1.25; } - html.theme--documenter-dark .menu-list a { - border-radius: 3px; - color: #fff; - display: block; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .menu-list a:hover { - background-color: #282f2f; - color: #f2f2f2; } - html.theme--documenter-dark .menu-list a.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .menu-list li ul { - border-left: 1px solid #5e6d6f; - margin: 0.75em; - padding-left: 0.75em; } - html.theme--documenter-dark .menu-label { - color: white; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; } - html.theme--documenter-dark .menu-label:not(:first-child) { - margin-top: 1em; } - html.theme--documenter-dark .menu-label:not(:last-child) { - margin-bottom: 1em; } - html.theme--documenter-dark .message { - background-color: #282f2f; - border-radius: 0.4em; - font-size: 15px; } - html.theme--documenter-dark .message strong { - color: currentColor; } - html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - html.theme--documenter-dark .message.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.message { - font-size: 0.85em; } - html.theme--documenter-dark .message.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .message.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .message.is-white { - background-color: white; } - html.theme--documenter-dark .message.is-white .message-header { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .message.is-white .message-body { - border-color: white; - color: #4d4d4d; } - html.theme--documenter-dark .message.is-black { - background-color: #fafafa; } - html.theme--documenter-dark .message.is-black .message-header { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; } - html.theme--documenter-dark .message.is-light { - background-color: #f9fafb; } - html.theme--documenter-dark .message.is-light .message-header { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .message.is-light .message-body { - border-color: #ecf0f1; - color: #505050; } - html.theme--documenter-dark .message.is-dark, html.theme--documenter-dark .content kbd.message { - background-color: #f9fafa; } - html.theme--documenter-dark .message.is-dark .message-header, html.theme--documenter-dark .content kbd.message .message-header { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .message.is-dark .message-body, html.theme--documenter-dark .content kbd.message .message-body { - border-color: #282f2f; - color: #212526; } - html.theme--documenter-dark .message.is-primary, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink { - background-color: #f8fafc; } - html.theme--documenter-dark .message.is-primary .message-header, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-header { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .message.is-primary .message-body, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-body { - border-color: #375a7f; - color: #2b4159; } - html.theme--documenter-dark .message.is-link { - background-color: #f6fefc; } - html.theme--documenter-dark .message.is-link .message-header { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .message.is-link .message-body { - border-color: #1abc9c; - color: #0b2f28; } - html.theme--documenter-dark .message.is-info { - background-color: #f5fbff; } - html.theme--documenter-dark .message.is-info .message-header { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .message.is-info .message-body { - border-color: #024c7d; - color: #033659; } - html.theme--documenter-dark .message.is-success { - background-color: #f5fff9; } - html.theme--documenter-dark .message.is-success .message-header { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .message.is-success .message-body { - border-color: #008438; - color: #023518; } - html.theme--documenter-dark .message.is-warning { - background-color: #fffcf5; } - html.theme--documenter-dark .message.is-warning .message-header { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .message.is-warning .message-body { - border-color: #ad8100; - color: #3d2e03; } - html.theme--documenter-dark .message.is-danger { - background-color: #fef6f6; } - html.theme--documenter-dark .message.is-danger .message-header { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .message.is-danger .message-body { - border-color: #9e1b0d; - color: #7a170c; } - html.theme--documenter-dark .message-header { - align-items: center; - background-color: #fff; - border-radius: 0.4em 0.4em 0 0; - color: rgba(0, 0, 0, 0.7); - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; } - html.theme--documenter-dark .message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; } - html.theme--documenter-dark .message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .message-body { - border-color: #5e6d6f; - border-radius: 0.4em; - border-style: solid; - border-width: 0 0 0 4px; - color: #fff; - padding: 1.25em 1.5em; } - html.theme--documenter-dark .message-body code, - html.theme--documenter-dark .message-body pre { - background-color: white; } - html.theme--documenter-dark .message-body pre code { - background-color: transparent; } - html.theme--documenter-dark .modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; } - html.theme--documenter-dark .modal.is-active { - display: flex; } - html.theme--documenter-dark .modal-background { - background-color: rgba(10, 10, 10, 0.86); } - html.theme--documenter-dark .modal-content, - html.theme--documenter-dark .modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .modal-content, - html.theme--documenter-dark .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; } } - html.theme--documenter-dark .modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; } - html.theme--documenter-dark .modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; } - html.theme--documenter-dark .modal-card-head, - html.theme--documenter-dark .modal-card-foot { - align-items: center; - background-color: #282f2f; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; } - html.theme--documenter-dark .modal-card-head { - border-bottom: 1px solid #5e6d6f; - border-top-left-radius: 8px; - border-top-right-radius: 8px; } - html.theme--documenter-dark .modal-card-title { - color: #f2f2f2; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; } - html.theme--documenter-dark .modal-card-foot { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark .modal-card-foot .button:not(:last-child) { - margin-right: 0.5em; } - html.theme--documenter-dark .modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; } - html.theme--documenter-dark .navbar { - background-color: #375a7f; - min-height: 4rem; - position: relative; - z-index: 30; } - html.theme--documenter-dark .navbar.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-burger { - color: #0a0a0a; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-white .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; } } - html.theme--documenter-dark .navbar.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link { - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-burger { - color: white; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-black .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link { - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; } } - html.theme--documenter-dark .navbar.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link { - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after { - border-color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-burger { - color: #282f2f; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-light .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link { - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after { - border-color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: #ecf0f1; - color: #282f2f; } } - html.theme--documenter-dark .navbar.is-dark, html.theme--documenter-dark .content kbd.navbar { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link { - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-burger, html.theme--documenter-dark .content kbd.navbar .navbar-burger { - color: #ecf0f1; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-dark .navbar-start > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-end > .navbar-item, - html.theme--documenter-dark .content kbd.navbar .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link { - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { - background-color: #282f2f; - color: #ecf0f1; } } - html.theme--documenter-dark .navbar.is-primary, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-burger, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-primary .navbar-start > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-end > .navbar-item, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #375a7f; - color: #fff; } } - html.theme--documenter-dark .navbar.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-link .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #1abc9c; - color: #fff; } } - html.theme--documenter-dark .navbar.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-info .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #024c7d; - color: #fff; } } - html.theme--documenter-dark .navbar.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-success .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #008438; - color: #fff; } } - html.theme--documenter-dark .navbar.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-warning .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ad8100; - color: #fff; } } - html.theme--documenter-dark .navbar.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-danger .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #9e1b0d; - color: #fff; } } - html.theme--documenter-dark .navbar > .container { - align-items: stretch; - display: flex; - min-height: 4rem; - width: 100%; } - html.theme--documenter-dark .navbar.has-shadow { - box-shadow: 0 2px 0 0 #282f2f; } - html.theme--documenter-dark .navbar.is-fixed-bottom, html.theme--documenter-dark .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 #282f2f; } - html.theme--documenter-dark .navbar.is-fixed-top { - top: 0; } - html.theme--documenter-dark html.has-navbar-fixed-top, - html.theme--documenter-dark body.has-navbar-fixed-top { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom, - html.theme--documenter-dark body.has-navbar-fixed-bottom { - padding-bottom: 4rem; } - html.theme--documenter-dark .navbar-brand, - html.theme--documenter-dark .navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 4rem; } - html.theme--documenter-dark .navbar-brand a.navbar-item:focus, html.theme--documenter-dark .navbar-brand a.navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; } - html.theme--documenter-dark .navbar-burger { - color: #fff; - cursor: pointer; - display: block; - height: 4rem; - position: relative; - width: 4rem; - margin-left: auto; } - html.theme--documenter-dark .navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, transform; - transition-timing-function: ease-out; - width: 16px; } - html.theme--documenter-dark .navbar-burger span:nth-child(1) { - top: calc(50% - 6px); } - html.theme--documenter-dark .navbar-burger span:nth-child(2) { - top: calc(50% - 1px); } - html.theme--documenter-dark .navbar-burger span:nth-child(3) { - top: calc(50% + 4px); } - html.theme--documenter-dark .navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1) { - transform: translateY(5px) rotate(45deg); } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2) { - opacity: 0; } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3) { - transform: translateY(-5px) rotate(-45deg); } - html.theme--documenter-dark .navbar-menu { - display: none; } - html.theme--documenter-dark .navbar-item, - html.theme--documenter-dark .navbar-link { - color: #fff; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; } - html.theme--documenter-dark .navbar-item .icon:only-child, - html.theme--documenter-dark .navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; } - html.theme--documenter-dark a.navbar-item, - html.theme--documenter-dark .navbar-link { - cursor: pointer; } - html.theme--documenter-dark a.navbar-item:focus, html.theme--documenter-dark a.navbar-item:focus-within, html.theme--documenter-dark a.navbar-item:hover, html.theme--documenter-dark a.navbar-item.is-active, - html.theme--documenter-dark .navbar-link:focus, - html.theme--documenter-dark .navbar-link:focus-within, - html.theme--documenter-dark .navbar-link:hover, - html.theme--documenter-dark .navbar-link.is-active { - background-color: transparent; - color: #1abc9c; } - html.theme--documenter-dark .navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .navbar-item img { - max-height: 1.75rem; } - html.theme--documenter-dark .navbar-item.has-dropdown { - padding: 0; } - html.theme--documenter-dark .navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 4rem; - padding-bottom: calc(0.5rem - 1px); } - html.theme--documenter-dark .navbar-item.is-tab:focus, html.theme--documenter-dark .navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #1abc9c; } - html.theme--documenter-dark .navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #1abc9c; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #1abc9c; - padding-bottom: calc(0.5rem - 3px); } - html.theme--documenter-dark .navbar-content { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .navbar-link:not(.is-arrowless) { - padding-right: 2.5em; } - html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after { - border-color: #fff; - margin-top: -0.375em; - right: 1.125em; } - html.theme--documenter-dark .navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - html.theme--documenter-dark .navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; } - html.theme--documenter-dark .navbar-divider { - background-color: rgba(0, 0, 0, 0.2); - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .navbar > .container { - display: block; } - html.theme--documenter-dark .navbar-brand .navbar-item, - html.theme--documenter-dark .navbar-tabs .navbar-item { - align-items: center; - display: flex; } - html.theme--documenter-dark .navbar-link::after { - display: none; } - html.theme--documenter-dark .navbar-menu { - background-color: #375a7f; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; } - html.theme--documenter-dark .navbar-menu.is-active { - display: block; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch, html.theme--documenter-dark .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .navbar.is-fixed-top-touch { - top: 0; } - html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu, html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 4rem); - overflow: auto; } - html.theme--documenter-dark html.has-navbar-fixed-top-touch, - html.theme--documenter-dark body.has-navbar-fixed-top-touch { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom-touch, - html.theme--documenter-dark body.has-navbar-fixed-bottom-touch { - padding-bottom: 4rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar, - html.theme--documenter-dark .navbar-menu, - html.theme--documenter-dark .navbar-start, - html.theme--documenter-dark .navbar-end { - align-items: stretch; - display: flex; } - html.theme--documenter-dark .navbar { - min-height: 4rem; } - html.theme--documenter-dark .navbar.is-spaced { - padding: 1rem 2rem; } - html.theme--documenter-dark .navbar.is-spaced .navbar-start, - html.theme--documenter-dark .navbar.is-spaced .navbar-end { - align-items: center; } - html.theme--documenter-dark .navbar.is-spaced a.navbar-item, - html.theme--documenter-dark .navbar.is-spaced .navbar-link { - border-radius: 0.4em; } - html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover, html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus, - html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover, - html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; } - html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; } - html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: transparent; - color: #dbdee0; } - html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: transparent; - color: #1abc9c; } - html.theme--documenter-dark .navbar-burger { - display: none; } - html.theme--documenter-dark .navbar-item, - html.theme--documenter-dark .navbar-link { - align-items: center; - display: flex; } - html.theme--documenter-dark .navbar-item { - display: flex; } - html.theme--documenter-dark .navbar-item.has-dropdown { - align-items: stretch; } - html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after { - transform: rotate(135deg) translate(0.25em, -0.25em); } - html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 8px 8px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; } - html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; } - .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - transform: translateY(0); } - html.theme--documenter-dark .navbar-menu { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .navbar-start { - justify-content: flex-start; - margin-right: auto; } - html.theme--documenter-dark .navbar-end { - justify-content: flex-end; - margin-left: auto; } - html.theme--documenter-dark .navbar-dropdown { - background-color: #375a7f; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - border-top: 1px solid rgba(0, 0, 0, 0.2); - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; } - html.theme--documenter-dark .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item { - padding-right: 3rem; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover { - background-color: transparent; - color: #dbdee0; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active { - background-color: transparent; - color: #1abc9c; } - .navbar.is-spaced html.theme--documenter-dark .navbar-dropdown, html.theme--documenter-dark .navbar-dropdown.is-boxed { - border-radius: 8px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, transform; } - html.theme--documenter-dark .navbar-dropdown.is-right { - left: auto; - right: 0; } - html.theme--documenter-dark .navbar-divider { - display: block; } - html.theme--documenter-dark .navbar > .container .navbar-brand, - html.theme--documenter-dark .container > .navbar .navbar-brand { - margin-left: -.75rem; } - html.theme--documenter-dark .navbar > .container .navbar-menu, - html.theme--documenter-dark .container > .navbar .navbar-menu { - margin-right: -.75rem; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop, html.theme--documenter-dark .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .navbar.is-fixed-top-desktop { - top: 0; } - html.theme--documenter-dark html.has-navbar-fixed-top-desktop, - html.theme--documenter-dark body.has-navbar-fixed-top-desktop { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop, - html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop { - padding-bottom: 4rem; } - html.theme--documenter-dark html.has-spaced-navbar-fixed-top, - html.theme--documenter-dark body.has-spaced-navbar-fixed-top { - padding-top: 6rem; } - html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom, - html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom { - padding-bottom: 6rem; } - html.theme--documenter-dark a.navbar-item.is-active, - html.theme--documenter-dark .navbar-link.is-active { - color: #1abc9c; } - html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover), - html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover) { - background-color: transparent; } - html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link { - background-color: transparent; } } - html.theme--documenter-dark .hero.is-fullheight-with-navbar { - min-height: calc(100vh - 4rem); } - html.theme--documenter-dark .pagination { - font-size: 15px; - margin: -0.25rem; } - html.theme--documenter-dark .pagination.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination { - font-size: 0.85em; } - html.theme--documenter-dark .pagination.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .pagination.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .pagination.is-rounded .pagination-previous, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, - html.theme--documenter-dark .pagination.is-rounded .pagination-next, - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; } - html.theme--documenter-dark .pagination.is-rounded .pagination-link, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { - border-radius: 290486px; } - html.theme--documenter-dark .pagination, - html.theme--documenter-dark .pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-ellipsis { - font-size: 1em; - justify-content: center; - margin: 0.25rem; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: center; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-link { - border-color: #5e6d6f; - color: #1abc9c; - min-width: 2.25em; } - html.theme--documenter-dark .pagination-previous:hover, - html.theme--documenter-dark .pagination-next:hover, - html.theme--documenter-dark .pagination-link:hover { - border-color: #8c9b9d; - color: #1dd2af; } - html.theme--documenter-dark .pagination-previous:focus, - html.theme--documenter-dark .pagination-next:focus, - html.theme--documenter-dark .pagination-link:focus { - border-color: #8c9b9d; } - html.theme--documenter-dark .pagination-previous:active, - html.theme--documenter-dark .pagination-next:active, - html.theme--documenter-dark .pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } - html.theme--documenter-dark .pagination-previous[disabled], - html.theme--documenter-dark .pagination-next[disabled], - html.theme--documenter-dark .pagination-link[disabled] { - background-color: #dbdee0; - border-color: #dbdee0; - box-shadow: none; - color: #5e6d6f; - opacity: 0.5; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - html.theme--documenter-dark .pagination-link.is-current { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .pagination-ellipsis { - color: #8c9b9d; - pointer-events: none; } - html.theme--documenter-dark .pagination-list { - flex-wrap: wrap; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .pagination { - flex-wrap: wrap; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .pagination-list li { - flex-grow: 1; - flex-shrink: 1; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; } - html.theme--documenter-dark .pagination-previous { - order: 2; } - html.theme--documenter-dark .pagination-next { - order: 3; } - html.theme--documenter-dark .pagination { - justify-content: space-between; } - html.theme--documenter-dark .pagination.is-centered .pagination-previous { - order: 1; } - html.theme--documenter-dark .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; } - html.theme--documenter-dark .pagination.is-centered .pagination-next { - order: 3; } - html.theme--documenter-dark .pagination.is-right .pagination-previous { - order: 1; } - html.theme--documenter-dark .pagination.is-right .pagination-next { - order: 2; } - html.theme--documenter-dark .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; } } - html.theme--documenter-dark .panel { - font-size: 15px; } - html.theme--documenter-dark .panel:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .panel-heading, - html.theme--documenter-dark .panel-tabs, - html.theme--documenter-dark .panel-block { - border-bottom: 1px solid #5e6d6f; - border-left: 1px solid #5e6d6f; - border-right: 1px solid #5e6d6f; } - html.theme--documenter-dark .panel-heading:first-child, - html.theme--documenter-dark .panel-tabs:first-child, - html.theme--documenter-dark .panel-block:first-child { - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark .panel-heading { - background-color: #282f2f; - border-radius: 0.4em 0.4em 0 0; - color: #f2f2f2; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; } - html.theme--documenter-dark .panel-tabs a { - border-bottom: 1px solid #5e6d6f; - margin-bottom: -1px; - padding: 0.5em; } - html.theme--documenter-dark .panel-tabs a.is-active { - border-bottom-color: #343c3d; - color: #17a689; } - html.theme--documenter-dark .panel-list a { - color: #fff; } - html.theme--documenter-dark .panel-list a:hover { - color: #1abc9c; } - html.theme--documenter-dark .panel-block { - align-items: center; - color: #f2f2f2; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .panel-block input[type="checkbox"] { - margin-right: 0.75em; } - html.theme--documenter-dark .panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; } - html.theme--documenter-dark .panel-block.is-wrapped { - flex-wrap: wrap; } - html.theme--documenter-dark .panel-block.is-active { - border-left-color: #1abc9c; - color: #17a689; } - html.theme--documenter-dark .panel-block.is-active .panel-icon { - color: #1abc9c; } - html.theme--documenter-dark a.panel-block, - html.theme--documenter-dark label.panel-block { - cursor: pointer; } - html.theme--documenter-dark a.panel-block:hover, - html.theme--documenter-dark label.panel-block:hover { - background-color: #282f2f; } - html.theme--documenter-dark .panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: white; - margin-right: 0.75em; } - html.theme--documenter-dark .panel-icon .fa { - font-size: inherit; - line-height: inherit; } - html.theme--documenter-dark .tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 15px; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; } - html.theme--documenter-dark .tabs a { - align-items: center; - border-bottom-color: #5e6d6f; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #fff; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; } - html.theme--documenter-dark .tabs a:hover { - border-bottom-color: #f2f2f2; - color: #f2f2f2; } - html.theme--documenter-dark .tabs li { - display: block; } - html.theme--documenter-dark .tabs li.is-active a { - border-bottom-color: #1abc9c; - color: #1abc9c; } - html.theme--documenter-dark .tabs ul { - align-items: center; - border-bottom-color: #5e6d6f; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; } - html.theme--documenter-dark .tabs ul.is-left { - padding-right: 0.75em; } - html.theme--documenter-dark .tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; } - html.theme--documenter-dark .tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; } - html.theme--documenter-dark .tabs .icon:first-child { - margin-right: 0.5em; } - html.theme--documenter-dark .tabs .icon:last-child { - margin-left: 0.5em; } - html.theme--documenter-dark .tabs.is-centered ul { - justify-content: center; } - html.theme--documenter-dark .tabs.is-right ul { - justify-content: flex-end; } - html.theme--documenter-dark .tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .tabs.is-boxed a:hover { - background-color: #282f2f; - border-bottom-color: #5e6d6f; } - html.theme--documenter-dark .tabs.is-boxed li.is-active a { - background-color: white; - border-color: #5e6d6f; - border-bottom-color: transparent !important; } - html.theme--documenter-dark .tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .tabs.is-toggle a { - border-color: #5e6d6f; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; } - html.theme--documenter-dark .tabs.is-toggle a:hover { - background-color: #282f2f; - border-color: #8c9b9d; - z-index: 2; } - html.theme--documenter-dark .tabs.is-toggle li + li { - margin-left: -1px; } - html.theme--documenter-dark .tabs.is-toggle li:first-child a { - border-radius: 0.4em 0 0 0.4em; } - html.theme--documenter-dark .tabs.is-toggle li:last-child a { - border-radius: 0 0.4em 0.4em 0; } - html.theme--documenter-dark .tabs.is-toggle li.is-active a { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; - z-index: 1; } - html.theme--documenter-dark .tabs.is-toggle ul { - border-bottom: none; } - html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; } - html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; } - html.theme--documenter-dark .tabs.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.tabs { - font-size: 0.85em; } - html.theme--documenter-dark .tabs.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .tabs.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; } - .columns.is-mobile > html.theme--documenter-dark .column.is-narrow { - flex: none; } - .columns.is-mobile > html.theme--documenter-dark .column.is-full { - flex: none; - width: 100%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-three-quarters { - flex: none; - width: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-two-thirds { - flex: none; - width: 66.6666%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-half { - flex: none; - width: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-third { - flex: none; - width: 33.3333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-quarter { - flex: none; - width: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-fifth { - flex: none; - width: 20%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-two-fifths { - flex: none; - width: 40%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-three-fifths { - flex: none; - width: 60%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-four-fifths { - flex: none; - width: 80%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-quarters { - margin-left: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-thirds { - margin-left: 66.6666%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-half { - margin-left: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-third { - margin-left: 33.3333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-quarter { - margin-left: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-fifth { - margin-left: 20%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-fifths { - margin-left: 40%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-fifths { - margin-left: 60%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-four-fifths { - margin-left: 80%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-0 { - flex: none; - width: 0%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-0 { - margin-left: 0%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-1 { - flex: none; - width: 8.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-1 { - margin-left: 8.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-2 { - flex: none; - width: 16.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-2 { - margin-left: 16.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-3 { - flex: none; - width: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-3 { - margin-left: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-4 { - flex: none; - width: 33.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-4 { - margin-left: 33.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-5 { - flex: none; - width: 41.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-5 { - margin-left: 41.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-6 { - flex: none; - width: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-6 { - margin-left: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-7 { - flex: none; - width: 58.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-7 { - margin-left: 58.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-8 { - flex: none; - width: 66.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-8 { - margin-left: 66.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-9 { - flex: none; - width: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-9 { - margin-left: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-10 { - flex: none; - width: 83.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-10 { - margin-left: 83.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-11 { - flex: none; - width: 91.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-11 { - margin-left: 91.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-12 { - flex: none; - width: 100%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-12 { - margin-left: 100%; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .column.is-narrow-mobile { - flex: none; } - html.theme--documenter-dark .column.is-full-mobile { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-mobile { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-mobile { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-mobile { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-mobile { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-mobile { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-mobile { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-mobile { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-mobile { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-mobile { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-mobile { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-mobile { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-mobile { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-mobile { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-mobile { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-mobile { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-mobile { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-mobile { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-mobile { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-mobile { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-mobile { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-mobile { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-mobile { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-mobile { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-mobile { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-mobile { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-mobile { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-mobile { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-mobile { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-mobile { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-mobile { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-mobile { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-mobile { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-mobile { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-mobile { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-mobile { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-mobile { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-mobile { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-mobile { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-mobile { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-mobile { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-mobile { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-mobile { - margin-left: 100%; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .column.is-narrow, html.theme--documenter-dark .column.is-narrow-tablet { - flex: none; } - html.theme--documenter-dark .column.is-full, html.theme--documenter-dark .column.is-full-tablet { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters, html.theme--documenter-dark .column.is-three-quarters-tablet { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds, html.theme--documenter-dark .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half, html.theme--documenter-dark .column.is-half-tablet { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third, html.theme--documenter-dark .column.is-one-third-tablet { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter, html.theme--documenter-dark .column.is-one-quarter-tablet { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth, html.theme--documenter-dark .column.is-one-fifth-tablet { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths, html.theme--documenter-dark .column.is-two-fifths-tablet { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths, html.theme--documenter-dark .column.is-three-fifths-tablet { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths, html.theme--documenter-dark .column.is-four-fifths-tablet { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters, html.theme--documenter-dark .column.is-offset-three-quarters-tablet { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds, html.theme--documenter-dark .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half, html.theme--documenter-dark .column.is-offset-half-tablet { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third, html.theme--documenter-dark .column.is-offset-one-third-tablet { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter, html.theme--documenter-dark .column.is-offset-one-quarter-tablet { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth, html.theme--documenter-dark .column.is-offset-one-fifth-tablet { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths, html.theme--documenter-dark .column.is-offset-two-fifths-tablet { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths, html.theme--documenter-dark .column.is-offset-three-fifths-tablet { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths, html.theme--documenter-dark .column.is-offset-four-fifths-tablet { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0, html.theme--documenter-dark .column.is-0-tablet { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0, html.theme--documenter-dark .column.is-offset-0-tablet { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1, html.theme--documenter-dark .column.is-1-tablet { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1, html.theme--documenter-dark .column.is-offset-1-tablet { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2, html.theme--documenter-dark .column.is-2-tablet { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2, html.theme--documenter-dark .column.is-offset-2-tablet { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3, html.theme--documenter-dark .column.is-3-tablet { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3, html.theme--documenter-dark .column.is-offset-3-tablet { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4, html.theme--documenter-dark .column.is-4-tablet { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4, html.theme--documenter-dark .column.is-offset-4-tablet { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5, html.theme--documenter-dark .column.is-5-tablet { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5, html.theme--documenter-dark .column.is-offset-5-tablet { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6, html.theme--documenter-dark .column.is-6-tablet { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6, html.theme--documenter-dark .column.is-offset-6-tablet { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7, html.theme--documenter-dark .column.is-7-tablet { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7, html.theme--documenter-dark .column.is-offset-7-tablet { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8, html.theme--documenter-dark .column.is-8-tablet { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8, html.theme--documenter-dark .column.is-offset-8-tablet { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9, html.theme--documenter-dark .column.is-9-tablet { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9, html.theme--documenter-dark .column.is-offset-9-tablet { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10, html.theme--documenter-dark .column.is-10-tablet { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10, html.theme--documenter-dark .column.is-offset-10-tablet { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11, html.theme--documenter-dark .column.is-11-tablet { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11, html.theme--documenter-dark .column.is-offset-11-tablet { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12, html.theme--documenter-dark .column.is-12-tablet { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12, html.theme--documenter-dark .column.is-offset-12-tablet { - margin-left: 100%; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .column.is-narrow-touch { - flex: none; } - html.theme--documenter-dark .column.is-full-touch { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-touch { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-touch { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-touch { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-touch { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-touch { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-touch { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-touch { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-touch { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-touch { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-touch { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-touch { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-touch { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-touch { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-touch { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-touch { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-touch { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-touch { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-touch { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-touch { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-touch { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-touch { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-touch { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-touch { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-touch { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-touch { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-touch { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-touch { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-touch { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-touch { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-touch { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-touch { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-touch { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-touch { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-touch { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-touch { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-touch { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-touch { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-touch { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-touch { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-touch { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-touch { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-touch { - margin-left: 100%; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .column.is-narrow-desktop { - flex: none; } - html.theme--documenter-dark .column.is-full-desktop { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-desktop { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-desktop { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-desktop { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-desktop { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-desktop { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-desktop { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-desktop { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-desktop { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-desktop { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-desktop { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-desktop { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-desktop { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-desktop { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-desktop { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-desktop { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-desktop { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-desktop { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-desktop { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-desktop { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-desktop { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-desktop { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-desktop { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-desktop { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-desktop { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-desktop { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-desktop { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-desktop { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-desktop { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-desktop { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-desktop { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-desktop { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-desktop { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-desktop { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-desktop { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-desktop { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-desktop { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-desktop { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-desktop { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-desktop { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-desktop { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-desktop { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-desktop { - margin-left: 100%; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .column.is-narrow-widescreen { - flex: none; } - html.theme--documenter-dark .column.is-full-widescreen { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-widescreen { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-widescreen { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-widescreen { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-widescreen { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-widescreen { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-widescreen { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-widescreen { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-widescreen { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-widescreen { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-widescreen { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-widescreen { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-widescreen { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-widescreen { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-widescreen { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-widescreen { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-widescreen { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-widescreen { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-widescreen { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-widescreen { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-widescreen { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-widescreen { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-widescreen { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-widescreen { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-widescreen { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-widescreen { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-widescreen { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-widescreen { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-widescreen { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-widescreen { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-widescreen { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-widescreen { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-widescreen { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-widescreen { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-widescreen { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-widescreen { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-widescreen { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-widescreen { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-widescreen { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-widescreen { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-widescreen { - margin-left: 100%; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .column.is-narrow-fullhd { - flex: none; } - html.theme--documenter-dark .column.is-full-fullhd { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-fullhd { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-fullhd { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-fullhd { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-fullhd { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-fullhd { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-fullhd { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-fullhd { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-fullhd { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-fullhd { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-fullhd { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-fullhd { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-fullhd { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-fullhd { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-fullhd { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-fullhd { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-fullhd { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-fullhd { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-fullhd { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-fullhd { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-fullhd { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-fullhd { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-fullhd { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-fullhd { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-fullhd { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-fullhd { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-fullhd { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-fullhd { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-fullhd { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-fullhd { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-fullhd { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-fullhd { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-fullhd { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-fullhd { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-fullhd { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-fullhd { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-fullhd { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-fullhd { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-fullhd { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-fullhd { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-fullhd { - margin-left: 100%; } } - html.theme--documenter-dark .columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - html.theme--documenter-dark .columns:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); } - html.theme--documenter-dark .columns.is-centered { - justify-content: center; } - html.theme--documenter-dark .columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; } - html.theme--documenter-dark .columns.is-gapless > .column { - margin: 0; - padding: 0 !important; } - html.theme--documenter-dark .columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .columns.is-gapless:last-child { - margin-bottom: 0; } - html.theme--documenter-dark .columns.is-mobile { - display: flex; } - html.theme--documenter-dark .columns.is-multiline { - flex-wrap: wrap; } - html.theme--documenter-dark .columns.is-vcentered { - align-items: center; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns:not(.is-desktop) { - display: flex; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-desktop { - display: flex; } } - html.theme--documenter-dark .columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); } - html.theme--documenter-dark .columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); } - html.theme--documenter-dark .columns.is-variable.is-0 { - --columnGap: 0rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-0-mobile { - --columnGap: 0rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-0-tablet { - --columnGap: 0rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-0-touch { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-0-desktop { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; } } - html.theme--documenter-dark .columns.is-variable.is-1 { - --columnGap: 0.25rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; } } - html.theme--documenter-dark .columns.is-variable.is-2 { - --columnGap: 0.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; } } - html.theme--documenter-dark .columns.is-variable.is-3 { - --columnGap: 0.75rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; } } - html.theme--documenter-dark .columns.is-variable.is-4 { - --columnGap: 1rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-4-mobile { - --columnGap: 1rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-4-tablet { - --columnGap: 1rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-4-touch { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-4-desktop { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; } } - html.theme--documenter-dark .columns.is-variable.is-5 { - --columnGap: 1.25rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; } } - html.theme--documenter-dark .columns.is-variable.is-6 { - --columnGap: 1.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; } } - html.theme--documenter-dark .columns.is-variable.is-7 { - --columnGap: 1.75rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; } } - html.theme--documenter-dark .columns.is-variable.is-8 { - --columnGap: 2rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-8-mobile { - --columnGap: 2rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-8-tablet { - --columnGap: 2rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-8-touch { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-8-desktop { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; } } - html.theme--documenter-dark .tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: min-content; } - html.theme--documenter-dark .tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - html.theme--documenter-dark .tile.is-ancestor:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .tile.is-child { - margin: 0 !important; } - html.theme--documenter-dark .tile.is-parent { - padding: 0.75rem; } - html.theme--documenter-dark .tile.is-vertical { - flex-direction: column; } - html.theme--documenter-dark .tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .tile:not(.is-child) { - display: flex; } - html.theme--documenter-dark .tile.is-1 { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .tile.is-2 { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .tile.is-3 { - flex: none; - width: 25%; } - html.theme--documenter-dark .tile.is-4 { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .tile.is-5 { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .tile.is-6 { - flex: none; - width: 50%; } - html.theme--documenter-dark .tile.is-7 { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .tile.is-8 { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .tile.is-9 { - flex: none; - width: 75%; } - html.theme--documenter-dark .tile.is-10 { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .tile.is-11 { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .tile.is-12 { - flex: none; - width: 100%; } } - html.theme--documenter-dark .hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; } - html.theme--documenter-dark .hero .navbar { - background: none; } - html.theme--documenter-dark .hero .tabs ul { - border-bottom: none; } - html.theme--documenter-dark .hero.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-white strong { - color: inherit; } - html.theme--documenter-dark .hero.is-white .title { - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); } - html.theme--documenter-dark .hero.is-white .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-white .subtitle strong { - color: #0a0a0a; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-white .navbar-menu { - background-color: white; } } - html.theme--documenter-dark .hero.is-white .navbar-item, - html.theme--documenter-dark .hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); } - html.theme--documenter-dark .hero.is-white a.navbar-item:hover, html.theme--documenter-dark .hero.is-white a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-white .navbar-link:hover, - html.theme--documenter-dark .hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-white .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-white .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } - html.theme--documenter-dark .hero.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-black strong { - color: inherit; } - html.theme--documenter-dark .hero.is-black .title { - color: white; } - html.theme--documenter-dark .hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-black .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-black .subtitle strong { - color: white; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-black .navbar-menu { - background-color: #0a0a0a; } } - html.theme--documenter-dark .hero.is-black .navbar-item, - html.theme--documenter-dark .hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-black a.navbar-item:hover, html.theme--documenter-dark .hero.is-black a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-black .navbar-link:hover, - html.theme--documenter-dark .hero.is-black .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .hero.is-black .tabs a { - color: white; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-black .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-black .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a { - color: white; } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } - html.theme--documenter-dark .hero.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-light strong { - color: inherit; } - html.theme--documenter-dark .hero.is-light .title { - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .subtitle { - color: rgba(40, 47, 47, 0.9); } - html.theme--documenter-dark .hero.is-light .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-light .subtitle strong { - color: #282f2f; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-light .navbar-menu { - background-color: #ecf0f1; } } - html.theme--documenter-dark .hero.is-light .navbar-item, - html.theme--documenter-dark .hero.is-light .navbar-link { - color: rgba(40, 47, 47, 0.7); } - html.theme--documenter-dark .hero.is-light a.navbar-item:hover, html.theme--documenter-dark .hero.is-light a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-light .navbar-link:hover, - html.theme--documenter-dark .hero.is-light .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .tabs a { - color: #282f2f; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-light .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-light .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a { - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-light.is-bold { - background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } } - html.theme--documenter-dark .hero.is-dark, html.theme--documenter-dark .content kbd.hero { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-dark strong, - html.theme--documenter-dark .content kbd.hero strong { - color: inherit; } - html.theme--documenter-dark .hero.is-dark .title, html.theme--documenter-dark .content kbd.hero .title { - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .subtitle, html.theme--documenter-dark .content kbd.hero .subtitle { - color: rgba(236, 240, 241, 0.9); } - html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button), html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-dark .subtitle strong, - html.theme--documenter-dark .content kbd.hero .subtitle strong { - color: #ecf0f1; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-dark .navbar-menu, html.theme--documenter-dark .content kbd.hero .navbar-menu { - background-color: #282f2f; } } - html.theme--documenter-dark .hero.is-dark .navbar-item, html.theme--documenter-dark .content kbd.hero .navbar-item, - html.theme--documenter-dark .hero.is-dark .navbar-link, - html.theme--documenter-dark .content kbd.hero .navbar-link { - color: rgba(236, 240, 241, 0.7); } - html.theme--documenter-dark .hero.is-dark a.navbar-item:hover, html.theme--documenter-dark .content kbd.hero a.navbar-item:hover, html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active, html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-dark .navbar-link:hover, - html.theme--documenter-dark .content kbd.hero .navbar-link:hover, - html.theme--documenter-dark .hero.is-dark .navbar-link.is-active, - html.theme--documenter-dark .content kbd.hero .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .tabs a, html.theme--documenter-dark .content kbd.hero .tabs a { - color: #ecf0f1; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-dark .tabs a:hover, html.theme--documenter-dark .content kbd.hero .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-dark .tabs li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a { - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .hero.is-dark.is-bold, html.theme--documenter-dark .content kbd.hero.is-bold { - background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu, html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } } - html.theme--documenter-dark .hero.is-primary, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-primary strong, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink strong { - color: inherit; } - html.theme--documenter-dark .hero.is-primary .title, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .title { - color: #fff; } - html.theme--documenter-dark .hero.is-primary .subtitle, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-primary .subtitle strong, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-primary .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-menu { - background-color: #375a7f; } } - html.theme--documenter-dark .hero.is-primary .navbar-item, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-item, - html.theme--documenter-dark .hero.is-primary .navbar-link, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-primary a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-primary .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, - html.theme--documenter-dark .hero.is-primary .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .hero.is-primary .tabs a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-primary .tabs a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-primary .tabs li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .hero.is-primary.is-bold, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink { - background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { - background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } } - html.theme--documenter-dark .hero.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-link strong { - color: inherit; } - html.theme--documenter-dark .hero.is-link .title { - color: #fff; } - html.theme--documenter-dark .hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-link .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-link .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-link .navbar-menu { - background-color: #1abc9c; } } - html.theme--documenter-dark .hero.is-link .navbar-item, - html.theme--documenter-dark .hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-link a.navbar-item:hover, html.theme--documenter-dark .hero.is-link a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-link .navbar-link:hover, - html.theme--documenter-dark .hero.is-link .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .hero.is-link .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-link .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-link .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .hero.is-link.is-bold { - background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } } - html.theme--documenter-dark .hero.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-info strong { - color: inherit; } - html.theme--documenter-dark .hero.is-info .title { - color: #fff; } - html.theme--documenter-dark .hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-info .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-info .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-info .navbar-menu { - background-color: #024c7d; } } - html.theme--documenter-dark .hero.is-info .navbar-item, - html.theme--documenter-dark .hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-info a.navbar-item:hover, html.theme--documenter-dark .hero.is-info a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-info .navbar-link:hover, - html.theme--documenter-dark .hero.is-info .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .hero.is-info .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-info .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-info .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .hero.is-info.is-bold { - background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } } - html.theme--documenter-dark .hero.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-success strong { - color: inherit; } - html.theme--documenter-dark .hero.is-success .title { - color: #fff; } - html.theme--documenter-dark .hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-success .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-success .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-success .navbar-menu { - background-color: #008438; } } - html.theme--documenter-dark .hero.is-success .navbar-item, - html.theme--documenter-dark .hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-success a.navbar-item:hover, html.theme--documenter-dark .hero.is-success a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-success .navbar-link:hover, - html.theme--documenter-dark .hero.is-success .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .hero.is-success .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-success .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-success .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #008438; } - html.theme--documenter-dark .hero.is-success.is-bold { - background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } } - html.theme--documenter-dark .hero.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-warning strong { - color: inherit; } - html.theme--documenter-dark .hero.is-warning .title { - color: #fff; } - html.theme--documenter-dark .hero.is-warning .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-warning .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-warning .navbar-menu { - background-color: #ad8100; } } - html.theme--documenter-dark .hero.is-warning .navbar-item, - html.theme--documenter-dark .hero.is-warning .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-warning a.navbar-item:hover, html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-warning .navbar-link:hover, - html.theme--documenter-dark .hero.is-warning .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .hero.is-warning .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-warning .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-warning .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } } - html.theme--documenter-dark .hero.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-danger strong { - color: inherit; } - html.theme--documenter-dark .hero.is-danger .title { - color: #fff; } - html.theme--documenter-dark .hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-danger .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-danger .navbar-menu { - background-color: #9e1b0d; } } - html.theme--documenter-dark .hero.is-danger .navbar-item, - html.theme--documenter-dark .hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-danger a.navbar-item:hover, html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-danger .navbar-link:hover, - html.theme--documenter-dark .hero.is-danger .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-danger .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-danger .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } } - html.theme--documenter-dark .hero.is-small .hero-body, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.hero .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; } } - html.theme--documenter-dark .hero.is-halfheight .hero-body, html.theme--documenter-dark .hero.is-fullheight .hero-body, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; } - html.theme--documenter-dark .hero.is-halfheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .hero.is-halfheight { - min-height: 50vh; } - html.theme--documenter-dark .hero.is-fullheight { - min-height: 100vh; } - html.theme--documenter-dark .hero-video { - overflow: hidden; } - html.theme--documenter-dark .hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - transform: translate3d(-50%, -50%, 0); } - html.theme--documenter-dark .hero-video.is-transparent { - opacity: 0.3; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero-video { - display: none; } } - html.theme--documenter-dark .hero-buttons { - margin-top: 1.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero-buttons .button { - display: flex; } - html.theme--documenter-dark .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero-buttons { - display: flex; - justify-content: center; } - html.theme--documenter-dark .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; } } - html.theme--documenter-dark .hero-head, - html.theme--documenter-dark .hero-foot { - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; } - html.theme--documenter-dark .section { - padding: 3rem 1.5rem; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .section.is-medium { - padding: 9rem 1.5rem; } - html.theme--documenter-dark .section.is-large { - padding: 18rem 1.5rem; } } - html.theme--documenter-dark .footer { - background-color: #282f2f; - padding: 3rem 1.5rem 6rem; } - html.theme--documenter-dark hr { - height: 1px; } - html.theme--documenter-dark h6 { - text-transform: uppercase; - letter-spacing: 0.5px; } - html.theme--documenter-dark .hero { - background-color: #343c3d; } - html.theme--documenter-dark a { - transition: all 200ms ease; } - html.theme--documenter-dark .button { - transition: all 200ms ease; - border-width: 1px; - color: white; } - html.theme--documenter-dark .button.is-active, html.theme--documenter-dark .button.is-focused, html.theme--documenter-dark .button:active, html.theme--documenter-dark .button:focus { - box-shadow: 0 0 0 2px rgba(140, 155, 157, 0.5); } - html.theme--documenter-dark .button.is-white.is-hovered, html.theme--documenter-dark .button.is-white:hover { - background-color: white; } - html.theme--documenter-dark .button.is-white.is-active, html.theme--documenter-dark .button.is-white.is-focused, html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white:focus { - border-color: white; - box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); } - html.theme--documenter-dark .button.is-black.is-hovered, html.theme--documenter-dark .button.is-black:hover { - background-color: #1d1d1d; } - html.theme--documenter-dark .button.is-black.is-active, html.theme--documenter-dark .button.is-black.is-focused, html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black:focus { - border-color: #0a0a0a; - box-shadow: 0 0 0 2px rgba(10, 10, 10, 0.5); } - html.theme--documenter-dark .button.is-light.is-hovered, html.theme--documenter-dark .button.is-light:hover { - background-color: white; } - html.theme--documenter-dark .button.is-light.is-active, html.theme--documenter-dark .button.is-light.is-focused, html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light:focus { - border-color: #ecf0f1; - box-shadow: 0 0 0 2px rgba(236, 240, 241, 0.5); } - html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered, html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover { - background-color: #3a4344; } - html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused, html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus { - border-color: #282f2f; - box-shadow: 0 0 0 2px rgba(40, 47, 47, 0.5); } - html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover { - background-color: #436d9a; } - html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink, html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus { - border-color: #375a7f; - box-shadow: 0 0 0 2px rgba(55, 90, 127, 0.5); } - html.theme--documenter-dark .button.is-link.is-hovered, html.theme--documenter-dark .button.is-link:hover { - background-color: #1fdeb8; } - html.theme--documenter-dark .button.is-link.is-active, html.theme--documenter-dark .button.is-link.is-focused, html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link:focus { - border-color: #1abc9c; - box-shadow: 0 0 0 2px rgba(26, 188, 156, 0.5); } - html.theme--documenter-dark .button.is-info.is-hovered, html.theme--documenter-dark .button.is-info:hover { - background-color: #0363a3; } - html.theme--documenter-dark .button.is-info.is-active, html.theme--documenter-dark .button.is-info.is-focused, html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info:focus { - border-color: #024c7d; - box-shadow: 0 0 0 2px rgba(2, 76, 125, 0.5); } - html.theme--documenter-dark .button.is-success.is-hovered, html.theme--documenter-dark .button.is-success:hover { - background-color: #00aa48; } - html.theme--documenter-dark .button.is-success.is-active, html.theme--documenter-dark .button.is-success.is-focused, html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success:focus { - border-color: #008438; - box-shadow: 0 0 0 2px rgba(0, 132, 56, 0.5); } - html.theme--documenter-dark .button.is-warning.is-hovered, html.theme--documenter-dark .button.is-warning:hover { - background-color: #d39e00; } - html.theme--documenter-dark .button.is-warning.is-active, html.theme--documenter-dark .button.is-warning.is-focused, html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning:focus { - border-color: #ad8100; - box-shadow: 0 0 0 2px rgba(173, 129, 0, 0.5); } - html.theme--documenter-dark .button.is-danger.is-hovered, html.theme--documenter-dark .button.is-danger:hover { - background-color: #c12110; } - html.theme--documenter-dark .button.is-danger.is-active, html.theme--documenter-dark .button.is-danger.is-focused, html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger:focus { - border-color: #9e1b0d; - box-shadow: 0 0 0 2px rgba(158, 27, 13, 0.5); } - html.theme--documenter-dark .label { - color: #dbdee0; } - html.theme--documenter-dark .button, - html.theme--documenter-dark .control.has-icons-left .icon, - html.theme--documenter-dark .control.has-icons-right .icon, - html.theme--documenter-dark .input, - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark .pagination-ellipsis, - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .select, - html.theme--documenter-dark .select select, - html.theme--documenter-dark .textarea { - height: 2.5em; } - html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark .textarea { - transition: all 200ms ease; - box-shadow: none; - border-width: 1px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .select:after, - html.theme--documenter-dark .select select { - border-width: 1px; } - html.theme--documenter-dark .control.has-addons .button, - html.theme--documenter-dark .control.has-addons .input, - html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search > input, - html.theme--documenter-dark .control.has-addons .select { - margin-right: -1px; } - html.theme--documenter-dark .notification { - background-color: #343c3d; } - html.theme--documenter-dark .card { - box-shadow: none; - border: 1px solid #343c3d; - background-color: #282f2f; - border-radius: 0.4em; } - html.theme--documenter-dark .card .card-image img { - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .card .card-header { - box-shadow: none; - background-color: rgba(18, 18, 18, 0.2); - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .card .card-footer { - background-color: rgba(18, 18, 18, 0.2); } - html.theme--documenter-dark .card .card-footer, - html.theme--documenter-dark .card .card-footer-item { - border-width: 1px; - border-color: #343c3d; } - html.theme--documenter-dark .notification.is-white a:not(.button) { - color: #0a0a0a; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-black a:not(.button) { - color: white; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-light a:not(.button) { - color: #282f2f; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-dark a:not(.button), html.theme--documenter-dark .content kbd.notification a:not(.button) { - color: #ecf0f1; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-primary a:not(.button), html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-link a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-info a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-success a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-warning a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-danger a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .tag, html.theme--documenter-dark .content kbd, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - border-radius: 0.4em; } - html.theme--documenter-dark .menu-list a { - transition: all 300ms ease; } - html.theme--documenter-dark .modal-card-body { - background-color: #282f2f; } - html.theme--documenter-dark .modal-card-foot, - html.theme--documenter-dark .modal-card-head { - border-color: #343c3d; } - html.theme--documenter-dark .message-header { - font-weight: 700; - background-color: #343c3d; - color: white; } - html.theme--documenter-dark .message-body { - border-width: 1px; - border-color: #343c3d; } - html.theme--documenter-dark .navbar { - border-radius: 0.4em; } - html.theme--documenter-dark .navbar.is-transparent { - background: none; } - html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #1abc9c; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .navbar .navbar-menu { - background-color: #375a7f; - border-radius: 0 0 0.4em 0.4em; } } - html.theme--documenter-dark .hero .navbar, - html.theme--documenter-dark body > .navbar { - border-radius: 0; } - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-previous { - border-width: 1px; } - html.theme--documenter-dark .panel-block, - html.theme--documenter-dark .panel-heading, - html.theme--documenter-dark .panel-tabs { - border-width: 1px; } - html.theme--documenter-dark .panel-block:first-child, - html.theme--documenter-dark .panel-heading:first-child, - html.theme--documenter-dark .panel-tabs:first-child { - border-top-width: 1px; } - html.theme--documenter-dark .panel-heading { - font-weight: 700; } - html.theme--documenter-dark .panel-tabs a { - border-width: 1px; - margin-bottom: -1px; } - html.theme--documenter-dark .panel-tabs a.is-active { - border-bottom-color: #17a689; } - html.theme--documenter-dark .panel-block:hover { - color: #1dd2af; } - html.theme--documenter-dark .panel-block:hover .panel-icon { - color: #1dd2af; } - html.theme--documenter-dark .panel-block.is-active .panel-icon { - color: #17a689; } - html.theme--documenter-dark .tabs a { - border-bottom-width: 1px; - margin-bottom: -1px; } - html.theme--documenter-dark .tabs ul { - border-bottom-width: 1px; } - html.theme--documenter-dark .tabs.is-boxed a { - border-width: 1px; } - html.theme--documenter-dark .tabs.is-boxed li.is-active a { - background-color: #1f2424; } - html.theme--documenter-dark .tabs.is-toggle li a { - border-width: 1px; - margin-bottom: 0; } - html.theme--documenter-dark .tabs.is-toggle li + li { - margin-left: -1px; } - html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark h1 .docs-heading-anchor, html.theme--documenter-dark h1 .docs-heading-anchor:hover, html.theme--documenter-dark h1 .docs-heading-anchor:visited, html.theme--documenter-dark h2 .docs-heading-anchor, html.theme--documenter-dark h2 .docs-heading-anchor:hover, html.theme--documenter-dark h2 .docs-heading-anchor:visited, html.theme--documenter-dark h3 .docs-heading-anchor, html.theme--documenter-dark h3 .docs-heading-anchor:hover, html.theme--documenter-dark h3 .docs-heading-anchor:visited, html.theme--documenter-dark h4 .docs-heading-anchor, html.theme--documenter-dark h4 .docs-heading-anchor:hover, html.theme--documenter-dark h4 .docs-heading-anchor:visited, html.theme--documenter-dark h5 .docs-heading-anchor, html.theme--documenter-dark h5 .docs-heading-anchor:hover, html.theme--documenter-dark h5 .docs-heading-anchor:visited, html.theme--documenter-dark h6 .docs-heading-anchor, html.theme--documenter-dark h6 .docs-heading-anchor:hover, html.theme--documenter-dark h6 .docs-heading-anchor:visited { - color: #f2f2f2; } - html.theme--documenter-dark h1 .docs-heading-anchor-permalink, html.theme--documenter-dark h2 .docs-heading-anchor-permalink, html.theme--documenter-dark h3 .docs-heading-anchor-permalink, html.theme--documenter-dark h4 .docs-heading-anchor-permalink, html.theme--documenter-dark h5 .docs-heading-anchor-permalink, html.theme--documenter-dark h6 .docs-heading-anchor-permalink { - visibility: hidden; - vertical-align: middle; - margin-left: 0.5em; - font-size: 0.7rem; } - html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f0c1"; } - html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink { - visibility: visible; } - html.theme--documenter-dark .docs-light-only { - display: none !important; } - html.theme--documenter-dark pre { - position: relative; - overflow: hidden; } - html.theme--documenter-dark pre code, html.theme--documenter-dark pre code.hljs { - padding: 0 0.75rem !important; - overflow: auto; - display: block; } - html.theme--documenter-dark pre code:first-of-type, html.theme--documenter-dark pre code.hljs:first-of-type { - padding-top: 0.5rem !important; } - html.theme--documenter-dark pre code:last-of-type, html.theme--documenter-dark pre code.hljs:last-of-type { - padding-bottom: 0.5rem !important; } - html.theme--documenter-dark pre .copy-button { - opacity: 0.2; - transition: opacity 0.2s; - position: absolute; - right: 0em; - top: 0em; - padding: 0.5em; - width: 2.5em; - height: 2.5em; - background: transparent; - border: none; - font-family: "Font Awesome 5 Free"; - color: #fff; - cursor: pointer; - text-align: center; } - html.theme--documenter-dark pre .copy-button:focus, html.theme--documenter-dark pre .copy-button:hover { - opacity: 1; - background: rgba(255, 255, 255, 0.1); - color: #1abc9c; } - html.theme--documenter-dark pre .copy-button.success { - color: #259a12; - opacity: 1; } - html.theme--documenter-dark pre .copy-button.error { - color: #cb3c33; - opacity: 1; } - html.theme--documenter-dark pre:hover .copy-button { - opacity: 1; } - html.theme--documenter-dark .admonition { - background-color: #282f2f; - border-style: solid; - border-width: 1px; - border-color: #5e6d6f; - border-radius: 0.4em; - font-size: 15px; } - html.theme--documenter-dark .admonition strong { - color: currentColor; } - html.theme--documenter-dark .admonition.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.admonition { - font-size: 0.85em; } - html.theme--documenter-dark .admonition.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .admonition.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .admonition.is-default { - background-color: #282f2f; - border-color: #5e6d6f; } - html.theme--documenter-dark .admonition.is-default > .admonition-header { - background-color: #5e6d6f; } - html.theme--documenter-dark .admonition.is-info { - background-color: #282f2f; - border-color: #024c7d; } - html.theme--documenter-dark .admonition.is-info > .admonition-header { - background-color: #024c7d; } - html.theme--documenter-dark .admonition.is-success { - background-color: #282f2f; - border-color: #008438; } - html.theme--documenter-dark .admonition.is-success > .admonition-header { - background-color: #008438; } - html.theme--documenter-dark .admonition.is-warning { - background-color: #282f2f; - border-color: #ad8100; } - html.theme--documenter-dark .admonition.is-warning > .admonition-header { - background-color: #ad8100; } - html.theme--documenter-dark .admonition.is-danger { - background-color: #282f2f; - border-color: #9e1b0d; } - html.theme--documenter-dark .admonition.is-danger > .admonition-header { - background-color: #9e1b0d; } - html.theme--documenter-dark .admonition.is-compat { - background-color: #282f2f; - border-color: #137886; } - html.theme--documenter-dark .admonition.is-compat > .admonition-header { - background-color: #137886; } - html.theme--documenter-dark .admonition-header { - background-color: #5e6d6f; - align-items: center; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.5rem 0.75rem; - position: relative; } - html.theme--documenter-dark .admonition-header:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-right: 0.75rem; - content: "\f06a"; } - html.theme--documenter-dark .admonition-body { - color: #fff; - padding: 0.5rem 0.75rem; } - html.theme--documenter-dark .admonition-body pre { - background-color: #282f2f; } - html.theme--documenter-dark .admonition-body code { - background-color: rgba(255, 255, 255, 0.05); } - html.theme--documenter-dark .docstring { - margin-bottom: 1em; - background-color: transparent; - border: 1px solid #5e6d6f; - box-shadow: none; - max-width: 100%; } - html.theme--documenter-dark .docstring > header { - display: flex; - flex-grow: 1; - align-items: stretch; - padding: 0.5rem 0.75rem; - background-color: #282f2f; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - box-shadow: none; - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .docstring > header code { - background-color: transparent; } - html.theme--documenter-dark .docstring > header .docstring-binding { - margin-right: 0.3em; } - html.theme--documenter-dark .docstring > header .docstring-category { - margin-left: 0.3em; } - html.theme--documenter-dark .docstring > section { - position: relative; - padding: 0.75rem 0.75rem; - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .docstring > section:last-child { - border-bottom: none; } - html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - transition: opacity 0.3s; - opacity: 0; - position: absolute; - right: 0.375rem; - bottom: 0.375rem; } - html.theme--documenter-dark .docstring > section > a.docs-sourcelink:focus { - opacity: 1 !important; } - html.theme--documenter-dark .docstring:hover > section > a.docs-sourcelink { - opacity: 0.2; } - html.theme--documenter-dark .docstring:focus-within > section > a.docs-sourcelink { - opacity: 0.2; } - html.theme--documenter-dark .docstring > section:hover a.docs-sourcelink { - opacity: 1; } - html.theme--documenter-dark .documenter-example-output { - background-color: #1f2424; } - html.theme--documenter-dark .outdated-warning-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - z-index: 999; - background-color: #282f2f; - border-bottom: 3px solid #9e1b0d; - padding: 10px 35px; - text-align: center; - font-size: 15px; } - html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer { - position: absolute; - top: calc(50% - 10px); - right: 18px; - cursor: pointer; - width: 12px; } - html.theme--documenter-dark .outdated-warning-overlay a { - color: #1abc9c; } - html.theme--documenter-dark .outdated-warning-overlay a:hover { - color: #1dd2af; } - html.theme--documenter-dark .content pre { - border: 1px solid #5e6d6f; } - html.theme--documenter-dark .content code { - font-weight: inherit; } - html.theme--documenter-dark .content a code { - color: #1abc9c; } - html.theme--documenter-dark .content h1 code, html.theme--documenter-dark .content h2 code, html.theme--documenter-dark .content h3 code, html.theme--documenter-dark .content h4 code, html.theme--documenter-dark .content h5 code, html.theme--documenter-dark .content h6 code { - color: #f2f2f2; } - html.theme--documenter-dark .content table { - display: block; - width: initial; - max-width: 100%; - overflow-x: auto; } - html.theme--documenter-dark .content blockquote > ul:first-child, html.theme--documenter-dark .content blockquote > ol:first-child, html.theme--documenter-dark .content .admonition-body > ul:first-child, html.theme--documenter-dark .content .admonition-body > ol:first-child { - margin-top: 0; } - html.theme--documenter-dark pre, html.theme--documenter-dark code { - font-variant-ligatures: no-contextual; } - html.theme--documenter-dark .breadcrumb a.is-disabled { - cursor: default; - pointer-events: none; } - html.theme--documenter-dark .breadcrumb a.is-disabled, html.theme--documenter-dark .breadcrumb a.is-disabled:hover { - color: #f2f2f2; } - html.theme--documenter-dark .hljs { - background: initial !important; } - html.theme--documenter-dark .katex .katex-mathml { - top: 0; - right: 0; } - html.theme--documenter-dark .katex-display, html.theme--documenter-dark mjx-container, html.theme--documenter-dark .MathJax_Display { - margin: 0.5em 0 !important; } - html.theme--documenter-dark html { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; } - html.theme--documenter-dark li.no-marker { - list-style: none; } - html.theme--documenter-dark #documenter .docs-main > article { - overflow-wrap: break-word; } - html.theme--documenter-dark #documenter .docs-main > article .math-container { - overflow-x: auto; - overflow-y: hidden; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-main { - max-width: 52rem; - margin-left: 20rem; - padding-right: 1rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main { - width: 100%; } - html.theme--documenter-dark #documenter .docs-main > article { - max-width: 52rem; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - padding: 0 1rem; } - html.theme--documenter-dark #documenter .docs-main > header, html.theme--documenter-dark #documenter .docs-main > nav { - max-width: 100%; - width: 100%; - margin: 0; } } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar { - background-color: #1f2424; - border-bottom: 1px solid #5e6d6f; - z-index: 2; - min-height: 4rem; - margin-bottom: 1rem; - display: flex; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb { - flex-grow: 1; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right { - display: flex; - white-space: nowrap; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - display: inline-block; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label { - padding: 0; - margin-left: 0.3em; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { - margin: auto 0 auto 1rem; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - font-size: 1.5rem; - margin: auto 0 auto 1rem; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar > * { - margin: auto 0; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main header.docs-navbar { - position: sticky; - top: 0; - padding: 0 1rem; - /* For Headroom.js */ - transition-property: top, box-shadow; - -webkit-transition-property: top, box-shadow; - /* Safari */ - transition-duration: 0.3s; - -webkit-transition-duration: 0.3s; - /* Safari */ } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top { - box-shadow: 0.2rem 0rem 0.4rem #171717; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { - top: -4.5rem; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } } - html.theme--documenter-dark #documenter .docs-main section.footnotes { - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child, html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child { - margin-right: 1em; - margin-bottom: 0.4em; } - html.theme--documenter-dark #documenter .docs-main .docs-footer { - display: flex; - flex-wrap: wrap; - margin-left: 0; - margin-right: 0; - border-top: 1px solid #5e6d6f; - padding-top: 1rem; - padding-bottom: 1rem; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main .docs-footer { - padding-left: 1rem; - padding-right: 1rem; } } - html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage, html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage { - flex-grow: 1; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage { - text-align: right; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break { - flex-basis: 100%; - height: 0; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message { - font-size: 0.8em; - margin: 0.5em auto 0 auto; - text-align: center; } - html.theme--documenter-dark #documenter .docs-sidebar { - display: flex; - flex-direction: column; - color: #fff; - background-color: #282f2f; - border-right: 1px solid #5e6d6f; - padding: 0; - flex: 0 0 18rem; - z-index: 5; - font-size: 15px; - position: fixed; - left: -18rem; - width: 18rem; - height: 100%; - transition: left 0.3s; - /* Setting up a nicer theme style for the scrollbar */ } - html.theme--documenter-dark #documenter .docs-sidebar.visible { - left: 0; - box-shadow: 0.4rem 0rem 0.8rem #171717; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar.visible { - box-shadow: none; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar { - left: 0; - top: 0; } } - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo { - margin-top: 1rem; - padding: 0 1rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { - max-height: 6rem; - margin: auto; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name { - flex-shrink: 0; - font-size: 1.5rem; - font-weight: 700; - text-align: center; - white-space: nowrap; - overflow: hidden; - padding: 0.5rem 0; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit { - max-width: 16.2rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a, html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover { - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector { - border-top: 1px solid #5e6d6f; - display: none; - padding: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible { - display: flex; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { - flex-grow: 1; - user-select: none; - border-top: 1px solid #5e6d6f; - padding-bottom: 1.5rem; - /* Managing collapsible submenus */ } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li > .tocitem { - font-weight: bold; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li li { - font-size: 14.25px; - margin-left: 1em; - border-left: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { - display: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed { - display: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { - display: block; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem { - display: flex; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { - flex-grow: 2; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - font-size: 11.25px; - margin-left: 1rem; - margin-top: auto; - margin-bottom: auto; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f054"; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { - content: "\f078"; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem { - display: block; - padding: 0.5rem 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover { - color: #fff; - background: #282f2f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { - color: #fff; - background-color: #32393a; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active { - border-top: 1px solid #5e6d6f; - border-bottom: 1px solid #5e6d6f; - background-color: #1f2424; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { - background-color: #1f2424; - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { - background-color: #32393a; - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { - border-top: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal { - margin: 0 0.5rem 0.5rem; - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li { - font-size: 12.75px; - border-left: none; - margin-left: 0; - margin-top: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { - width: 100%; - padding: 0; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { - content: "⚬"; - margin-right: 0.4em; } - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search { - margin: auto; - margin-top: 0.5rem; - margin-bottom: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - width: 14.4rem; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { - width: .3rem; - background: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #3b4445; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { - background: #4e5a5c; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-sidebar { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar { - width: .3rem; - background: none; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #3b4445; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { - background: #4e5a5c; } } - html.theme--documenter-dark #documenter .docs-main #documenter-search-info { - margin-bottom: 1rem; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results { - list-style-type: circle; - list-style-position: outside; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results li { - margin-left: 2rem; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight { - background-color: yellow; } - html.theme--documenter-dark { - background-color: #1f2424; - font-size: 16px; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - html.theme--documenter-dark .ansi span.sgr1 { - font-weight: bolder; } - html.theme--documenter-dark .ansi span.sgr2 { - font-weight: lighter; } - html.theme--documenter-dark .ansi span.sgr3 { - font-style: italic; } - html.theme--documenter-dark .ansi span.sgr4 { - text-decoration: underline; } - html.theme--documenter-dark .ansi span.sgr7 { - color: #1f2424; - background-color: #fff; } - html.theme--documenter-dark .ansi span.sgr8 { - color: transparent; } - html.theme--documenter-dark .ansi span.sgr8 span { - color: transparent; } - html.theme--documenter-dark .ansi span.sgr9 { - text-decoration: line-through; } - html.theme--documenter-dark .ansi span.sgr30 { - color: #242424; } - html.theme--documenter-dark .ansi span.sgr31 { - color: #f6705f; } - html.theme--documenter-dark .ansi span.sgr32 { - color: #4fb43a; } - html.theme--documenter-dark .ansi span.sgr33 { - color: #f4c72f; } - html.theme--documenter-dark .ansi span.sgr34 { - color: #7587f0; } - html.theme--documenter-dark .ansi span.sgr35 { - color: #bc89d3; } - html.theme--documenter-dark .ansi span.sgr36 { - color: #49b6ca; } - html.theme--documenter-dark .ansi span.sgr37 { - color: #b3bdbe; } - html.theme--documenter-dark .ansi span.sgr40 { - background-color: #242424; } - html.theme--documenter-dark .ansi span.sgr41 { - background-color: #f6705f; } - html.theme--documenter-dark .ansi span.sgr42 { - background-color: #4fb43a; } - html.theme--documenter-dark .ansi span.sgr43 { - background-color: #f4c72f; } - html.theme--documenter-dark .ansi span.sgr44 { - background-color: #7587f0; } - html.theme--documenter-dark .ansi span.sgr45 { - background-color: #bc89d3; } - html.theme--documenter-dark .ansi span.sgr46 { - background-color: #49b6ca; } - html.theme--documenter-dark .ansi span.sgr47 { - background-color: #b3bdbe; } - html.theme--documenter-dark .ansi span.sgr90 { - color: #92a0a2; } - html.theme--documenter-dark .ansi span.sgr91 { - color: #ff8674; } - html.theme--documenter-dark .ansi span.sgr92 { - color: #79d462; } - html.theme--documenter-dark .ansi span.sgr93 { - color: #ffe76b; } - html.theme--documenter-dark .ansi span.sgr94 { - color: #8a98ff; } - html.theme--documenter-dark .ansi span.sgr95 { - color: #d2a4e6; } - html.theme--documenter-dark .ansi span.sgr96 { - color: #6bc8db; } - html.theme--documenter-dark .ansi span.sgr97 { - color: #ecf0f1; } - html.theme--documenter-dark .ansi span.sgr100 { - background-color: #92a0a2; } - html.theme--documenter-dark .ansi span.sgr101 { - background-color: #ff8674; } - html.theme--documenter-dark .ansi span.sgr102 { - background-color: #79d462; } - html.theme--documenter-dark .ansi span.sgr103 { - background-color: #ffe76b; } - html.theme--documenter-dark .ansi span.sgr104 { - background-color: #8a98ff; } - html.theme--documenter-dark .ansi span.sgr105 { - background-color: #d2a4e6; } - html.theme--documenter-dark .ansi span.sgr106 { - background-color: #6bc8db; } - html.theme--documenter-dark .ansi span.sgr107 { - background-color: #ecf0f1; } - html.theme--documenter-dark code.language-julia-repl > span.hljs-meta { - color: #4fb43a; - font-weight: bolder; } - html.theme--documenter-dark .hljs { - background: #2b2b2b; - color: #f8f8f2; } - html.theme--documenter-dark .hljs-comment, - html.theme--documenter-dark .hljs-quote { - color: #d4d0ab; } - html.theme--documenter-dark .hljs-variable, - html.theme--documenter-dark .hljs-template-variable, - html.theme--documenter-dark .hljs-tag, - html.theme--documenter-dark .hljs-name, - html.theme--documenter-dark .hljs-selector-id, - html.theme--documenter-dark .hljs-selector-class, - html.theme--documenter-dark .hljs-regexp, - html.theme--documenter-dark .hljs-deletion { - color: #ffa07a; } - html.theme--documenter-dark .hljs-number, - html.theme--documenter-dark .hljs-built_in, - html.theme--documenter-dark .hljs-literal, - html.theme--documenter-dark .hljs-type, - html.theme--documenter-dark .hljs-params, - html.theme--documenter-dark .hljs-meta, - html.theme--documenter-dark .hljs-link { - color: #f5ab35; } - html.theme--documenter-dark .hljs-attribute { - color: #ffd700; } - html.theme--documenter-dark .hljs-string, - html.theme--documenter-dark .hljs-symbol, - html.theme--documenter-dark .hljs-bullet, - html.theme--documenter-dark .hljs-addition { - color: #abe338; } - html.theme--documenter-dark .hljs-title, - html.theme--documenter-dark .hljs-section { - color: #00e0e0; } - html.theme--documenter-dark .hljs-keyword, - html.theme--documenter-dark .hljs-selector-tag { - color: #dcc6e0; } - html.theme--documenter-dark .hljs-emphasis { - font-style: italic; } - html.theme--documenter-dark .hljs-strong { - font-weight: bold; } - @media screen and (-ms-high-contrast: active) { - html.theme--documenter-dark .hljs-addition, - html.theme--documenter-dark .hljs-attribute, - html.theme--documenter-dark .hljs-built_in, - html.theme--documenter-dark .hljs-bullet, - html.theme--documenter-dark .hljs-comment, - html.theme--documenter-dark .hljs-link, - html.theme--documenter-dark .hljs-literal, - html.theme--documenter-dark .hljs-meta, - html.theme--documenter-dark .hljs-number, - html.theme--documenter-dark .hljs-params, - html.theme--documenter-dark .hljs-string, - html.theme--documenter-dark .hljs-symbol, - html.theme--documenter-dark .hljs-type, - html.theme--documenter-dark .hljs-quote { - color: highlight; } - html.theme--documenter-dark .hljs-keyword, - html.theme--documenter-dark .hljs-selector-tag { - font-weight: bold; } } - html.theme--documenter-dark .hljs-subst { - color: #f8f8f2; } +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/dev/assets/themes/documenter-light.css b/dev/assets/themes/documenter-light.css index 9595d5b8..2f168c77 100644 --- a/dev/assets/themes/documenter-light.css +++ b/dev/assets/themes/documenter-light.css @@ -1,7642 +1,4 @@ -@charset "UTF-8"; -/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ -@keyframes spinAround { - from { - transform: rotate(0deg); } - to { - transform: rotate(359deg); } } - -.tabs, .pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .breadcrumb, .file, .button, .is-unselectable, .modal-close, .delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - transform: rotate(-45deg); - transform-origin: center; - width: 0.625em; } - -.admonition:not(:last-child), .tabs:not(:last-child), .message:not(:last-child), .list:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .highlight:not(:last-child), .block:not(:last-child), .title:not(:last-child), -.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { - margin-bottom: 1.5rem; } - -.modal-close, .delete { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; } - .modal-close::before, .delete::before, .modal-close::after, .delete::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - .modal-close::before, .delete::before { - height: 2px; - width: 50%; } - .modal-close::after, .delete::after { - height: 50%; - width: 2px; } - .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { - background-color: rgba(10, 10, 10, 0.3); } - .modal-close:active, .delete:active { - background-color: rgba(10, 10, 10, 0.4); } - .is-small.modal-close, #documenter .docs-sidebar form.docs-search > input.modal-close, .is-small.delete, #documenter .docs-sidebar form.docs-search > input.delete { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; } - .is-medium.modal-close, .is-medium.delete { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; } - .is-large.modal-close, .is-large.delete { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; } - -.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; } - -.hero-video, .modal-background, .modal, .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, -.image.is-square .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, -.image.is-1by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, -.image.is-5by4 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, -.image.is-4by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, -.image.is-3by2 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, -.image.is-5by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, -.image.is-16by9 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, -.image.is-2by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, -.image.is-3by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, -.image.is-4by5 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, -.image.is-3by4 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, -.image.is-2by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, -.image.is-3by5 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, -.image.is-9by16 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, -.image.is-1by2 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, -.image.is-1by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; } - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .file-cta, -.file-name, .select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input, .button { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 4px; - box-shadow: none; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; } - .pagination-previous:focus, - .pagination-next:focus, - .pagination-link:focus, - .pagination-ellipsis:focus, .file-cta:focus, - .file-name:focus, .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .button:focus, .is-focused.pagination-previous, - .is-focused.pagination-next, - .is-focused.pagination-link, - .is-focused.pagination-ellipsis, .is-focused.file-cta, - .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-focused.button, .pagination-previous:active, - .pagination-next:active, - .pagination-link:active, - .pagination-ellipsis:active, .file-cta:active, - .file-name:active, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .button:active, .is-active.pagination-previous, - .is-active.pagination-next, - .is-active.pagination-link, - .is-active.pagination-ellipsis, .is-active.file-cta, - .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .is-active.button { - outline: none; } - .pagination-previous[disabled], - .pagination-next[disabled], - .pagination-link[disabled], - .pagination-ellipsis[disabled], .file-cta[disabled], - .file-name[disabled], .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], .button[disabled], fieldset[disabled] .pagination-previous, - fieldset[disabled] .pagination-next, - fieldset[disabled] .pagination-link, - fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, - fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] .button { - cursor: not-allowed; } - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; } - -ul { - list-style: none; } - -button, -input, -select, -textarea { - margin: 0; } - -html { - box-sizing: border-box; } - -*, *::before, *::after { - box-sizing: inherit; } - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; } - -audio { - max-width: 100%; } - -iframe { - border: 0; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - td:not([align]), - th:not([align]) { - text-align: left; } - -html { - background-color: white; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - -article, -aside, -figure, -footer, -header, -hgroup, -section { - display: block; } - -body, -button, -input, -select, -textarea { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } - -code, -pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } - -body { - color: #222222; - font-size: 1em; - font-weight: 400; - line-height: 1.5; } - -a { - color: #2e63b8; - cursor: pointer; - text-decoration: none; } - a strong { - color: currentColor; } - a:hover { - color: #363636; } - -code { - background-color: rgba(0, 0, 0, 0.05); - color: #000000; - font-size: 0.875em; - font-weight: normal; - padding: 0.1em; } - -hr { - background-color: whitesmoke; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; } - -img { - height: auto; - max-width: 100%; } - -input[type="checkbox"], -input[type="radio"] { - vertical-align: baseline; } - -small { - font-size: 0.875em; } - -span { - font-style: inherit; - font-weight: inherit; } - -strong { - color: #222222; - font-weight: 700; } - -fieldset { - border: none; } - -pre { - -webkit-overflow-scrolling: touch; - background-color: whitesmoke; - color: #222222; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; } - pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; } - -table td, -table th { - vertical-align: top; } - table td:not([align]), - table th:not([align]) { - text-align: left; } - -table th { - color: #222222; } - -.is-clearfix::after { - clear: both; - content: " "; - display: table; } - -.is-pulled-left { - float: left !important; } - -.is-pulled-right { - float: right !important; } - -.is-clipped { - overflow: hidden !important; } - -.is-size-1 { - font-size: 3rem !important; } - -.is-size-2 { - font-size: 2.5rem !important; } - -.is-size-3 { - font-size: 2rem !important; } - -.is-size-4 { - font-size: 1.5rem !important; } - -.is-size-5 { - font-size: 1.25rem !important; } - -.is-size-6 { - font-size: 1rem !important; } - -.is-size-7, .docstring > section > a.docs-sourcelink { - font-size: 0.75rem !important; } - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; } - .is-size-2-mobile { - font-size: 2.5rem !important; } - .is-size-3-mobile { - font-size: 2rem !important; } - .is-size-4-mobile { - font-size: 1.5rem !important; } - .is-size-5-mobile { - font-size: 1.25rem !important; } - .is-size-6-mobile { - font-size: 1rem !important; } - .is-size-7-mobile { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; } - .is-size-2-tablet { - font-size: 2.5rem !important; } - .is-size-3-tablet { - font-size: 2rem !important; } - .is-size-4-tablet { - font-size: 1.5rem !important; } - .is-size-5-tablet { - font-size: 1.25rem !important; } - .is-size-6-tablet { - font-size: 1rem !important; } - .is-size-7-tablet { - font-size: 0.75rem !important; } } - -@media screen and (max-width: 1055px) { - .is-size-1-touch { - font-size: 3rem !important; } - .is-size-2-touch { - font-size: 2.5rem !important; } - .is-size-3-touch { - font-size: 2rem !important; } - .is-size-4-touch { - font-size: 1.5rem !important; } - .is-size-5-touch { - font-size: 1.25rem !important; } - .is-size-6-touch { - font-size: 1rem !important; } - .is-size-7-touch { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1056px) { - .is-size-1-desktop { - font-size: 3rem !important; } - .is-size-2-desktop { - font-size: 2.5rem !important; } - .is-size-3-desktop { - font-size: 2rem !important; } - .is-size-4-desktop { - font-size: 1.5rem !important; } - .is-size-5-desktop { - font-size: 1.25rem !important; } - .is-size-6-desktop { - font-size: 1rem !important; } - .is-size-7-desktop { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1216px) { - .is-size-1-widescreen { - font-size: 3rem !important; } - .is-size-2-widescreen { - font-size: 2.5rem !important; } - .is-size-3-widescreen { - font-size: 2rem !important; } - .is-size-4-widescreen { - font-size: 1.5rem !important; } - .is-size-5-widescreen { - font-size: 1.25rem !important; } - .is-size-6-widescreen { - font-size: 1rem !important; } - .is-size-7-widescreen { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1408px) { - .is-size-1-fullhd { - font-size: 3rem !important; } - .is-size-2-fullhd { - font-size: 2.5rem !important; } - .is-size-3-fullhd { - font-size: 2rem !important; } - .is-size-4-fullhd { - font-size: 1.5rem !important; } - .is-size-5-fullhd { - font-size: 1.25rem !important; } - .is-size-6-fullhd { - font-size: 1rem !important; } - .is-size-7-fullhd { - font-size: 0.75rem !important; } } - -.has-text-centered { - text-align: center !important; } - -.has-text-justified { - text-align: justify !important; } - -.has-text-left { - text-align: left !important; } - -.has-text-right { - text-align: right !important; } - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; } } - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-centered-tablet-only { - text-align: center !important; } } - -@media screen and (max-width: 1055px) { - .has-text-centered-touch { - text-align: center !important; } } - -@media screen and (min-width: 1056px) { - .has-text-centered-desktop { - text-align: center !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-centered-desktop-only { - text-align: center !important; } } - -@media screen and (min-width: 1216px) { - .has-text-centered-widescreen { - text-align: center !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-centered-widescreen-only { - text-align: center !important; } } - -@media screen and (min-width: 1408px) { - .has-text-centered-fullhd { - text-align: center !important; } } - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; } } - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-justified-tablet-only { - text-align: justify !important; } } - -@media screen and (max-width: 1055px) { - .has-text-justified-touch { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) { - .has-text-justified-desktop { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-justified-desktop-only { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) { - .has-text-justified-widescreen { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-justified-widescreen-only { - text-align: justify !important; } } - -@media screen and (min-width: 1408px) { - .has-text-justified-fullhd { - text-align: justify !important; } } - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; } } - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-left-tablet-only { - text-align: left !important; } } - -@media screen and (max-width: 1055px) { - .has-text-left-touch { - text-align: left !important; } } - -@media screen and (min-width: 1056px) { - .has-text-left-desktop { - text-align: left !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-left-desktop-only { - text-align: left !important; } } - -@media screen and (min-width: 1216px) { - .has-text-left-widescreen { - text-align: left !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-left-widescreen-only { - text-align: left !important; } } - -@media screen and (min-width: 1408px) { - .has-text-left-fullhd { - text-align: left !important; } } - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; } } - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-right-tablet-only { - text-align: right !important; } } - -@media screen and (max-width: 1055px) { - .has-text-right-touch { - text-align: right !important; } } - -@media screen and (min-width: 1056px) { - .has-text-right-desktop { - text-align: right !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-right-desktop-only { - text-align: right !important; } } - -@media screen and (min-width: 1216px) { - .has-text-right-widescreen { - text-align: right !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-right-widescreen-only { - text-align: right !important; } } - -@media screen and (min-width: 1408px) { - .has-text-right-fullhd { - text-align: right !important; } } - -.is-capitalized { - text-transform: capitalize !important; } - -.is-lowercase { - text-transform: lowercase !important; } - -.is-uppercase { - text-transform: uppercase !important; } - -.is-italic { - font-style: italic !important; } - -.has-text-white { - color: white !important; } - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; } - -.has-background-white { - background-color: white !important; } - -.has-text-black { - color: #0a0a0a !important; } - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; } - -.has-background-black { - background-color: #0a0a0a !important; } - -.has-text-light { - color: whitesmoke !important; } - -a.has-text-light:hover, a.has-text-light:focus { - color: #dbdbdb !important; } - -.has-background-light { - background-color: whitesmoke !important; } - -.has-text-dark { - color: #363636 !important; } - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #1c1c1c !important; } - -.has-background-dark { - background-color: #363636 !important; } - -.has-text-primary { - color: #4eb5de !important; } - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #27a1d2 !important; } - -.has-background-primary { - background-color: #4eb5de !important; } - -.has-text-link { - color: #2e63b8 !important; } - -a.has-text-link:hover, a.has-text-link:focus { - color: #244d8f !important; } - -.has-background-link { - background-color: #2e63b8 !important; } - -.has-text-info { - color: #209cee !important; } - -a.has-text-info:hover, a.has-text-info:focus { - color: #1081cb !important; } - -.has-background-info { - background-color: #209cee !important; } - -.has-text-success { - color: #22c35b !important; } - -a.has-text-success:hover, a.has-text-success:focus { - color: #1a9847 !important; } - -.has-background-success { - background-color: #22c35b !important; } - -.has-text-warning { - color: #ffdd57 !important; } - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #ffd324 !important; } - -.has-background-warning { - background-color: #ffdd57 !important; } - -.has-text-danger { - color: #da0b00 !important; } - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #a70800 !important; } - -.has-background-danger { - background-color: #da0b00 !important; } - -.has-text-black-bis { - color: #121212 !important; } - -.has-background-black-bis { - background-color: #121212 !important; } - -.has-text-black-ter { - color: #242424 !important; } - -.has-background-black-ter { - background-color: #242424 !important; } - -.has-text-grey-darker { - color: #363636 !important; } - -.has-background-grey-darker { - background-color: #363636 !important; } - -.has-text-grey-dark { - color: #4a4a4a !important; } - -.has-background-grey-dark { - background-color: #4a4a4a !important; } - -.has-text-grey { - color: #6b6b6b !important; } - -.has-background-grey { - background-color: #6b6b6b !important; } - -.has-text-grey-light { - color: #b5b5b5 !important; } - -.has-background-grey-light { - background-color: #b5b5b5 !important; } - -.has-text-grey-lighter { - color: #dbdbdb !important; } - -.has-background-grey-lighter { - background-color: #dbdbdb !important; } - -.has-text-white-ter { - color: whitesmoke !important; } - -.has-background-white-ter { - background-color: whitesmoke !important; } - -.has-text-white-bis { - color: #fafafa !important; } - -.has-background-white-bis { - background-color: #fafafa !important; } - -.has-text-weight-light { - font-weight: 300 !important; } - -.has-text-weight-normal { - font-weight: 400 !important; } - -.has-text-weight-medium { - font-weight: 500 !important; } - -.has-text-weight-semibold { - font-weight: 600 !important; } - -.has-text-weight-bold { - font-weight: 700 !important; } - -.is-family-primary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-secondary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-sans-serif { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-monospace { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-family-code { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-block { - display: block !important; } - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; } } - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-block-tablet-only { - display: block !important; } } - -@media screen and (max-width: 1055px) { - .is-block-touch { - display: block !important; } } - -@media screen and (min-width: 1056px) { - .is-block-desktop { - display: block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-block-desktop-only { - display: block !important; } } - -@media screen and (min-width: 1216px) { - .is-block-widescreen { - display: block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-block-widescreen-only { - display: block !important; } } - -@media screen and (min-width: 1408px) { - .is-block-fullhd { - display: block !important; } } - -.is-flex { - display: flex !important; } - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; } } - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-flex-tablet-only { - display: flex !important; } } - -@media screen and (max-width: 1055px) { - .is-flex-touch { - display: flex !important; } } - -@media screen and (min-width: 1056px) { - .is-flex-desktop { - display: flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-flex-desktop-only { - display: flex !important; } } - -@media screen and (min-width: 1216px) { - .is-flex-widescreen { - display: flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-flex-widescreen-only { - display: flex !important; } } - -@media screen and (min-width: 1408px) { - .is-flex-fullhd { - display: flex !important; } } - -.is-inline { - display: inline !important; } - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-tablet-only { - display: inline !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-touch { - display: inline !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-desktop { - display: inline !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-desktop-only { - display: inline !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-widescreen { - display: inline !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-widescreen-only { - display: inline !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-fullhd { - display: inline !important; } } - -.is-inline-block { - display: inline-block !important; } - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-block-tablet-only { - display: inline-block !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-block-touch { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-block-desktop { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-block-desktop-only { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-block-widescreen { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-block-widescreen-only { - display: inline-block !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-block-fullhd { - display: inline-block !important; } } - -.is-inline-flex { - display: inline-flex !important; } - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-flex-touch { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-flex-desktop { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-flex-widescreen { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-flex-fullhd { - display: inline-flex !important; } } - -.is-hidden { - display: none !important; } - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; } - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; } } - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-hidden-tablet-only { - display: none !important; } } - -@media screen and (max-width: 1055px) { - .is-hidden-touch { - display: none !important; } } - -@media screen and (min-width: 1056px) { - .is-hidden-desktop { - display: none !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-hidden-desktop-only { - display: none !important; } } - -@media screen and (min-width: 1216px) { - .is-hidden-widescreen { - display: none !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-hidden-widescreen-only { - display: none !important; } } - -@media screen and (min-width: 1408px) { - .is-hidden-fullhd { - display: none !important; } } - -.is-invisible { - visibility: hidden !important; } - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; } } - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-invisible-tablet-only { - visibility: hidden !important; } } - -@media screen and (max-width: 1055px) { - .is-invisible-touch { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) { - .is-invisible-desktop { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-invisible-desktop-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) { - .is-invisible-widescreen { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-invisible-widescreen-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1408px) { - .is-invisible-fullhd { - visibility: hidden !important; } } - -.is-marginless { - margin: 0 !important; } - -.is-paddingless { - padding: 0 !important; } - -.is-radiusless { - border-radius: 0 !important; } - -.is-shadowless { - box-shadow: none !important; } - -.is-relative { - position: relative !important; } - -.box { - background-color: white; - border-radius: 6px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #222222; - display: block; - padding: 1.25rem; } - -a.box:hover, a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; } - -a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; } - -.button { - background-color: white; - border-color: #dbdbdb; - border-width: 1px; - color: #363636; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; } - .button strong { - color: inherit; } - .button .icon, .button .icon.is-small, .button #documenter .docs-sidebar form.docs-search > input.icon, #documenter .docs-sidebar .button form.docs-search > input.icon, .button .icon.is-medium, .button .icon.is-large { - height: 1.5em; - width: 1.5em; } - .button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; } - .button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); } - .button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); } - .button:hover, .button.is-hovered { - border-color: #b5b5b5; - color: #363636; } - .button:focus, .button.is-focused { - border-color: #3c5dcd; - color: #363636; } - .button:focus:not(:active), .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .button:active, .button.is-active { - border-color: #4a4a4a; - color: #363636; } - .button.is-text { - background-color: transparent; - border-color: transparent; - color: #222222; - text-decoration: underline; } - .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { - background-color: whitesmoke; - color: #222222; } - .button.is-text:active, .button.is-text.is-active { - background-color: #e8e8e8; - color: #222222; } - .button.is-text[disabled], fieldset[disabled] .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; } - .button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - .button.is-white:hover, .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - .button.is-white:focus, .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; } - .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .button.is-white:active, .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - .button.is-white[disabled], fieldset[disabled] .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; } - .button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; } - .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { - background-color: black; } - .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; } - .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { - background-color: white; - border-color: white; - color: #0a0a0a; } - .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; } - .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { - background-color: #0a0a0a; - color: white; } - .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - .button.is-black:hover, .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; } - .button.is-black:focus, .button.is-black.is-focused { - border-color: transparent; - color: white; } - .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .button.is-black:active, .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; } - .button.is-black[disabled], fieldset[disabled] .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; } - .button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; } - .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; } - .button.is-black.is-loading::after { - border-color: transparent transparent white white !important; } - .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { - background-color: white; - color: #0a0a0a; } - .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - .button.is-light { - background-color: whitesmoke; - border-color: transparent; - color: #363636; } - .button.is-light:hover, .button.is-light.is-hovered { - background-color: #eeeeee; - border-color: transparent; - color: #363636; } - .button.is-light:focus, .button.is-light.is-focused { - border-color: transparent; - color: #363636; } - .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .button.is-light:active, .button.is-light.is-active { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; } - .button.is-light[disabled], fieldset[disabled] .button.is-light { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; } - .button.is-light.is-inverted { - background-color: #363636; - color: whitesmoke; } - .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { - background-color: #292929; } - .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { - background-color: #363636; - border-color: transparent; - box-shadow: none; - color: whitesmoke; } - .button.is-light.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; } - .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; } - .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; } - .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { - background-color: #363636; - color: whitesmoke; } - .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; } - .button.is-dark, .content kbd.button { - background-color: #363636; - border-color: transparent; - color: whitesmoke; } - .button.is-dark:hover, .content kbd.button:hover, .button.is-dark.is-hovered, .content kbd.button.is-hovered { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; } - .button.is-dark:focus, .content kbd.button:focus, .button.is-dark.is-focused, .content kbd.button.is-focused { - border-color: transparent; - color: whitesmoke; } - .button.is-dark:focus:not(:active), .content kbd.button:focus:not(:active), .button.is-dark.is-focused:not(:active), .content kbd.button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .button.is-dark:active, .content kbd.button:active, .button.is-dark.is-active, .content kbd.button.is-active { - background-color: #292929; - border-color: transparent; - color: whitesmoke; } - .button.is-dark[disabled], .content kbd.button[disabled], fieldset[disabled] .button.is-dark, fieldset[disabled] .content kbd.button, .content fieldset[disabled] kbd.button { - background-color: #363636; - border-color: transparent; - box-shadow: none; } - .button.is-dark.is-inverted, .content kbd.button.is-inverted { - background-color: whitesmoke; - color: #363636; } - .button.is-dark.is-inverted:hover, .content kbd.button.is-inverted:hover, .button.is-dark.is-inverted.is-hovered, .content kbd.button.is-inverted.is-hovered { - background-color: #e8e8e8; } - .button.is-dark.is-inverted[disabled], .content kbd.button.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted, fieldset[disabled] .content kbd.button.is-inverted, .content fieldset[disabled] kbd.button.is-inverted { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; - color: #363636; } - .button.is-dark.is-loading::after, .content kbd.button.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-dark.is-outlined, .content kbd.button.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; } - .button.is-dark.is-outlined:hover, .content kbd.button.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .content kbd.button.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .content kbd.button.is-outlined:focus, .button.is-dark.is-outlined.is-focused, .content kbd.button.is-outlined.is-focused { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .button.is-dark.is-outlined.is-loading::after, .content kbd.button.is-outlined.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-dark.is-outlined.is-loading:hover::after, .content kbd.button.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .content kbd.button.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after, .content kbd.button.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-dark.is-outlined[disabled], .content kbd.button.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined, fieldset[disabled] .content kbd.button.is-outlined, .content fieldset[disabled] kbd.button.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; } - .button.is-dark.is-inverted.is-outlined, .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; } - .button.is-dark.is-inverted.is-outlined:hover, .content kbd.button.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .content kbd.button.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .content kbd.button.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused, .content kbd.button.is-inverted.is-outlined.is-focused { - background-color: whitesmoke; - color: #363636; } - .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-dark.is-inverted.is-outlined[disabled], .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined, fieldset[disabled] .content kbd.button.is-inverted.is-outlined, .content fieldset[disabled] kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; } - .button.is-primary, .docstring > section > a.button.docs-sourcelink { - background-color: #4eb5de; - border-color: transparent; - color: #fff; } - .button.is-primary:hover, .docstring > section > a.button.docs-sourcelink:hover, .button.is-primary.is-hovered, .docstring > section > a.button.is-hovered.docs-sourcelink { - background-color: #43b1dc; - border-color: transparent; - color: #fff; } - .button.is-primary:focus, .docstring > section > a.button.docs-sourcelink:focus, .button.is-primary.is-focused, .docstring > section > a.button.is-focused.docs-sourcelink { - border-color: transparent; - color: #fff; } - .button.is-primary:focus:not(:active), .docstring > section > a.button.docs-sourcelink:focus:not(:active), .button.is-primary.is-focused:not(:active), .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .button.is-primary:active, .docstring > section > a.button.docs-sourcelink:active, .button.is-primary.is-active, .docstring > section > a.button.is-active.docs-sourcelink { - background-color: #39acda; - border-color: transparent; - color: #fff; } - .button.is-primary[disabled], .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary, fieldset[disabled] .docstring > section > a.button.docs-sourcelink { - background-color: #4eb5de; - border-color: transparent; - box-shadow: none; } - .button.is-primary.is-inverted, .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - color: #4eb5de; } - .button.is-primary.is-inverted:hover, .docstring > section > a.button.is-inverted.docs-sourcelink:hover, .button.is-primary.is-inverted.is-hovered, .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { - background-color: #f2f2f2; } - .button.is-primary.is-inverted[disabled], .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted, fieldset[disabled] .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #4eb5de; } - .button.is-primary.is-loading::after, .docstring > section > a.button.is-loading.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-primary.is-outlined, .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #4eb5de; - color: #4eb5de; } - .button.is-primary.is-outlined:hover, .docstring > section > a.button.is-outlined.docs-sourcelink:hover, .button.is-primary.is-outlined.is-hovered, .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-outlined:focus, .docstring > section > a.button.is-outlined.docs-sourcelink:focus, .button.is-primary.is-outlined.is-focused, .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { - background-color: #4eb5de; - border-color: #4eb5de; - color: #fff; } - .button.is-primary.is-outlined.is-loading::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { - border-color: transparent transparent #4eb5de #4eb5de !important; } - .button.is-primary.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-primary.is-outlined[disabled], .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-outlined, fieldset[disabled] .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #4eb5de; - box-shadow: none; - color: #4eb5de; } - .button.is-primary.is-inverted.is-outlined, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-primary.is-inverted.is-outlined:hover, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-inverted.is-outlined:focus, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, .button.is-primary.is-inverted.is-outlined.is-focused, .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { - background-color: #fff; - color: #4eb5de; } - .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #4eb5de #4eb5de !important; } - .button.is-primary.is-inverted.is-outlined[disabled], .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined, fieldset[disabled] .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-link { - background-color: #2e63b8; - border-color: transparent; - color: #fff; } - .button.is-link:hover, .button.is-link.is-hovered { - background-color: #2b5eae; - border-color: transparent; - color: #fff; } - .button.is-link:focus, .button.is-link.is-focused { - border-color: transparent; - color: #fff; } - .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .button.is-link:active, .button.is-link.is-active { - background-color: #2958a4; - border-color: transparent; - color: #fff; } - .button.is-link[disabled], fieldset[disabled] .button.is-link { - background-color: #2e63b8; - border-color: transparent; - box-shadow: none; } - .button.is-link.is-inverted { - background-color: #fff; - color: #2e63b8; } - .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #2e63b8; } - .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-link.is-outlined { - background-color: transparent; - border-color: #2e63b8; - color: #2e63b8; } - .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #2e63b8 #2e63b8 !important; } - .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { - background-color: transparent; - border-color: #2e63b8; - box-shadow: none; - color: #2e63b8; } - .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #2e63b8; } - .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #2e63b8 #2e63b8 !important; } - .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-info { - background-color: #209cee; - border-color: transparent; - color: #fff; } - .button.is-info:hover, .button.is-info.is-hovered { - background-color: #1497ed; - border-color: transparent; - color: #fff; } - .button.is-info:focus, .button.is-info.is-focused { - border-color: transparent; - color: #fff; } - .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .button.is-info:active, .button.is-info.is-active { - background-color: #1190e3; - border-color: transparent; - color: #fff; } - .button.is-info[disabled], fieldset[disabled] .button.is-info { - background-color: #209cee; - border-color: transparent; - box-shadow: none; } - .button.is-info.is-inverted { - background-color: #fff; - color: #209cee; } - .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #209cee; } - .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - color: #209cee; } - .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { - background-color: #209cee; - border-color: #209cee; - color: #fff; } - .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #209cee #209cee !important; } - .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - box-shadow: none; - color: #209cee; } - .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #209cee; } - .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #209cee #209cee !important; } - .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-success { - background-color: #22c35b; - border-color: transparent; - color: #fff; } - .button.is-success:hover, .button.is-success.is-hovered { - background-color: #20b856; - border-color: transparent; - color: #fff; } - .button.is-success:focus, .button.is-success.is-focused { - border-color: transparent; - color: #fff; } - .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .button.is-success:active, .button.is-success.is-active { - background-color: #1ead51; - border-color: transparent; - color: #fff; } - .button.is-success[disabled], fieldset[disabled] .button.is-success { - background-color: #22c35b; - border-color: transparent; - box-shadow: none; } - .button.is-success.is-inverted { - background-color: #fff; - color: #22c35b; } - .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #22c35b; } - .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-success.is-outlined { - background-color: transparent; - border-color: #22c35b; - color: #22c35b; } - .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { - background-color: #22c35b; - border-color: #22c35b; - color: #fff; } - .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #22c35b #22c35b !important; } - .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { - background-color: transparent; - border-color: #22c35b; - box-shadow: none; - color: #22c35b; } - .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #22c35b; } - .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #22c35b #22c35b !important; } - .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:hover, .button.is-warning.is-hovered { - background-color: #ffda4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:focus, .button.is-warning.is-focused { - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .button.is-warning:active, .button.is-warning.is-active { - background-color: #ffd83e; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning[disabled], fieldset[disabled] .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - box-shadow: none; } - .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { - background-color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - border-color: transparent; - box-shadow: none; - color: #ffdd57; } - .button.is-warning.is-loading::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } - .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - color: #ffdd57; } - .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; } - .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } - .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - box-shadow: none; - color: #ffdd57; } - .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; } - .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - box-shadow: none; - color: rgba(0, 0, 0, 0.7); } - .button.is-danger { - background-color: #da0b00; - border-color: transparent; - color: #fff; } - .button.is-danger:hover, .button.is-danger.is-hovered { - background-color: #cd0a00; - border-color: transparent; - color: #fff; } - .button.is-danger:focus, .button.is-danger.is-focused { - border-color: transparent; - color: #fff; } - .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .button.is-danger:active, .button.is-danger.is-active { - background-color: #c10a00; - border-color: transparent; - color: #fff; } - .button.is-danger[disabled], fieldset[disabled] .button.is-danger { - background-color: #da0b00; - border-color: transparent; - box-shadow: none; } - .button.is-danger.is-inverted { - background-color: #fff; - color: #da0b00; } - .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #da0b00; } - .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-danger.is-outlined { - background-color: transparent; - border-color: #da0b00; - color: #da0b00; } - .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { - background-color: #da0b00; - border-color: #da0b00; - color: #fff; } - .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #da0b00 #da0b00 !important; } - .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { - background-color: transparent; - border-color: #da0b00; - box-shadow: none; - color: #da0b00; } - .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #da0b00; } - .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #da0b00 #da0b00 !important; } - .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-small, #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 2px; - font-size: 0.75rem; } - .button.is-normal { - font-size: 1rem; } - .button.is-medium { - font-size: 1.25rem; } - .button.is-large { - font-size: 1.5rem; } - .button[disabled], fieldset[disabled] .button { - background-color: white; - border-color: #dbdbdb; - box-shadow: none; - opacity: 0.5; } - .button.is-fullwidth { - display: flex; - width: 100%; } - .button.is-loading { - color: transparent !important; - pointer-events: none; } - .button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; } - .button.is-static { - background-color: whitesmoke; - border-color: #dbdbdb; - color: #6b6b6b; - box-shadow: none; - pointer-events: none; } - .button.is-rounded, #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - -.buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .buttons .button { - margin-bottom: 0.5rem; } - .buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; } - .buttons:last-child { - margin-bottom: -0.5rem; } - .buttons:not(:last-child) { - margin-bottom: 1rem; } - .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 2px; - font-size: 0.75rem; } - .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; } - .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; } - .buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; } - .buttons.has-addons .button:last-child { - margin-right: 0; } - .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { - z-index: 2; } - .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { - z-index: 3; } - .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { - z-index: 4; } - .buttons.has-addons .button.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .buttons.is-centered { - justify-content: center; } - .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - .buttons.is-right { - justify-content: flex-end; } - .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - -.container { - flex-grow: 1; - margin: 0 auto; - position: relative; - width: auto; } - @media screen and (min-width: 1056px) { - .container { - max-width: 992px; } - .container.is-fluid { - margin-left: 32px; - margin-right: 32px; - max-width: none; } } - @media screen and (max-width: 1215px) { - .container.is-widescreen { - max-width: 1152px; } } - @media screen and (max-width: 1407px) { - .container.is-fullhd { - max-width: 1344px; } } - @media screen and (min-width: 1216px) { - .container { - max-width: 1152px; } } - @media screen and (min-width: 1408px) { - .container { - max-width: 1344px; } } -.content li + li { - margin-top: 0.25em; } - -.content p:not(:last-child), -.content dl:not(:last-child), -.content ol:not(:last-child), -.content ul:not(:last-child), -.content blockquote:not(:last-child), -.content pre:not(:last-child), -.content table:not(:last-child) { - margin-bottom: 1em; } - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5, -.content h6 { - color: #222222; - font-weight: 600; - line-height: 1.125; } - -.content h1 { - font-size: 2em; - margin-bottom: 0.5em; } - .content h1:not(:first-child) { - margin-top: 1em; } - -.content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; } - .content h2:not(:first-child) { - margin-top: 1.1428em; } - -.content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; } - .content h3:not(:first-child) { - margin-top: 1.3333em; } - -.content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; } - -.content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; } - -.content h6 { - font-size: 1em; - margin-bottom: 1em; } - -.content blockquote { - background-color: whitesmoke; - border-left: 5px solid #dbdbdb; - padding: 1.25em 1.5em; } - -.content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; } - .content ol:not([type]) { - list-style-type: decimal; } - .content ol.is-lower-alpha:not([type]) { - list-style-type: lower-alpha; } - .content ol.is-lower-roman:not([type]) { - list-style-type: lower-roman; } - .content ol.is-upper-alpha:not([type]) { - list-style-type: upper-alpha; } - .content ol.is-upper-roman:not([type]) { - list-style-type: upper-roman; } - -.content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; } - .content ul ul { - list-style-type: circle; - margin-top: 0.5em; } - .content ul ul ul { - list-style-type: square; } - -.content dd { - margin-left: 2em; } - -.content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; } - .content figure:not(:first-child) { - margin-top: 2em; } - .content figure:not(:last-child) { - margin-bottom: 2em; } - .content figure img { - display: inline-block; } - .content figure figcaption { - font-style: italic; } - -.content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 0; - white-space: pre; - word-wrap: normal; } - -.content sup, -.content sub { - font-size: 75%; } - -.content table { - width: 100%; } - .content table td, - .content table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - .content table th { - color: #222222; } - .content table th:not([align]) { - text-align: left; } - .content table thead td, - .content table thead th { - border-width: 0 0 2px; - color: #222222; } - .content table tfoot td, - .content table tfoot th { - border-width: 2px 0 0; - color: #222222; } - .content table tbody tr:last-child td, - .content table tbody tr:last-child th { - border-bottom-width: 0; } - -.content .tabs li + li { - margin-top: 0; } - -.content.is-small, #documenter .docs-sidebar form.docs-search > input.content { - font-size: 0.75rem; } - -.content.is-medium { - font-size: 1.25rem; } - -.content.is-large { - font-size: 1.5rem; } - -.icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; } - .icon.is-small, #documenter .docs-sidebar form.docs-search > input.icon { - height: 1rem; - width: 1rem; } - .icon.is-medium { - height: 2rem; - width: 2rem; } - .icon.is-large { - height: 3rem; - width: 3rem; } - -.image, #documenter .docs-sidebar .docs-logo > img { - display: block; - position: relative; } - .image img, #documenter .docs-sidebar .docs-logo > img img { - display: block; - height: auto; - width: 100%; } - .image img.is-rounded, #documenter .docs-sidebar .docs-logo > img img.is-rounded { - border-radius: 290486px; } - .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, - .image.is-square .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, - .image.is-1by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, - .image.is-5by4 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, - .image.is-4by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, - .image.is-3by2 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, - .image.is-5by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, - .image.is-16by9 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, - .image.is-2by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, - .image.is-3by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, - .image.is-4by5 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, - .image.is-3by4 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, - .image.is-2by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, - .image.is-3by5 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, - .image.is-9by16 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, - .image.is-1by2 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, - .image.is-1by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { - height: 100%; - width: 100%; } - .image.is-square, #documenter .docs-sidebar .docs-logo > img.is-square, .image.is-1by1, #documenter .docs-sidebar .docs-logo > img.is-1by1 { - padding-top: 100%; } - .image.is-5by4, #documenter .docs-sidebar .docs-logo > img.is-5by4 { - padding-top: 80%; } - .image.is-4by3, #documenter .docs-sidebar .docs-logo > img.is-4by3 { - padding-top: 75%; } - .image.is-3by2, #documenter .docs-sidebar .docs-logo > img.is-3by2 { - padding-top: 66.6666%; } - .image.is-5by3, #documenter .docs-sidebar .docs-logo > img.is-5by3 { - padding-top: 60%; } - .image.is-16by9, #documenter .docs-sidebar .docs-logo > img.is-16by9 { - padding-top: 56.25%; } - .image.is-2by1, #documenter .docs-sidebar .docs-logo > img.is-2by1 { - padding-top: 50%; } - .image.is-3by1, #documenter .docs-sidebar .docs-logo > img.is-3by1 { - padding-top: 33.3333%; } - .image.is-4by5, #documenter .docs-sidebar .docs-logo > img.is-4by5 { - padding-top: 125%; } - .image.is-3by4, #documenter .docs-sidebar .docs-logo > img.is-3by4 { - padding-top: 133.3333%; } - .image.is-2by3, #documenter .docs-sidebar .docs-logo > img.is-2by3 { - padding-top: 150%; } - .image.is-3by5, #documenter .docs-sidebar .docs-logo > img.is-3by5 { - padding-top: 166.6666%; } - .image.is-9by16, #documenter .docs-sidebar .docs-logo > img.is-9by16 { - padding-top: 177.7777%; } - .image.is-1by2, #documenter .docs-sidebar .docs-logo > img.is-1by2 { - padding-top: 200%; } - .image.is-1by3, #documenter .docs-sidebar .docs-logo > img.is-1by3 { - padding-top: 300%; } - .image.is-16x16, #documenter .docs-sidebar .docs-logo > img.is-16x16 { - height: 16px; - width: 16px; } - .image.is-24x24, #documenter .docs-sidebar .docs-logo > img.is-24x24 { - height: 24px; - width: 24px; } - .image.is-32x32, #documenter .docs-sidebar .docs-logo > img.is-32x32 { - height: 32px; - width: 32px; } - .image.is-48x48, #documenter .docs-sidebar .docs-logo > img.is-48x48 { - height: 48px; - width: 48px; } - .image.is-64x64, #documenter .docs-sidebar .docs-logo > img.is-64x64 { - height: 64px; - width: 64px; } - .image.is-96x96, #documenter .docs-sidebar .docs-logo > img.is-96x96 { - height: 96px; - width: 96px; } - .image.is-128x128, #documenter .docs-sidebar .docs-logo > img.is-128x128 { - height: 128px; - width: 128px; } - -.notification { - background-color: whitesmoke; - border-radius: 4px; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; } - .notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - .notification strong { - color: currentColor; } - .notification code, - .notification pre { - background: white; } - .notification pre code { - background: transparent; } - .notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; } - .notification .title, - .notification .subtitle, - .notification .content { - color: currentColor; } - .notification.is-white { - background-color: white; - color: #0a0a0a; } - .notification.is-black { - background-color: #0a0a0a; - color: white; } - .notification.is-light { - background-color: whitesmoke; - color: #363636; } - .notification.is-dark, .content kbd.notification { - background-color: #363636; - color: whitesmoke; } - .notification.is-primary, .docstring > section > a.notification.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .notification.is-link { - background-color: #2e63b8; - color: #fff; } - .notification.is-info { - background-color: #209cee; - color: #fff; } - .notification.is-success { - background-color: #22c35b; - color: #fff; } - .notification.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .notification.is-danger { - background-color: #da0b00; - color: #fff; } - -.progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 1rem; - overflow: hidden; - padding: 0; - width: 100%; } - .progress::-webkit-progress-bar { - background-color: #dbdbdb; } - .progress::-webkit-progress-value { - background-color: #222222; } - .progress::-moz-progress-bar { - background-color: #222222; } - .progress::-ms-fill { - background-color: #222222; - border: none; } - .progress.is-white::-webkit-progress-value { - background-color: white; } - .progress.is-white::-moz-progress-bar { - background-color: white; } - .progress.is-white::-ms-fill { - background-color: white; } - .progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); } - .progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; } - .progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; } - .progress.is-black::-ms-fill { - background-color: #0a0a0a; } - .progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); } - .progress.is-light::-webkit-progress-value { - background-color: whitesmoke; } - .progress.is-light::-moz-progress-bar { - background-color: whitesmoke; } - .progress.is-light::-ms-fill { - background-color: whitesmoke; } - .progress.is-light:indeterminate { - background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); } - .progress.is-dark::-webkit-progress-value, .content kbd.progress::-webkit-progress-value { - background-color: #363636; } - .progress.is-dark::-moz-progress-bar, .content kbd.progress::-moz-progress-bar { - background-color: #363636; } - .progress.is-dark::-ms-fill, .content kbd.progress::-ms-fill { - background-color: #363636; } - .progress.is-dark:indeterminate, .content kbd.progress:indeterminate { - background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); } - .progress.is-primary::-webkit-progress-value, .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { - background-color: #4eb5de; } - .progress.is-primary::-moz-progress-bar, .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { - background-color: #4eb5de; } - .progress.is-primary::-ms-fill, .docstring > section > a.progress.docs-sourcelink::-ms-fill { - background-color: #4eb5de; } - .progress.is-primary:indeterminate, .docstring > section > a.progress.docs-sourcelink:indeterminate { - background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); } - .progress.is-link::-webkit-progress-value { - background-color: #2e63b8; } - .progress.is-link::-moz-progress-bar { - background-color: #2e63b8; } - .progress.is-link::-ms-fill { - background-color: #2e63b8; } - .progress.is-link:indeterminate { - background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); } - .progress.is-info::-webkit-progress-value { - background-color: #209cee; } - .progress.is-info::-moz-progress-bar { - background-color: #209cee; } - .progress.is-info::-ms-fill { - background-color: #209cee; } - .progress.is-info:indeterminate { - background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); } - .progress.is-success::-webkit-progress-value { - background-color: #22c35b; } - .progress.is-success::-moz-progress-bar { - background-color: #22c35b; } - .progress.is-success::-ms-fill { - background-color: #22c35b; } - .progress.is-success:indeterminate { - background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); } - .progress.is-warning::-webkit-progress-value { - background-color: #ffdd57; } - .progress.is-warning::-moz-progress-bar { - background-color: #ffdd57; } - .progress.is-warning::-ms-fill { - background-color: #ffdd57; } - .progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); } - .progress.is-danger::-webkit-progress-value { - background-color: #da0b00; } - .progress.is-danger::-moz-progress-bar { - background-color: #da0b00; } - .progress.is-danger::-ms-fill { - background-color: #da0b00; } - .progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); } - .progress:indeterminate { - animation-duration: 1.5s; - animation-iteration-count: infinite; - animation-name: moveIndeterminate; - animation-timing-function: linear; - background-color: #dbdbdb; - background-image: linear-gradient(to right, #222222 30%, #dbdbdb 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; } - .progress:indeterminate::-webkit-progress-bar { - background-color: transparent; } - .progress:indeterminate::-moz-progress-bar { - background-color: transparent; } - .progress.is-small, #documenter .docs-sidebar form.docs-search > input.progress { - height: 0.75rem; } - .progress.is-medium { - height: 1.25rem; } - .progress.is-large { - height: 1.5rem; } - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; } - to { - background-position: -200% 0; } } - -.table { - background-color: white; - color: #363636; } - .table td, - .table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - .table td.is-white, - .table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; } - .table td.is-black, - .table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .table td.is-light, - .table th.is-light { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .table td.is-dark, - .table th.is-dark { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .table td.is-primary, - .table th.is-primary { - background-color: #4eb5de; - border-color: #4eb5de; - color: #fff; } - .table td.is-link, - .table th.is-link { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - .table td.is-info, - .table th.is-info { - background-color: #209cee; - border-color: #209cee; - color: #fff; } - .table td.is-success, - .table th.is-success { - background-color: #22c35b; - border-color: #22c35b; - color: #fff; } - .table td.is-warning, - .table th.is-warning { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .table td.is-danger, - .table th.is-danger { - background-color: #da0b00; - border-color: #da0b00; - color: #fff; } - .table td.is-narrow, - .table th.is-narrow { - white-space: nowrap; - width: 1%; } - .table td.is-selected, - .table th.is-selected { - background-color: #4eb5de; - color: #fff; } - .table td.is-selected a, - .table td.is-selected strong, - .table th.is-selected a, - .table th.is-selected strong { - color: currentColor; } - .table th { - color: #222222; } - .table th:not([align]) { - text-align: left; } - .table tr.is-selected { - background-color: #4eb5de; - color: #fff; } - .table tr.is-selected a, - .table tr.is-selected strong { - color: currentColor; } - .table tr.is-selected td, - .table tr.is-selected th { - border-color: #fff; - color: currentColor; } - .table thead { - background-color: transparent; } - .table thead td, - .table thead th { - border-width: 0 0 2px; - color: #222222; } - .table tfoot { - background-color: transparent; } - .table tfoot td, - .table tfoot th { - border-width: 2px 0 0; - color: #222222; } - .table tbody { - background-color: transparent; } - .table tbody tr:last-child td, - .table tbody tr:last-child th { - border-bottom-width: 0; } - .table.is-bordered td, - .table.is-bordered th { - border-width: 1px; } - .table.is-bordered tr:last-child td, - .table.is-bordered tr:last-child th { - border-bottom-width: 1px; } - .table.is-fullwidth { - width: 100%; } - .table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #fafafa; } - .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #fafafa; } - .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: whitesmoke; } - .table.is-narrow td, - .table.is-narrow th { - padding: 0.25em 0.5em; } - .table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #fafafa; } - -.table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; } - -.tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .tags .tag, .tags .content kbd, .content .tags kbd, .tags .docstring > section > a.docs-sourcelink { - margin-bottom: 0.5rem; } - .tags .tag:not(:last-child), .tags .content kbd:not(:last-child), .content .tags kbd:not(:last-child), .tags .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0.5rem; } - .tags:last-child { - margin-bottom: -0.5rem; } - .tags:not(:last-child) { - margin-bottom: 1rem; } - .tags.are-medium .tag:not(.is-normal):not(.is-large), .tags.are-medium .content kbd:not(.is-normal):not(.is-large), .content .tags.are-medium kbd:not(.is-normal):not(.is-large), .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { - font-size: 1rem; } - .tags.are-large .tag:not(.is-normal):not(.is-medium), .tags.are-large .content kbd:not(.is-normal):not(.is-medium), .content .tags.are-large kbd:not(.is-normal):not(.is-medium), .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; } - .tags.is-centered { - justify-content: center; } - .tags.is-centered .tag, .tags.is-centered .content kbd, .content .tags.is-centered kbd, .tags.is-centered .docstring > section > a.docs-sourcelink { - margin-right: 0.25rem; - margin-left: 0.25rem; } - .tags.is-right { - justify-content: flex-end; } - .tags.is-right .tag:not(:first-child), .tags.is-right .content kbd:not(:first-child), .content .tags.is-right kbd:not(:first-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0.5rem; } - .tags.is-right .tag:not(:last-child), .tags.is-right .content kbd:not(:last-child), .content .tags.is-right kbd:not(:last-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0; } - .tags.has-addons .tag, .tags.has-addons .content kbd, .content .tags.has-addons kbd, .tags.has-addons .docstring > section > a.docs-sourcelink { - margin-right: 0; } - .tags.has-addons .tag:not(:first-child), .tags.has-addons .content kbd:not(:first-child), .content .tags.has-addons kbd:not(:first-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .tags.has-addons .tag:not(:last-child), .tags.has-addons .content kbd:not(:last-child), .content .tags.has-addons kbd:not(:last-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.tag:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink:not(body) { - align-items: center; - background-color: whitesmoke; - border-radius: 4px; - color: #222222; - display: inline-flex; - font-size: 0.75rem; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - .tag:not(body) .delete, .content kbd:not(body) .delete, .docstring > section > a.docs-sourcelink:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; } - .tag.is-white:not(body), .content kbd.is-white:not(body), .docstring > section > a.docs-sourcelink.is-white:not(body) { - background-color: white; - color: #0a0a0a; } - .tag.is-black:not(body), .content kbd.is-black:not(body), .docstring > section > a.docs-sourcelink.is-black:not(body) { - background-color: #0a0a0a; - color: white; } - .tag.is-light:not(body), .content kbd.is-light:not(body), .docstring > section > a.docs-sourcelink.is-light:not(body) { - background-color: whitesmoke; - color: #363636; } - .tag.is-dark:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink.is-dark:not(body), .content .docstring > section > kbd:not(body) { - background-color: #363636; - color: whitesmoke; } - .tag.is-primary:not(body), .content kbd.is-primary:not(body), .docstring > section > a.docs-sourcelink:not(body) { - background-color: #4eb5de; - color: #fff; } - .tag.is-link:not(body), .content kbd.is-link:not(body), .docstring > section > a.docs-sourcelink.is-link:not(body) { - background-color: #2e63b8; - color: #fff; } - .tag.is-info:not(body), .content kbd.is-info:not(body), .docstring > section > a.docs-sourcelink.is-info:not(body) { - background-color: #209cee; - color: #fff; } - .tag.is-success:not(body), .content kbd.is-success:not(body), .docstring > section > a.docs-sourcelink.is-success:not(body) { - background-color: #22c35b; - color: #fff; } - .tag.is-warning:not(body), .content kbd.is-warning:not(body), .docstring > section > a.docs-sourcelink.is-warning:not(body) { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .tag.is-danger:not(body), .content kbd.is-danger:not(body), .docstring > section > a.docs-sourcelink.is-danger:not(body) { - background-color: #da0b00; - color: #fff; } - .tag.is-normal:not(body), .content kbd.is-normal:not(body), .docstring > section > a.docs-sourcelink.is-normal:not(body) { - font-size: 0.75rem; } - .tag.is-medium:not(body), .content kbd.is-medium:not(body), .docstring > section > a.docs-sourcelink.is-medium:not(body) { - font-size: 1rem; } - .tag.is-large:not(body), .content kbd.is-large:not(body), .docstring > section > a.docs-sourcelink.is-large:not(body) { - font-size: 1.25rem; } - .tag:not(body) .icon:first-child:not(:last-child), .content kbd:not(body) .icon:first-child:not(:last-child), .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; } - .tag:not(body) .icon:last-child:not(:first-child), .content kbd:not(body) .icon:last-child:not(:first-child), .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; } - .tag:not(body) .icon:first-child:last-child, .content kbd:not(body) .icon:first-child:last-child, .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; } - .tag.is-delete:not(body), .content kbd.is-delete:not(body), .docstring > section > a.docs-sourcelink.is-delete:not(body) { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; } - .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { - height: 1px; - width: 50%; } - .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - height: 50%; - width: 1px; } - .tag.is-delete:not(body):hover, .content kbd.is-delete:not(body):hover, .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, .tag.is-delete:not(body):focus, .content kbd.is-delete:not(body):focus, .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { - background-color: #e8e8e8; } - .tag.is-delete:not(body):active, .content kbd.is-delete:not(body):active, .docstring > section > a.docs-sourcelink.is-delete:not(body):active { - background-color: #dbdbdb; } - .tag.is-rounded:not(body), #documenter .docs-sidebar form.docs-search > input:not(body), .content kbd.is-rounded:not(body), #documenter .docs-sidebar .content form.docs-search > input:not(body), .docstring > section > a.docs-sourcelink.is-rounded:not(body) { - border-radius: 290486px; } - -a.tag:hover, .docstring > section > a.docs-sourcelink:hover { - text-decoration: underline; } - -.title, -.subtitle { - word-break: break-word; } - .title em, - .title span, - .subtitle em, - .subtitle span { - font-weight: inherit; } - .title sub, - .subtitle sub { - font-size: 0.75em; } - .title sup, - .subtitle sup { - font-size: 0.75em; } - .title .tag, .title .content kbd, .content .title kbd, .title .docstring > section > a.docs-sourcelink, - .subtitle .tag, - .subtitle .content kbd, - .content .subtitle kbd, - .subtitle .docstring > section > a.docs-sourcelink { - vertical-align: middle; } - -.title { - color: #363636; - font-size: 2rem; - font-weight: 600; - line-height: 1.125; } - .title strong { - color: inherit; - font-weight: inherit; } - .title + .highlight { - margin-top: -0.75rem; } - .title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; } - .title.is-1 { - font-size: 3rem; } - .title.is-2 { - font-size: 2.5rem; } - .title.is-3 { - font-size: 2rem; } - .title.is-4 { - font-size: 1.5rem; } - .title.is-5 { - font-size: 1.25rem; } - .title.is-6 { - font-size: 1rem; } - .title.is-7 { - font-size: 0.75rem; } - -.subtitle { - color: #4a4a4a; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; } - .subtitle strong { - color: #363636; - font-weight: 600; } - .subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; } - .subtitle.is-1 { - font-size: 3rem; } - .subtitle.is-2 { - font-size: 2.5rem; } - .subtitle.is-3 { - font-size: 2rem; } - .subtitle.is-4 { - font-size: 1.5rem; } - .subtitle.is-5 { - font-size: 1.25rem; } - .subtitle.is-6 { - font-size: 1rem; } - .subtitle.is-7 { - font-size: 0.75rem; } - -.heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; } - -.highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; } - .highlight pre { - overflow: auto; - max-width: 100%; } - -.number { - align-items: center; - background-color: whitesmoke; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; } - -.select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input { - background-color: white; - border-color: #dbdbdb; - border-radius: 4px; - color: #363636; } - .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:hover, .textarea:hover, .input:hover, #documenter .docs-sidebar form.docs-search > input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input, #documenter .docs-sidebar form.docs-search > input.is-hovered { - border-color: #b5b5b5; } - .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - border-color: #2e63b8; - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #6b6b6b; } - .select select[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .input[disabled]::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-moz-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .input[disabled]::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-webkit-input-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .input[disabled]:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-moz-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .input[disabled]:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-ms-input-placeholder { - color: rgba(107, 107, 107, 0.3); } - -.textarea, .input, #documenter .docs-sidebar form.docs-search > input { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; } - .textarea[readonly], .input[readonly], #documenter .docs-sidebar form.docs-search > input[readonly] { - box-shadow: none; } - .is-white.textarea, .is-white.input, #documenter .docs-sidebar form.docs-search > input.is-white { - border-color: white; } - .is-white.textarea:focus, .is-white.input:focus, #documenter .docs-sidebar form.docs-search > input.is-white:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-white.textarea:active, .is-white.input:active, #documenter .docs-sidebar form.docs-search > input.is-white:active, .is-white.is-active.textarea, .is-white.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .is-black.textarea, .is-black.input, #documenter .docs-sidebar form.docs-search > input.is-black { - border-color: #0a0a0a; } - .is-black.textarea:focus, .is-black.input:focus, #documenter .docs-sidebar form.docs-search > input.is-black:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-black.textarea:active, .is-black.input:active, #documenter .docs-sidebar form.docs-search > input.is-black:active, .is-black.is-active.textarea, .is-black.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .is-light.textarea, .is-light.input, #documenter .docs-sidebar form.docs-search > input.is-light { - border-color: whitesmoke; } - .is-light.textarea:focus, .is-light.input:focus, #documenter .docs-sidebar form.docs-search > input.is-light:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-light.textarea:active, .is-light.input:active, #documenter .docs-sidebar form.docs-search > input.is-light:active, .is-light.is-active.textarea, .is-light.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .is-dark.textarea, .content kbd.textarea, .is-dark.input, #documenter .docs-sidebar form.docs-search > input.is-dark, .content kbd.input { - border-color: #363636; } - .is-dark.textarea:focus, .content kbd.textarea:focus, .is-dark.input:focus, #documenter .docs-sidebar form.docs-search > input.is-dark:focus, .content kbd.input:focus, .is-dark.is-focused.textarea, .content kbd.is-focused.textarea, .is-dark.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .content kbd.is-focused.input, #documenter .docs-sidebar .content form.docs-search > input.is-focused, .is-dark.textarea:active, .content kbd.textarea:active, .is-dark.input:active, #documenter .docs-sidebar form.docs-search > input.is-dark:active, .content kbd.input:active, .is-dark.is-active.textarea, .content kbd.is-active.textarea, .is-dark.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .content kbd.is-active.input, #documenter .docs-sidebar .content form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .is-primary.textarea, .docstring > section > a.textarea.docs-sourcelink, .is-primary.input, #documenter .docs-sidebar form.docs-search > input.is-primary, .docstring > section > a.input.docs-sourcelink { - border-color: #4eb5de; } - .is-primary.textarea:focus, .docstring > section > a.textarea.docs-sourcelink:focus, .is-primary.input:focus, #documenter .docs-sidebar form.docs-search > input.is-primary:focus, .docstring > section > a.input.docs-sourcelink:focus, .is-primary.is-focused.textarea, .docstring > section > a.is-focused.textarea.docs-sourcelink, .is-primary.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .docstring > section > a.is-focused.input.docs-sourcelink, .is-primary.textarea:active, .docstring > section > a.textarea.docs-sourcelink:active, .is-primary.input:active, #documenter .docs-sidebar form.docs-search > input.is-primary:active, .docstring > section > a.input.docs-sourcelink:active, .is-primary.is-active.textarea, .docstring > section > a.is-active.textarea.docs-sourcelink, .is-primary.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .docstring > section > a.is-active.input.docs-sourcelink { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .is-link.textarea, .is-link.input, #documenter .docs-sidebar form.docs-search > input.is-link { - border-color: #2e63b8; } - .is-link.textarea:focus, .is-link.input:focus, #documenter .docs-sidebar form.docs-search > input.is-link:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-link.textarea:active, .is-link.input:active, #documenter .docs-sidebar form.docs-search > input.is-link:active, .is-link.is-active.textarea, .is-link.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .is-info.textarea, .is-info.input, #documenter .docs-sidebar form.docs-search > input.is-info { - border-color: #209cee; } - .is-info.textarea:focus, .is-info.input:focus, #documenter .docs-sidebar form.docs-search > input.is-info:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-info.textarea:active, .is-info.input:active, #documenter .docs-sidebar form.docs-search > input.is-info:active, .is-info.is-active.textarea, .is-info.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .is-success.textarea, .is-success.input, #documenter .docs-sidebar form.docs-search > input.is-success { - border-color: #22c35b; } - .is-success.textarea:focus, .is-success.input:focus, #documenter .docs-sidebar form.docs-search > input.is-success:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-success.textarea:active, .is-success.input:active, #documenter .docs-sidebar form.docs-search > input.is-success:active, .is-success.is-active.textarea, .is-success.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .is-warning.textarea, .is-warning.input, #documenter .docs-sidebar form.docs-search > input.is-warning { - border-color: #ffdd57; } - .is-warning.textarea:focus, .is-warning.input:focus, #documenter .docs-sidebar form.docs-search > input.is-warning:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-warning.textarea:active, .is-warning.input:active, #documenter .docs-sidebar form.docs-search > input.is-warning:active, .is-warning.is-active.textarea, .is-warning.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .is-danger.textarea, .is-danger.input, #documenter .docs-sidebar form.docs-search > input.is-danger { - border-color: #da0b00; } - .is-danger.textarea:focus, .is-danger.input:focus, #documenter .docs-sidebar form.docs-search > input.is-danger:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-danger.textarea:active, .is-danger.input:active, #documenter .docs-sidebar form.docs-search > input.is-danger:active, .is-danger.is-active.textarea, .is-danger.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .is-small.textarea, .is-small.input, #documenter .docs-sidebar form.docs-search > input { - border-radius: 2px; - font-size: 0.75rem; } - .is-medium.textarea, .is-medium.input, #documenter .docs-sidebar form.docs-search > input.is-medium { - font-size: 1.25rem; } - .is-large.textarea, .is-large.input, #documenter .docs-sidebar form.docs-search > input.is-large { - font-size: 1.5rem; } - .is-fullwidth.textarea, .is-fullwidth.input, #documenter .docs-sidebar form.docs-search > input.is-fullwidth { - display: block; - width: 100%; } - .is-inline.textarea, .is-inline.input, #documenter .docs-sidebar form.docs-search > input.is-inline { - display: inline; - width: auto; } - -.input.is-rounded, #documenter .docs-sidebar form.docs-search > input { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - -.input.is-static, #documenter .docs-sidebar form.docs-search > input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; } - -.textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; } - .textarea:not([rows]) { - max-height: 600px; - min-height: 120px; } - .textarea[rows] { - height: initial; } - .textarea.has-fixed-size { - resize: none; } - -.radio, .checkbox { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; } - .radio input, .checkbox input { - cursor: pointer; } - .radio:hover, .checkbox:hover { - color: #363636; } - .radio[disabled], .checkbox[disabled], fieldset[disabled] .radio, fieldset[disabled] .checkbox { - color: #6b6b6b; - cursor: not-allowed; } - -.radio + .radio { - margin-left: 0.5em; } - -.select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; } - .select:not(.is-multiple) { - height: 2.25em; } - .select:not(.is-multiple):not(.is-loading)::after { - border-color: #2e63b8; - right: 1.125em; - z-index: 4; } - .select.is-rounded select, #documenter .docs-sidebar form.docs-search > input.select select { - border-radius: 290486px; - padding-left: 1em; } - .select select { - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; } - .select select::-ms-expand { - display: none; } - .select select[disabled]:hover, fieldset[disabled] .select select:hover { - border-color: whitesmoke; } - .select select:not([multiple]) { - padding-right: 2.5em; } - .select select[multiple] { - height: auto; - padding: 0; } - .select select[multiple] option { - padding: 0.5em 1em; } - .select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #363636; } - .select.is-white:not(:hover)::after { - border-color: white; } - .select.is-white select { - border-color: white; } - .select.is-white select:hover, .select.is-white select.is-hovered { - border-color: #f2f2f2; } - .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .select.is-black:not(:hover)::after { - border-color: #0a0a0a; } - .select.is-black select { - border-color: #0a0a0a; } - .select.is-black select:hover, .select.is-black select.is-hovered { - border-color: black; } - .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .select.is-light:not(:hover)::after { - border-color: whitesmoke; } - .select.is-light select { - border-color: whitesmoke; } - .select.is-light select:hover, .select.is-light select.is-hovered { - border-color: #e8e8e8; } - .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .select.is-dark:not(:hover)::after, .content kbd.select:not(:hover)::after { - border-color: #363636; } - .select.is-dark select, .content kbd.select select { - border-color: #363636; } - .select.is-dark select:hover, .content kbd.select select:hover, .select.is-dark select.is-hovered, .content kbd.select select.is-hovered { - border-color: #292929; } - .select.is-dark select:focus, .content kbd.select select:focus, .select.is-dark select.is-focused, .content kbd.select select.is-focused, .select.is-dark select:active, .content kbd.select select:active, .select.is-dark select.is-active, .content kbd.select select.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .select.is-primary:not(:hover)::after, .docstring > section > a.select.docs-sourcelink:not(:hover)::after { - border-color: #4eb5de; } - .select.is-primary select, .docstring > section > a.select.docs-sourcelink select { - border-color: #4eb5de; } - .select.is-primary select:hover, .docstring > section > a.select.docs-sourcelink select:hover, .select.is-primary select.is-hovered, .docstring > section > a.select.docs-sourcelink select.is-hovered { - border-color: #39acda; } - .select.is-primary select:focus, .docstring > section > a.select.docs-sourcelink select:focus, .select.is-primary select.is-focused, .docstring > section > a.select.docs-sourcelink select.is-focused, .select.is-primary select:active, .docstring > section > a.select.docs-sourcelink select:active, .select.is-primary select.is-active, .docstring > section > a.select.docs-sourcelink select.is-active { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .select.is-link:not(:hover)::after { - border-color: #2e63b8; } - .select.is-link select { - border-color: #2e63b8; } - .select.is-link select:hover, .select.is-link select.is-hovered { - border-color: #2958a4; } - .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .select.is-info:not(:hover)::after { - border-color: #209cee; } - .select.is-info select { - border-color: #209cee; } - .select.is-info select:hover, .select.is-info select.is-hovered { - border-color: #1190e3; } - .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .select.is-success:not(:hover)::after { - border-color: #22c35b; } - .select.is-success select { - border-color: #22c35b; } - .select.is-success select:hover, .select.is-success select.is-hovered { - border-color: #1ead51; } - .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .select.is-warning:not(:hover)::after { - border-color: #ffdd57; } - .select.is-warning select { - border-color: #ffdd57; } - .select.is-warning select:hover, .select.is-warning select.is-hovered { - border-color: #ffd83e; } - .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .select.is-danger:not(:hover)::after { - border-color: #da0b00; } - .select.is-danger select { - border-color: #da0b00; } - .select.is-danger select:hover, .select.is-danger select.is-hovered { - border-color: #c10a00; } - .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .select.is-small, #documenter .docs-sidebar form.docs-search > input.select { - border-radius: 2px; - font-size: 0.75rem; } - .select.is-medium { - font-size: 1.25rem; } - .select.is-large { - font-size: 1.5rem; } - .select.is-disabled::after { - border-color: #6b6b6b; } - .select.is-fullwidth { - width: 100%; } - .select.is-fullwidth select { - width: 100%; } - .select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - transform: none; } - .select.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.75rem; } - .select.is-loading.is-medium:after { - font-size: 1.25rem; } - .select.is-loading.is-large:after { - font-size: 1.5rem; } - -.file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; } - .file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; } - .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - .file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; } - .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; } - .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; } - .file.is-light .file-cta { - background-color: whitesmoke; - border-color: transparent; - color: #363636; } - .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { - background-color: #eeeeee; - border-color: transparent; - color: #363636; } - .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); - color: #363636; } - .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; } - .file.is-dark .file-cta, .content kbd.file .file-cta { - background-color: #363636; - border-color: transparent; - color: whitesmoke; } - .file.is-dark:hover .file-cta, .content kbd.file:hover .file-cta, .file.is-dark.is-hovered .file-cta, .content kbd.file.is-hovered .file-cta { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; } - .file.is-dark:focus .file-cta, .content kbd.file:focus .file-cta, .file.is-dark.is-focused .file-cta, .content kbd.file.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); - color: whitesmoke; } - .file.is-dark:active .file-cta, .content kbd.file:active .file-cta, .file.is-dark.is-active .file-cta, .content kbd.file.is-active .file-cta { - background-color: #292929; - border-color: transparent; - color: whitesmoke; } - .file.is-primary .file-cta, .docstring > section > a.file.docs-sourcelink .file-cta { - background-color: #4eb5de; - border-color: transparent; - color: #fff; } - .file.is-primary:hover .file-cta, .docstring > section > a.file.docs-sourcelink:hover .file-cta, .file.is-primary.is-hovered .file-cta, .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { - background-color: #43b1dc; - border-color: transparent; - color: #fff; } - .file.is-primary:focus .file-cta, .docstring > section > a.file.docs-sourcelink:focus .file-cta, .file.is-primary.is-focused .file-cta, .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); - color: #fff; } - .file.is-primary:active .file-cta, .docstring > section > a.file.docs-sourcelink:active .file-cta, .file.is-primary.is-active .file-cta, .docstring > section > a.file.is-active.docs-sourcelink .file-cta { - background-color: #39acda; - border-color: transparent; - color: #fff; } - .file.is-link .file-cta { - background-color: #2e63b8; - border-color: transparent; - color: #fff; } - .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { - background-color: #2b5eae; - border-color: transparent; - color: #fff; } - .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); - color: #fff; } - .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { - background-color: #2958a4; - border-color: transparent; - color: #fff; } - .file.is-info .file-cta { - background-color: #209cee; - border-color: transparent; - color: #fff; } - .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { - background-color: #1497ed; - border-color: transparent; - color: #fff; } - .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); - color: #fff; } - .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { - background-color: #1190e3; - border-color: transparent; - color: #fff; } - .file.is-success .file-cta { - background-color: #22c35b; - border-color: transparent; - color: #fff; } - .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { - background-color: #20b856; - border-color: transparent; - color: #fff; } - .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); - color: #fff; } - .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { - background-color: #1ead51; - border-color: transparent; - color: #fff; } - .file.is-warning .file-cta { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { - background-color: #ffda4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { - background-color: #ffd83e; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-danger .file-cta { - background-color: #da0b00; - border-color: transparent; - color: #fff; } - .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { - background-color: #cd0a00; - border-color: transparent; - color: #fff; } - .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); - color: #fff; } - .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { - background-color: #c10a00; - border-color: transparent; - color: #fff; } - .file.is-small, #documenter .docs-sidebar form.docs-search > input.file { - font-size: 0.75rem; } - .file.is-medium { - font-size: 1.25rem; } - .file.is-medium .file-icon .fa { - font-size: 21px; } - .file.is-large { - font-size: 1.5rem; } - .file.is-large .file-icon .fa { - font-size: 28px; } - .file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - .file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .file.has-name.is-empty .file-cta { - border-radius: 4px; } - .file.has-name.is-empty .file-name { - display: none; } - .file.is-boxed .file-label { - flex-direction: column; } - .file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; } - .file.is-boxed .file-name { - border-width: 0 1px 1px; } - .file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; } - .file.is-boxed .file-icon .fa { - font-size: 21px; } - .file.is-boxed.is-small .file-icon .fa, #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { - font-size: 14px; } - .file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; } - .file.is-boxed.is-large .file-icon .fa { - font-size: 35px; } - .file.is-boxed.has-name .file-cta { - border-radius: 4px 4px 0 0; } - .file.is-boxed.has-name .file-name { - border-radius: 0 0 4px 4px; - border-width: 0 1px 1px; } - .file.is-centered { - justify-content: center; } - .file.is-fullwidth .file-label { - width: 100%; } - .file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; } - .file.is-right { - justify-content: flex-end; } - .file.is-right .file-cta { - border-radius: 0 4px 4px 0; } - .file.is-right .file-name { - border-radius: 4px 0 0 4px; - border-width: 1px 0 1px 1px; - order: -1; } - -.file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; } - .file-label:hover .file-cta { - background-color: #eeeeee; - color: #363636; } - .file-label:hover .file-name { - border-color: #d5d5d5; } - .file-label:active .file-cta { - background-color: #e8e8e8; - color: #363636; } - .file-label:active .file-name { - border-color: #cfcfcf; } - -.file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; } - -.file-cta, -.file-name { - border-color: #dbdbdb; - border-radius: 4px; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; } - -.file-cta { - background-color: whitesmoke; - color: #4a4a4a; } - -.file-name { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; } - -.file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; } - .file-icon .fa { - font-size: 14px; } - -.label { - color: #363636; - display: block; - font-size: 1rem; - font-weight: 700; } - .label:not(:last-child) { - margin-bottom: 0.5em; } - .label.is-small, #documenter .docs-sidebar form.docs-search > input.label { - font-size: 0.75rem; } - .label.is-medium { - font-size: 1.25rem; } - .label.is-large { - font-size: 1.5rem; } - -.help { - display: block; - font-size: 0.75rem; - margin-top: 0.25rem; } - .help.is-white { - color: white; } - .help.is-black { - color: #0a0a0a; } - .help.is-light { - color: whitesmoke; } - .help.is-dark, .content kbd.help { - color: #363636; } - .help.is-primary, .docstring > section > a.help.docs-sourcelink { - color: #4eb5de; } - .help.is-link { - color: #2e63b8; } - .help.is-info { - color: #209cee; } - .help.is-success { - color: #22c35b; } - .help.is-warning { - color: #ffdd57; } - .help.is-danger { - color: #da0b00; } - -.field:not(:last-child) { - margin-bottom: 0.75rem; } - -.field.has-addons { - display: flex; - justify-content: flex-start; } - .field.has-addons .control:not(:last-child) { - margin-right: -1px; } - .field.has-addons .control:not(:first-child):not(:last-child) .button, - .field.has-addons .control:not(:first-child):not(:last-child) .input, - .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, - .field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; } - .field.has-addons .control:first-child:not(:only-child) .button, - .field.has-addons .control:first-child:not(:only-child) .input, - .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, - .field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - .field.has-addons .control:last-child:not(:only-child) .button, - .field.has-addons .control:last-child:not(:only-child) .input, - .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, - .field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button.is-hovered:not([disabled]), - .field.has-addons .control .input:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, - .field.has-addons .control .input.is-hovered:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), - .field.has-addons .control .select select:not([disabled]):hover, - .field.has-addons .control .select select.is-hovered:not([disabled]) { - z-index: 2; } - .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button.is-focused:not([disabled]), .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button.is-active:not([disabled]), - .field.has-addons .control .input:not([disabled]):focus, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, - .field.has-addons .control .input.is-focused:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), - .field.has-addons .control .input:not([disabled]):active, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, - .field.has-addons .control .input.is-active:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), - .field.has-addons .control .select select:not([disabled]):focus, - .field.has-addons .control .select select.is-focused:not([disabled]), - .field.has-addons .control .select select:not([disabled]):active, - .field.has-addons .control .select select.is-active:not([disabled]) { - z-index: 3; } - .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button.is-focused:not([disabled]):hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button.is-active:not([disabled]):hover, - .field.has-addons .control .input:not([disabled]):focus:hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, - .field.has-addons .control .input.is-focused:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, - .field.has-addons .control .input:not([disabled]):active:hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, - .field.has-addons .control .input.is-active:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, - .field.has-addons .control .select select:not([disabled]):focus:hover, - .field.has-addons .control .select select.is-focused:not([disabled]):hover, - .field.has-addons .control .select select:not([disabled]):active:hover, - .field.has-addons .control .select select.is-active:not([disabled]):hover { - z-index: 4; } - .field.has-addons .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .field.has-addons.has-addons-centered { - justify-content: center; } - .field.has-addons.has-addons-right { - justify-content: flex-end; } - .field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; } - -.field.is-grouped { - display: flex; - justify-content: flex-start; } - .field.is-grouped > .control { - flex-shrink: 0; } - .field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - .field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .field.is-grouped.is-grouped-centered { - justify-content: center; } - .field.is-grouped.is-grouped-right { - justify-content: flex-end; } - .field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; } - .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; } - .field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; } - .field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; } - -@media screen and (min-width: 769px), print { - .field.is-horizontal { - display: flex; } } - -.field-label .label { - font-size: inherit; } - -@media screen and (max-width: 768px) { - .field-label { - margin-bottom: 0.5rem; } } - -@media screen and (min-width: 769px), print { - .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; } - .field-label.is-small, #documenter .docs-sidebar form.docs-search > input.field-label { - font-size: 0.75rem; - padding-top: 0.375em; } - .field-label.is-normal { - padding-top: 0.375em; } - .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; } - .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; } } - -.field-body .field .field { - margin-bottom: 0; } - -@media screen and (min-width: 769px), print { - .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; } - .field-body .field { - margin-bottom: 0; } - .field-body > .field { - flex-shrink: 1; } - .field-body > .field:not(.is-narrow) { - flex-grow: 1; } - .field-body > .field:not(:last-child) { - margin-right: 0.75rem; } } - -.control { - box-sizing: border-box; - clear: both; - font-size: 1rem; - position: relative; - text-align: left; } - .control.has-icons-left .input:focus ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, - .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, - .control.has-icons-right .select:focus ~ .icon { - color: #6b6b6b; } - .control.has-icons-left .input.is-small ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, - .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, - .control.has-icons-right .select.is-small ~ .icon { - font-size: 0.75rem; } - .control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, - .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, - .control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; } - .control.has-icons-left .input.is-large ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, - .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, - .control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; } - .control.has-icons-left .icon, .control.has-icons-right .icon { - color: #dbdbdb; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; } - .control.has-icons-left .input, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, - .control.has-icons-left .select select { - padding-left: 2.25em; } - .control.has-icons-left .icon.is-left { - left: 0; } - .control.has-icons-right .input, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, - .control.has-icons-right .select select { - padding-right: 2.25em; } - .control.has-icons-right .icon.is-right { - right: 0; } - .control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; } - .control.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.75rem; } - .control.is-loading.is-medium:after { - font-size: 1.25rem; } - .control.is-loading.is-large:after { - font-size: 1.5rem; } - -.breadcrumb { - font-size: 1rem; - white-space: nowrap; } - .breadcrumb a { - align-items: center; - color: #2e63b8; - display: flex; - justify-content: center; - padding: 0 0.75em; } - .breadcrumb a:hover { - color: #363636; } - .breadcrumb li { - align-items: center; - display: flex; } - .breadcrumb li:first-child a { - padding-left: 0; } - .breadcrumb li.is-active a { - color: #222222; - cursor: default; - pointer-events: none; } - .breadcrumb li + li::before { - color: #b5b5b5; - content: "\0002f"; } - .breadcrumb ul, - .breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .breadcrumb .icon:first-child { - margin-right: 0.5em; } - .breadcrumb .icon:last-child { - margin-left: 0.5em; } - .breadcrumb.is-centered ol, - .breadcrumb.is-centered ul { - justify-content: center; } - .breadcrumb.is-right ol, - .breadcrumb.is-right ul { - justify-content: flex-end; } - .breadcrumb.is-small, #documenter .docs-sidebar form.docs-search > input.breadcrumb { - font-size: 0.75rem; } - .breadcrumb.is-medium { - font-size: 1.25rem; } - .breadcrumb.is-large { - font-size: 1.5rem; } - .breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; } - .breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; } - .breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; } - .breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; } - -.card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #222222; - max-width: 100%; - position: relative; } - -.card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; } - -.card-header-title { - align-items: center; - color: #222222; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; } - .card-header-title.is-centered { - justify-content: center; } - -.card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; } - -.card-image { - display: block; - position: relative; } - -.card-content { - background-color: transparent; - padding: 1.5rem; } - -.card-footer { - background-color: transparent; - border-top: 1px solid #dbdbdb; - align-items: stretch; - display: flex; } - -.card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; } - .card-footer-item:not(:last-child) { - border-right: 1px solid #dbdbdb; } - -.card .media:not(:last-child) { - margin-bottom: 1.5rem; } - -.dropdown { - display: inline-flex; - position: relative; - vertical-align: top; } - .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { - display: block; } - .dropdown.is-right .dropdown-menu { - left: auto; - right: 0; } - .dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; } - -.dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; } - -.dropdown-content { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - -.dropdown-item { - color: #4a4a4a; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; } - -a.dropdown-item, -button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; } - a.dropdown-item:hover, - button.dropdown-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - a.dropdown-item.is-active, - button.dropdown-item.is-active { - background-color: #2e63b8; - color: #fff; } - -.dropdown-divider { - background-color: #dbdbdb; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; } - -.level { - align-items: center; - justify-content: space-between; } - .level code { - border-radius: 4px; } - .level img { - display: inline-block; - vertical-align: top; } - .level.is-mobile { - display: flex; } - .level.is-mobile .level-left, - .level.is-mobile .level-right { - display: flex; } - .level.is-mobile .level-left + .level-right { - margin-top: 0; } - .level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - .level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - .level { - display: flex; } - .level > .level-item:not(.is-narrow) { - flex-grow: 1; } } -.level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; } - .level-item .title, - .level-item .subtitle { - margin-bottom: 0; } - @media screen and (max-width: 768px) { - .level-item:not(:last-child) { - margin-bottom: 0.75rem; } } -.level-left, -.level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - .level-left .level-item.is-flexible, - .level-right .level-item.is-flexible { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - .level-left .level-item:not(:last-child), - .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; } } -.level-left { - align-items: center; - justify-content: flex-start; } - @media screen and (max-width: 768px) { - .level-left + .level-right { - margin-top: 1.5rem; } } - @media screen and (min-width: 769px), print { - .level-left { - display: flex; } } -.level-right { - align-items: center; - justify-content: flex-end; } - @media screen and (min-width: 769px), print { - .level-right { - display: flex; } } -.list { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } - -.list-item { - display: block; - padding: 0.5em 1em; } - .list-item:not(a) { - color: #222222; } - .list-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; } - .list-item:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; } - .list-item:not(:last-child) { - border-bottom: 1px solid #dbdbdb; } - .list-item.is-active { - background-color: #2e63b8; - color: #fff; } - -a.list-item { - background-color: whitesmoke; - cursor: pointer; } - -.media { - align-items: flex-start; - display: flex; - text-align: left; } - .media .content:not(:last-child) { - margin-bottom: 0.75rem; } - .media .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - display: flex; - padding-top: 0.75rem; } - .media .media .content:not(:last-child), - .media .media .control:not(:last-child) { - margin-bottom: 0.5rem; } - .media .media .media { - padding-top: 0.5rem; } - .media .media .media + .media { - margin-top: 0.5rem; } - .media + .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - margin-top: 1rem; - padding-top: 1rem; } - .media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; } - -.media-left, -.media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - -.media-left { - margin-right: 1rem; } - -.media-right { - margin-left: 1rem; } - -.media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; } - -@media screen and (max-width: 768px) { - .media-content { - overflow-x: auto; } } - -.menu { - font-size: 1rem; } - .menu.is-small, #documenter .docs-sidebar form.docs-search > input.menu { - font-size: 0.75rem; } - .menu.is-medium { - font-size: 1.25rem; } - .menu.is-large { - font-size: 1.5rem; } - -.menu-list { - line-height: 1.25; } - .menu-list a { - border-radius: 2px; - color: #222222; - display: block; - padding: 0.5em 0.75em; } - .menu-list a:hover { - background-color: whitesmoke; - color: #222222; } - .menu-list a.is-active { - background-color: #2e63b8; - color: #fff; } - .menu-list li ul { - border-left: 1px solid #dbdbdb; - margin: 0.75em; - padding-left: 0.75em; } - -.menu-label { - color: #6b6b6b; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; } - .menu-label:not(:first-child) { - margin-top: 1em; } - .menu-label:not(:last-child) { - margin-bottom: 1em; } - -.message { - background-color: whitesmoke; - border-radius: 4px; - font-size: 1rem; } - .message strong { - color: currentColor; } - .message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - .message.is-small, #documenter .docs-sidebar form.docs-search > input.message { - font-size: 0.75rem; } - .message.is-medium { - font-size: 1.25rem; } - .message.is-large { - font-size: 1.5rem; } - .message.is-white { - background-color: white; } - .message.is-white .message-header { - background-color: white; - color: #0a0a0a; } - .message.is-white .message-body { - border-color: white; - color: #4d4d4d; } - .message.is-black { - background-color: #fafafa; } - .message.is-black .message-header { - background-color: #0a0a0a; - color: white; } - .message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; } - .message.is-light { - background-color: #fafafa; } - .message.is-light .message-header { - background-color: whitesmoke; - color: #363636; } - .message.is-light .message-body { - border-color: whitesmoke; - color: #505050; } - .message.is-dark, .content kbd.message { - background-color: #fafafa; } - .message.is-dark .message-header, .content kbd.message .message-header { - background-color: #363636; - color: whitesmoke; } - .message.is-dark .message-body, .content kbd.message .message-body { - border-color: #363636; - color: #2a2a2a; } - .message.is-primary, .docstring > section > a.message.docs-sourcelink { - background-color: #f6fbfd; } - .message.is-primary .message-header, .docstring > section > a.message.docs-sourcelink .message-header { - background-color: #4eb5de; - color: #fff; } - .message.is-primary .message-body, .docstring > section > a.message.docs-sourcelink .message-body { - border-color: #4eb5de; - color: #1f556a; } - .message.is-link { - background-color: #f7f9fd; } - .message.is-link .message-header { - background-color: #2e63b8; - color: #fff; } - .message.is-link .message-body { - border-color: #2e63b8; - color: #264981; } - .message.is-info { - background-color: #f6fbfe; } - .message.is-info .message-header { - background-color: #209cee; - color: #fff; } - .message.is-info .message-body { - border-color: #209cee; - color: #12537d; } - .message.is-success { - background-color: #f6fdf9; } - .message.is-success .message-header { - background-color: #22c35b; - color: #fff; } - .message.is-success .message-body { - border-color: #22c35b; - color: #0f361d; } - .message.is-warning { - background-color: #fffdf5; } - .message.is-warning .message-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .message.is-warning .message-body { - border-color: #ffdd57; - color: #3c3108; } - .message.is-danger { - background-color: #fff5f5; } - .message.is-danger .message-header { - background-color: #da0b00; - color: #fff; } - .message.is-danger .message-body { - border-color: #da0b00; - color: #9b0c04; } - -.message-header { - align-items: center; - background-color: #222222; - border-radius: 4px 4px 0 0; - color: #fff; - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; } - .message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; } - .message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.message-body { - border-color: #dbdbdb; - border-radius: 4px; - border-style: solid; - border-width: 0 0 0 4px; - color: #222222; - padding: 1.25em 1.5em; } - .message-body code, - .message-body pre { - background-color: white; } - .message-body pre code { - background-color: transparent; } - -.modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; } - .modal.is-active { - display: flex; } - -.modal-background { - background-color: rgba(10, 10, 10, 0.86); } - -.modal-content, -.modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; } - @media screen and (min-width: 769px), print { - .modal-content, - .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; } } -.modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; } - -.modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; } - -.modal-card-head, -.modal-card-foot { - align-items: center; - background-color: whitesmoke; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; } - -.modal-card-head { - border-bottom: 1px solid #dbdbdb; - border-top-left-radius: 6px; - border-top-right-radius: 6px; } - -.modal-card-title { - color: #222222; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; } - -.modal-card-foot { - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 1px solid #dbdbdb; } - .modal-card-foot .button:not(:last-child) { - margin-right: 0.5em; } - -.modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; } - -.navbar { - background-color: white; - min-height: 3.25rem; - position: relative; - z-index: 30; } - .navbar.is-white { - background-color: white; - color: #0a0a0a; } - .navbar.is-white .navbar-brand > .navbar-item, - .navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; } - .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, - .navbar.is-white .navbar-brand .navbar-link:focus, - .navbar.is-white .navbar-brand .navbar-link:hover, - .navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; } - .navbar.is-white .navbar-burger { - color: #0a0a0a; } - @media screen and (min-width: 1056px) { - .navbar.is-white .navbar-start > .navbar-item, - .navbar.is-white .navbar-start .navbar-link, - .navbar.is-white .navbar-end > .navbar-item, - .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; } - .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, - .navbar.is-white .navbar-start .navbar-link:focus, - .navbar.is-white .navbar-start .navbar-link:hover, - .navbar.is-white .navbar-start .navbar-link.is-active, - .navbar.is-white .navbar-end > a.navbar-item:focus, - .navbar.is-white .navbar-end > a.navbar-item:hover, - .navbar.is-white .navbar-end > a.navbar-item.is-active, - .navbar.is-white .navbar-end .navbar-link:focus, - .navbar.is-white .navbar-end .navbar-link:hover, - .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-start .navbar-link::after, - .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; } - .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; } } - .navbar.is-black { - background-color: #0a0a0a; - color: white; } - .navbar.is-black .navbar-brand > .navbar-item, - .navbar.is-black .navbar-brand .navbar-link { - color: white; } - .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, - .navbar.is-black .navbar-brand .navbar-link:focus, - .navbar.is-black .navbar-brand .navbar-link:hover, - .navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; } - .navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; } - .navbar.is-black .navbar-burger { - color: white; } - @media screen and (min-width: 1056px) { - .navbar.is-black .navbar-start > .navbar-item, - .navbar.is-black .navbar-start .navbar-link, - .navbar.is-black .navbar-end > .navbar-item, - .navbar.is-black .navbar-end .navbar-link { - color: white; } - .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, - .navbar.is-black .navbar-start .navbar-link:focus, - .navbar.is-black .navbar-start .navbar-link:hover, - .navbar.is-black .navbar-start .navbar-link.is-active, - .navbar.is-black .navbar-end > a.navbar-item:focus, - .navbar.is-black .navbar-end > a.navbar-item:hover, - .navbar.is-black .navbar-end > a.navbar-item.is-active, - .navbar.is-black .navbar-end .navbar-link:focus, - .navbar.is-black .navbar-end .navbar-link:hover, - .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; } - .navbar.is-black .navbar-start .navbar-link::after, - .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; } - .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; } - .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; } } - .navbar.is-light { - background-color: whitesmoke; - color: #363636; } - .navbar.is-light .navbar-brand > .navbar-item, - .navbar.is-light .navbar-brand .navbar-link { - color: #363636; } - .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, - .navbar.is-light .navbar-brand .navbar-link:focus, - .navbar.is-light .navbar-brand .navbar-link:hover, - .navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-brand .navbar-link::after { - border-color: #363636; } - .navbar.is-light .navbar-burger { - color: #363636; } - @media screen and (min-width: 1056px) { - .navbar.is-light .navbar-start > .navbar-item, - .navbar.is-light .navbar-start .navbar-link, - .navbar.is-light .navbar-end > .navbar-item, - .navbar.is-light .navbar-end .navbar-link { - color: #363636; } - .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, - .navbar.is-light .navbar-start .navbar-link:focus, - .navbar.is-light .navbar-start .navbar-link:hover, - .navbar.is-light .navbar-start .navbar-link.is-active, - .navbar.is-light .navbar-end > a.navbar-item:focus, - .navbar.is-light .navbar-end > a.navbar-item:hover, - .navbar.is-light .navbar-end > a.navbar-item.is-active, - .navbar.is-light .navbar-end .navbar-link:focus, - .navbar.is-light .navbar-end .navbar-link:hover, - .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-start .navbar-link::after, - .navbar.is-light .navbar-end .navbar-link::after { - border-color: #363636; } - .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #363636; } } - .navbar.is-dark, .content kbd.navbar { - background-color: #363636; - color: whitesmoke; } - .navbar.is-dark .navbar-brand > .navbar-item, .content kbd.navbar .navbar-brand > .navbar-item, - .navbar.is-dark .navbar-brand .navbar-link, - .content kbd.navbar .navbar-brand .navbar-link { - color: whitesmoke; } - .navbar.is-dark .navbar-brand > a.navbar-item:focus, .content kbd.navbar .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .content kbd.navbar .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, .content kbd.navbar .navbar-brand > a.navbar-item.is-active, - .navbar.is-dark .navbar-brand .navbar-link:focus, - .content kbd.navbar .navbar-brand .navbar-link:focus, - .navbar.is-dark .navbar-brand .navbar-link:hover, - .content kbd.navbar .navbar-brand .navbar-link:hover, - .navbar.is-dark .navbar-brand .navbar-link.is-active, - .content kbd.navbar .navbar-brand .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-brand .navbar-link::after, .content kbd.navbar .navbar-brand .navbar-link::after { - border-color: whitesmoke; } - .navbar.is-dark .navbar-burger, .content kbd.navbar .navbar-burger { - color: whitesmoke; } - @media screen and (min-width: 1056px) { - .navbar.is-dark .navbar-start > .navbar-item, .content kbd.navbar .navbar-start > .navbar-item, - .navbar.is-dark .navbar-start .navbar-link, - .content kbd.navbar .navbar-start .navbar-link, - .navbar.is-dark .navbar-end > .navbar-item, - .content kbd.navbar .navbar-end > .navbar-item, - .navbar.is-dark .navbar-end .navbar-link, - .content kbd.navbar .navbar-end .navbar-link { - color: whitesmoke; } - .navbar.is-dark .navbar-start > a.navbar-item:focus, .content kbd.navbar .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .content kbd.navbar .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, .content kbd.navbar .navbar-start > a.navbar-item.is-active, - .navbar.is-dark .navbar-start .navbar-link:focus, - .content kbd.navbar .navbar-start .navbar-link:focus, - .navbar.is-dark .navbar-start .navbar-link:hover, - .content kbd.navbar .navbar-start .navbar-link:hover, - .navbar.is-dark .navbar-start .navbar-link.is-active, - .content kbd.navbar .navbar-start .navbar-link.is-active, - .navbar.is-dark .navbar-end > a.navbar-item:focus, - .content kbd.navbar .navbar-end > a.navbar-item:focus, - .navbar.is-dark .navbar-end > a.navbar-item:hover, - .content kbd.navbar .navbar-end > a.navbar-item:hover, - .navbar.is-dark .navbar-end > a.navbar-item.is-active, - .content kbd.navbar .navbar-end > a.navbar-item.is-active, - .navbar.is-dark .navbar-end .navbar-link:focus, - .content kbd.navbar .navbar-end .navbar-link:focus, - .navbar.is-dark .navbar-end .navbar-link:hover, - .content kbd.navbar .navbar-end .navbar-link:hover, - .navbar.is-dark .navbar-end .navbar-link.is-active, - .content kbd.navbar .navbar-end .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-start .navbar-link::after, .content kbd.navbar .navbar-start .navbar-link::after, - .navbar.is-dark .navbar-end .navbar-link::after, - .content kbd.navbar .navbar-end .navbar-link::after { - border-color: whitesmoke; } - .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, - .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { - background-color: #363636; - color: whitesmoke; } } - .navbar.is-primary, .docstring > section > a.navbar.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .navbar.is-primary .navbar-brand > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, - .navbar.is-primary .navbar-brand .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-primary .navbar-brand > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, - .navbar.is-primary .navbar-brand .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, - .navbar.is-primary .navbar-brand .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, - .navbar.is-primary .navbar-brand .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-brand .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-primary .navbar-burger, .docstring > section > a.navbar.docs-sourcelink .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-primary .navbar-start > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, - .navbar.is-primary .navbar-start .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, - .navbar.is-primary .navbar-end > .navbar-item, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, - .navbar.is-primary .navbar-end .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { - color: #fff; } - .navbar.is-primary .navbar-start > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, - .navbar.is-primary .navbar-start .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, - .navbar.is-primary .navbar-start .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, - .navbar.is-primary .navbar-start .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, - .navbar.is-primary .navbar-end > a.navbar-item:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, - .navbar.is-primary .navbar-end > a.navbar-item:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, - .navbar.is-primary .navbar-end > a.navbar-item.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, - .navbar.is-primary .navbar-end .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, - .navbar.is-primary .navbar-end .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, - .navbar.is-primary .navbar-end .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-start .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, - .navbar.is-primary .navbar-end .navbar-link::after, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #4eb5de; - color: #fff; } } - .navbar.is-link { - background-color: #2e63b8; - color: #fff; } - .navbar.is-link .navbar-brand > .navbar-item, - .navbar.is-link .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, - .navbar.is-link .navbar-brand .navbar-link:focus, - .navbar.is-link .navbar-brand .navbar-link:hover, - .navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-link .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-link .navbar-start > .navbar-item, - .navbar.is-link .navbar-start .navbar-link, - .navbar.is-link .navbar-end > .navbar-item, - .navbar.is-link .navbar-end .navbar-link { - color: #fff; } - .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, - .navbar.is-link .navbar-start .navbar-link:focus, - .navbar.is-link .navbar-start .navbar-link:hover, - .navbar.is-link .navbar-start .navbar-link.is-active, - .navbar.is-link .navbar-end > a.navbar-item:focus, - .navbar.is-link .navbar-end > a.navbar-item:hover, - .navbar.is-link .navbar-end > a.navbar-item.is-active, - .navbar.is-link .navbar-end .navbar-link:focus, - .navbar.is-link .navbar-end .navbar-link:hover, - .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-start .navbar-link::after, - .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #2e63b8; - color: #fff; } } - .navbar.is-info { - background-color: #209cee; - color: #fff; } - .navbar.is-info .navbar-brand > .navbar-item, - .navbar.is-info .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, - .navbar.is-info .navbar-brand .navbar-link:focus, - .navbar.is-info .navbar-brand .navbar-link:hover, - .navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-info .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-info .navbar-start > .navbar-item, - .navbar.is-info .navbar-start .navbar-link, - .navbar.is-info .navbar-end > .navbar-item, - .navbar.is-info .navbar-end .navbar-link { - color: #fff; } - .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, - .navbar.is-info .navbar-start .navbar-link:focus, - .navbar.is-info .navbar-start .navbar-link:hover, - .navbar.is-info .navbar-start .navbar-link.is-active, - .navbar.is-info .navbar-end > a.navbar-item:focus, - .navbar.is-info .navbar-end > a.navbar-item:hover, - .navbar.is-info .navbar-end > a.navbar-item.is-active, - .navbar.is-info .navbar-end .navbar-link:focus, - .navbar.is-info .navbar-end .navbar-link:hover, - .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-start .navbar-link::after, - .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #209cee; - color: #fff; } } - .navbar.is-success { - background-color: #22c35b; - color: #fff; } - .navbar.is-success .navbar-brand > .navbar-item, - .navbar.is-success .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, - .navbar.is-success .navbar-brand .navbar-link:focus, - .navbar.is-success .navbar-brand .navbar-link:hover, - .navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-success .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-success .navbar-start > .navbar-item, - .navbar.is-success .navbar-start .navbar-link, - .navbar.is-success .navbar-end > .navbar-item, - .navbar.is-success .navbar-end .navbar-link { - color: #fff; } - .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, - .navbar.is-success .navbar-start .navbar-link:focus, - .navbar.is-success .navbar-start .navbar-link:hover, - .navbar.is-success .navbar-start .navbar-link.is-active, - .navbar.is-success .navbar-end > a.navbar-item:focus, - .navbar.is-success .navbar-end > a.navbar-item:hover, - .navbar.is-success .navbar-end > a.navbar-item.is-active, - .navbar.is-success .navbar-end .navbar-link:focus, - .navbar.is-success .navbar-end .navbar-link:hover, - .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-start .navbar-link::after, - .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #22c35b; - color: #fff; } } - .navbar.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand > .navbar-item, - .navbar.is-warning .navbar-brand .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, - .navbar.is-warning .navbar-brand .navbar-link:focus, - .navbar.is-warning .navbar-brand .navbar-link:hover, - .navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-burger { - color: rgba(0, 0, 0, 0.7); } - @media screen and (min-width: 1056px) { - .navbar.is-warning .navbar-start > .navbar-item, - .navbar.is-warning .navbar-start .navbar-link, - .navbar.is-warning .navbar-end > .navbar-item, - .navbar.is-warning .navbar-end .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, - .navbar.is-warning .navbar-start .navbar-link:focus, - .navbar.is-warning .navbar-start .navbar-link:hover, - .navbar.is-warning .navbar-start .navbar-link.is-active, - .navbar.is-warning .navbar-end > a.navbar-item:focus, - .navbar.is-warning .navbar-end > a.navbar-item:hover, - .navbar.is-warning .navbar-end > a.navbar-item.is-active, - .navbar.is-warning .navbar-end .navbar-link:focus, - .navbar.is-warning .navbar-end .navbar-link:hover, - .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-start .navbar-link::after, - .navbar.is-warning .navbar-end .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } } - .navbar.is-danger { - background-color: #da0b00; - color: #fff; } - .navbar.is-danger .navbar-brand > .navbar-item, - .navbar.is-danger .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, - .navbar.is-danger .navbar-brand .navbar-link:focus, - .navbar.is-danger .navbar-brand .navbar-link:hover, - .navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-danger .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-danger .navbar-start > .navbar-item, - .navbar.is-danger .navbar-start .navbar-link, - .navbar.is-danger .navbar-end > .navbar-item, - .navbar.is-danger .navbar-end .navbar-link { - color: #fff; } - .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, - .navbar.is-danger .navbar-start .navbar-link:focus, - .navbar.is-danger .navbar-start .navbar-link:hover, - .navbar.is-danger .navbar-start .navbar-link.is-active, - .navbar.is-danger .navbar-end > a.navbar-item:focus, - .navbar.is-danger .navbar-end > a.navbar-item:hover, - .navbar.is-danger .navbar-end > a.navbar-item.is-active, - .navbar.is-danger .navbar-end .navbar-link:focus, - .navbar.is-danger .navbar-end .navbar-link:hover, - .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-start .navbar-link::after, - .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #da0b00; - color: #fff; } } - .navbar > .container { - align-items: stretch; - display: flex; - min-height: 3.25rem; - width: 100%; } - .navbar.has-shadow { - box-shadow: 0 2px 0 0 whitesmoke; } - .navbar.is-fixed-bottom, .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom { - bottom: 0; } - .navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 whitesmoke; } - .navbar.is-fixed-top { - top: 0; } - -html.has-navbar-fixed-top, -body.has-navbar-fixed-top { - padding-top: 3.25rem; } - -html.has-navbar-fixed-bottom, -body.has-navbar-fixed-bottom { - padding-bottom: 3.25rem; } - -.navbar-brand, -.navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 3.25rem; } - -.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { - background-color: transparent; } - -.navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; } - -.navbar-burger { - color: #4a4a4a; - cursor: pointer; - display: block; - height: 3.25rem; - position: relative; - width: 3.25rem; - margin-left: auto; } - .navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, transform; - transition-timing-function: ease-out; - width: 16px; } - .navbar-burger span:nth-child(1) { - top: calc(50% - 6px); } - .navbar-burger span:nth-child(2) { - top: calc(50% - 1px); } - .navbar-burger span:nth-child(3) { - top: calc(50% + 4px); } - .navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); } - .navbar-burger.is-active span:nth-child(1) { - transform: translateY(5px) rotate(45deg); } - .navbar-burger.is-active span:nth-child(2) { - opacity: 0; } - .navbar-burger.is-active span:nth-child(3) { - transform: translateY(-5px) rotate(-45deg); } - -.navbar-menu { - display: none; } - -.navbar-item, -.navbar-link { - color: #4a4a4a; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; } - .navbar-item .icon:only-child, - .navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; } - -a.navbar-item, -.navbar-link { - cursor: pointer; } - a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, - .navbar-link:focus, - .navbar-link:focus-within, - .navbar-link:hover, - .navbar-link.is-active { - background-color: #fafafa; - color: #2e63b8; } - -.navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; } - .navbar-item img { - max-height: 1.75rem; } - .navbar-item.has-dropdown { - padding: 0; } - .navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 3.25rem; - padding-bottom: calc(0.5rem - 1px); } - .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #2e63b8; } - .navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #2e63b8; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #2e63b8; - padding-bottom: calc(0.5rem - 3px); } - -.navbar-content { - flex-grow: 1; - flex-shrink: 1; } - -.navbar-link:not(.is-arrowless) { - padding-right: 2.5em; } - .navbar-link:not(.is-arrowless)::after { - border-color: #2e63b8; - margin-top: -0.375em; - right: 1.125em; } - -.navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - .navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; } - -.navbar-divider { - background-color: whitesmoke; - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; } - -@media screen and (max-width: 1055px) { - .navbar > .container { - display: block; } - .navbar-brand .navbar-item, - .navbar-tabs .navbar-item { - align-items: center; - display: flex; } - .navbar-link::after { - display: none; } - .navbar-menu { - background-color: white; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; } - .navbar-menu.is-active { - display: block; } - .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom-touch { - bottom: 0; } - .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - .navbar.is-fixed-top-touch { - top: 0; } - .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 3.25rem); - overflow: auto; } - html.has-navbar-fixed-top-touch, - body.has-navbar-fixed-top-touch { - padding-top: 3.25rem; } - html.has-navbar-fixed-bottom-touch, - body.has-navbar-fixed-bottom-touch { - padding-bottom: 3.25rem; } } - -@media screen and (min-width: 1056px) { - .navbar, - .navbar-menu, - .navbar-start, - .navbar-end { - align-items: stretch; - display: flex; } - .navbar { - min-height: 3.25rem; } - .navbar.is-spaced { - padding: 1rem 2rem; } - .navbar.is-spaced .navbar-start, - .navbar.is-spaced .navbar-end { - align-items: center; } - .navbar.is-spaced a.navbar-item, - .navbar.is-spaced .navbar-link { - border-radius: 4px; } - .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, - .navbar.is-transparent .navbar-link:focus, - .navbar.is-transparent .navbar-link:hover, - .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; } - .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; } - .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #2e63b8; } - .navbar-burger { - display: none; } - .navbar-item, - .navbar-link { - align-items: center; - display: flex; } - .navbar-item { - display: flex; } - .navbar-item.has-dropdown { - align-items: stretch; } - .navbar-item.has-dropdown-up .navbar-link::after { - transform: rotate(135deg) translate(0.25em, -0.25em); } - .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 2px solid #dbdbdb; - border-radius: 6px 6px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; } - .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; } - .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - transform: translateY(0); } - .navbar-menu { - flex-grow: 1; - flex-shrink: 0; } - .navbar-start { - justify-content: flex-start; - margin-right: auto; } - .navbar-end { - justify-content: flex-end; - margin-left: auto; } - .navbar-dropdown { - background-color: white; - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 2px solid #dbdbdb; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; } - .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; } - .navbar-dropdown a.navbar-item { - padding-right: 3rem; } - .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #2e63b8; } - .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { - border-radius: 6px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, transform; } - .navbar-dropdown.is-right { - left: auto; - right: 0; } - .navbar-divider { - display: block; } - .navbar > .container .navbar-brand, - .container > .navbar .navbar-brand { - margin-left: -.75rem; } - .navbar > .container .navbar-menu, - .container > .navbar .navbar-menu { - margin-right: -.75rem; } - .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom-desktop { - bottom: 0; } - .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - .navbar.is-fixed-top-desktop { - top: 0; } - html.has-navbar-fixed-top-desktop, - body.has-navbar-fixed-top-desktop { - padding-top: 3.25rem; } - html.has-navbar-fixed-bottom-desktop, - body.has-navbar-fixed-bottom-desktop { - padding-bottom: 3.25rem; } - html.has-spaced-navbar-fixed-top, - body.has-spaced-navbar-fixed-top { - padding-top: 5.25rem; } - html.has-spaced-navbar-fixed-bottom, - body.has-spaced-navbar-fixed-bottom { - padding-bottom: 5.25rem; } - a.navbar-item.is-active, - .navbar-link.is-active { - color: #0a0a0a; } - a.navbar-item.is-active:not(:focus):not(:hover), - .navbar-link.is-active:not(:focus):not(:hover) { - background-color: transparent; } - .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #fafafa; } } - -.hero.is-fullheight-with-navbar { - min-height: calc(100vh - 3.25rem); } - -.pagination { - font-size: 1rem; - margin: -0.25rem; } - .pagination.is-small, #documenter .docs-sidebar form.docs-search > input.pagination { - font-size: 0.75rem; } - .pagination.is-medium { - font-size: 1.25rem; } - .pagination.is-large { - font-size: 1.5rem; } - .pagination.is-rounded .pagination-previous, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, - .pagination.is-rounded .pagination-next, - #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; } - .pagination.is-rounded .pagination-link, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { - border-radius: 290486px; } - -.pagination, -.pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; } - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis { - font-size: 1em; - justify-content: center; - margin: 0.25rem; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: center; } - -.pagination-previous, -.pagination-next, -.pagination-link { - border-color: #dbdbdb; - color: #363636; - min-width: 2.25em; } - .pagination-previous:hover, - .pagination-next:hover, - .pagination-link:hover { - border-color: #b5b5b5; - color: #363636; } - .pagination-previous:focus, - .pagination-next:focus, - .pagination-link:focus { - border-color: #3c5dcd; } - .pagination-previous:active, - .pagination-next:active, - .pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } - .pagination-previous[disabled], - .pagination-next[disabled], - .pagination-link[disabled] { - background-color: #dbdbdb; - border-color: #dbdbdb; - box-shadow: none; - color: #6b6b6b; - opacity: 0.5; } - -.pagination-previous, -.pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - -.pagination-link.is-current { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - -.pagination-ellipsis { - color: #b5b5b5; - pointer-events: none; } - -.pagination-list { - flex-wrap: wrap; } - -@media screen and (max-width: 768px) { - .pagination { - flex-wrap: wrap; } - .pagination-previous, - .pagination-next { - flex-grow: 1; - flex-shrink: 1; } - .pagination-list li { - flex-grow: 1; - flex-shrink: 1; } } - -@media screen and (min-width: 769px), print { - .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; } - .pagination-previous { - order: 2; } - .pagination-next { - order: 3; } - .pagination { - justify-content: space-between; } - .pagination.is-centered .pagination-previous { - order: 1; } - .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; } - .pagination.is-centered .pagination-next { - order: 3; } - .pagination.is-right .pagination-previous { - order: 1; } - .pagination.is-right .pagination-next { - order: 2; } - .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; } } - -.panel { - font-size: 1rem; } - .panel:not(:last-child) { - margin-bottom: 1.5rem; } - -.panel-heading, -.panel-tabs, -.panel-block { - border-bottom: 1px solid #dbdbdb; - border-left: 1px solid #dbdbdb; - border-right: 1px solid #dbdbdb; } - .panel-heading:first-child, - .panel-tabs:first-child, - .panel-block:first-child { - border-top: 1px solid #dbdbdb; } - -.panel-heading { - background-color: whitesmoke; - border-radius: 4px 4px 0 0; - color: #222222; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; } - -.panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; } - .panel-tabs a { - border-bottom: 1px solid #dbdbdb; - margin-bottom: -1px; - padding: 0.5em; } - .panel-tabs a.is-active { - border-bottom-color: #4a4a4a; - color: #363636; } - -.panel-list a { - color: #222222; } - .panel-list a:hover { - color: #2e63b8; } - -.panel-block { - align-items: center; - color: #222222; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; } - .panel-block input[type="checkbox"] { - margin-right: 0.75em; } - .panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; } - .panel-block.is-wrapped { - flex-wrap: wrap; } - .panel-block.is-active { - border-left-color: #2e63b8; - color: #363636; } - .panel-block.is-active .panel-icon { - color: #2e63b8; } - -a.panel-block, -label.panel-block { - cursor: pointer; } - a.panel-block:hover, - label.panel-block:hover { - background-color: whitesmoke; } - -.panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: #6b6b6b; - margin-right: 0.75em; } - .panel-icon .fa { - font-size: inherit; - line-height: inherit; } - -.tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 1rem; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; } - .tabs a { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #222222; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; } - .tabs a:hover { - border-bottom-color: #222222; - color: #222222; } - .tabs li { - display: block; } - .tabs li.is-active a { - border-bottom-color: #2e63b8; - color: #2e63b8; } - .tabs ul { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; } - .tabs ul.is-left { - padding-right: 0.75em; } - .tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; } - .tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; } - .tabs .icon:first-child { - margin-right: 0.5em; } - .tabs .icon:last-child { - margin-left: 0.5em; } - .tabs.is-centered ul { - justify-content: center; } - .tabs.is-right ul { - justify-content: flex-end; } - .tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 4px 4px 0 0; } - .tabs.is-boxed a:hover { - background-color: whitesmoke; - border-bottom-color: #dbdbdb; } - .tabs.is-boxed li.is-active a { - background-color: white; - border-color: #dbdbdb; - border-bottom-color: transparent !important; } - .tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; } - .tabs.is-toggle a { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; } - .tabs.is-toggle a:hover { - background-color: whitesmoke; - border-color: #b5b5b5; - z-index: 2; } - .tabs.is-toggle li + li { - margin-left: -1px; } - .tabs.is-toggle li:first-child a { - border-radius: 4px 0 0 4px; } - .tabs.is-toggle li:last-child a { - border-radius: 0 4px 4px 0; } - .tabs.is-toggle li.is-active a { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; - z-index: 1; } - .tabs.is-toggle ul { - border-bottom: none; } - .tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; } - .tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; } - .tabs.is-small, #documenter .docs-sidebar form.docs-search > input.tabs { - font-size: 0.75rem; } - .tabs.is-medium { - font-size: 1.25rem; } - .tabs.is-large { - font-size: 1.5rem; } - -.column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; } - .columns.is-mobile > .column.is-narrow { - flex: none; } - .columns.is-mobile > .column.is-full { - flex: none; - width: 100%; } - .columns.is-mobile > .column.is-three-quarters { - flex: none; - width: 75%; } - .columns.is-mobile > .column.is-two-thirds { - flex: none; - width: 66.6666%; } - .columns.is-mobile > .column.is-half { - flex: none; - width: 50%; } - .columns.is-mobile > .column.is-one-third { - flex: none; - width: 33.3333%; } - .columns.is-mobile > .column.is-one-quarter { - flex: none; - width: 25%; } - .columns.is-mobile > .column.is-one-fifth { - flex: none; - width: 20%; } - .columns.is-mobile > .column.is-two-fifths { - flex: none; - width: 40%; } - .columns.is-mobile > .column.is-three-fifths { - flex: none; - width: 60%; } - .columns.is-mobile > .column.is-four-fifths { - flex: none; - width: 80%; } - .columns.is-mobile > .column.is-offset-three-quarters { - margin-left: 75%; } - .columns.is-mobile > .column.is-offset-two-thirds { - margin-left: 66.6666%; } - .columns.is-mobile > .column.is-offset-half { - margin-left: 50%; } - .columns.is-mobile > .column.is-offset-one-third { - margin-left: 33.3333%; } - .columns.is-mobile > .column.is-offset-one-quarter { - margin-left: 25%; } - .columns.is-mobile > .column.is-offset-one-fifth { - margin-left: 20%; } - .columns.is-mobile > .column.is-offset-two-fifths { - margin-left: 40%; } - .columns.is-mobile > .column.is-offset-three-fifths { - margin-left: 60%; } - .columns.is-mobile > .column.is-offset-four-fifths { - margin-left: 80%; } - .columns.is-mobile > .column.is-0 { - flex: none; - width: 0%; } - .columns.is-mobile > .column.is-offset-0 { - margin-left: 0%; } - .columns.is-mobile > .column.is-1 { - flex: none; - width: 8.3333333333%; } - .columns.is-mobile > .column.is-offset-1 { - margin-left: 8.3333333333%; } - .columns.is-mobile > .column.is-2 { - flex: none; - width: 16.6666666667%; } - .columns.is-mobile > .column.is-offset-2 { - margin-left: 16.6666666667%; } - .columns.is-mobile > .column.is-3 { - flex: none; - width: 25%; } - .columns.is-mobile > .column.is-offset-3 { - margin-left: 25%; } - .columns.is-mobile > .column.is-4 { - flex: none; - width: 33.3333333333%; } - .columns.is-mobile > .column.is-offset-4 { - margin-left: 33.3333333333%; } - .columns.is-mobile > .column.is-5 { - flex: none; - width: 41.6666666667%; } - .columns.is-mobile > .column.is-offset-5 { - margin-left: 41.6666666667%; } - .columns.is-mobile > .column.is-6 { - flex: none; - width: 50%; } - .columns.is-mobile > .column.is-offset-6 { - margin-left: 50%; } - .columns.is-mobile > .column.is-7 { - flex: none; - width: 58.3333333333%; } - .columns.is-mobile > .column.is-offset-7 { - margin-left: 58.3333333333%; } - .columns.is-mobile > .column.is-8 { - flex: none; - width: 66.6666666667%; } - .columns.is-mobile > .column.is-offset-8 { - margin-left: 66.6666666667%; } - .columns.is-mobile > .column.is-9 { - flex: none; - width: 75%; } - .columns.is-mobile > .column.is-offset-9 { - margin-left: 75%; } - .columns.is-mobile > .column.is-10 { - flex: none; - width: 83.3333333333%; } - .columns.is-mobile > .column.is-offset-10 { - margin-left: 83.3333333333%; } - .columns.is-mobile > .column.is-11 { - flex: none; - width: 91.6666666667%; } - .columns.is-mobile > .column.is-offset-11 { - margin-left: 91.6666666667%; } - .columns.is-mobile > .column.is-12 { - flex: none; - width: 100%; } - .columns.is-mobile > .column.is-offset-12 { - margin-left: 100%; } - @media screen and (max-width: 768px) { - .column.is-narrow-mobile { - flex: none; } - .column.is-full-mobile { - flex: none; - width: 100%; } - .column.is-three-quarters-mobile { - flex: none; - width: 75%; } - .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; } - .column.is-half-mobile { - flex: none; - width: 50%; } - .column.is-one-third-mobile { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-mobile { - flex: none; - width: 25%; } - .column.is-one-fifth-mobile { - flex: none; - width: 20%; } - .column.is-two-fifths-mobile { - flex: none; - width: 40%; } - .column.is-three-fifths-mobile { - flex: none; - width: 60%; } - .column.is-four-fifths-mobile { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-mobile { - margin-left: 75%; } - .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; } - .column.is-offset-half-mobile { - margin-left: 50%; } - .column.is-offset-one-third-mobile { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-mobile { - margin-left: 25%; } - .column.is-offset-one-fifth-mobile { - margin-left: 20%; } - .column.is-offset-two-fifths-mobile { - margin-left: 40%; } - .column.is-offset-three-fifths-mobile { - margin-left: 60%; } - .column.is-offset-four-fifths-mobile { - margin-left: 80%; } - .column.is-0-mobile { - flex: none; - width: 0%; } - .column.is-offset-0-mobile { - margin-left: 0%; } - .column.is-1-mobile { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-mobile { - margin-left: 8.3333333333%; } - .column.is-2-mobile { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-mobile { - margin-left: 16.6666666667%; } - .column.is-3-mobile { - flex: none; - width: 25%; } - .column.is-offset-3-mobile { - margin-left: 25%; } - .column.is-4-mobile { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-mobile { - margin-left: 33.3333333333%; } - .column.is-5-mobile { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-mobile { - margin-left: 41.6666666667%; } - .column.is-6-mobile { - flex: none; - width: 50%; } - .column.is-offset-6-mobile { - margin-left: 50%; } - .column.is-7-mobile { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-mobile { - margin-left: 58.3333333333%; } - .column.is-8-mobile { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-mobile { - margin-left: 66.6666666667%; } - .column.is-9-mobile { - flex: none; - width: 75%; } - .column.is-offset-9-mobile { - margin-left: 75%; } - .column.is-10-mobile { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-mobile { - margin-left: 83.3333333333%; } - .column.is-11-mobile { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-mobile { - margin-left: 91.6666666667%; } - .column.is-12-mobile { - flex: none; - width: 100%; } - .column.is-offset-12-mobile { - margin-left: 100%; } } - @media screen and (min-width: 769px), print { - .column.is-narrow, .column.is-narrow-tablet { - flex: none; } - .column.is-full, .column.is-full-tablet { - flex: none; - width: 100%; } - .column.is-three-quarters, .column.is-three-quarters-tablet { - flex: none; - width: 75%; } - .column.is-two-thirds, .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; } - .column.is-half, .column.is-half-tablet { - flex: none; - width: 50%; } - .column.is-one-third, .column.is-one-third-tablet { - flex: none; - width: 33.3333%; } - .column.is-one-quarter, .column.is-one-quarter-tablet { - flex: none; - width: 25%; } - .column.is-one-fifth, .column.is-one-fifth-tablet { - flex: none; - width: 20%; } - .column.is-two-fifths, .column.is-two-fifths-tablet { - flex: none; - width: 40%; } - .column.is-three-fifths, .column.is-three-fifths-tablet { - flex: none; - width: 60%; } - .column.is-four-fifths, .column.is-four-fifths-tablet { - flex: none; - width: 80%; } - .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { - margin-left: 75%; } - .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; } - .column.is-offset-half, .column.is-offset-half-tablet { - margin-left: 50%; } - .column.is-offset-one-third, .column.is-offset-one-third-tablet { - margin-left: 33.3333%; } - .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { - margin-left: 25%; } - .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { - margin-left: 20%; } - .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { - margin-left: 40%; } - .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { - margin-left: 60%; } - .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { - margin-left: 80%; } - .column.is-0, .column.is-0-tablet { - flex: none; - width: 0%; } - .column.is-offset-0, .column.is-offset-0-tablet { - margin-left: 0%; } - .column.is-1, .column.is-1-tablet { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1, .column.is-offset-1-tablet { - margin-left: 8.3333333333%; } - .column.is-2, .column.is-2-tablet { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2, .column.is-offset-2-tablet { - margin-left: 16.6666666667%; } - .column.is-3, .column.is-3-tablet { - flex: none; - width: 25%; } - .column.is-offset-3, .column.is-offset-3-tablet { - margin-left: 25%; } - .column.is-4, .column.is-4-tablet { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4, .column.is-offset-4-tablet { - margin-left: 33.3333333333%; } - .column.is-5, .column.is-5-tablet { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5, .column.is-offset-5-tablet { - margin-left: 41.6666666667%; } - .column.is-6, .column.is-6-tablet { - flex: none; - width: 50%; } - .column.is-offset-6, .column.is-offset-6-tablet { - margin-left: 50%; } - .column.is-7, .column.is-7-tablet { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7, .column.is-offset-7-tablet { - margin-left: 58.3333333333%; } - .column.is-8, .column.is-8-tablet { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8, .column.is-offset-8-tablet { - margin-left: 66.6666666667%; } - .column.is-9, .column.is-9-tablet { - flex: none; - width: 75%; } - .column.is-offset-9, .column.is-offset-9-tablet { - margin-left: 75%; } - .column.is-10, .column.is-10-tablet { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10, .column.is-offset-10-tablet { - margin-left: 83.3333333333%; } - .column.is-11, .column.is-11-tablet { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11, .column.is-offset-11-tablet { - margin-left: 91.6666666667%; } - .column.is-12, .column.is-12-tablet { - flex: none; - width: 100%; } - .column.is-offset-12, .column.is-offset-12-tablet { - margin-left: 100%; } } - @media screen and (max-width: 1055px) { - .column.is-narrow-touch { - flex: none; } - .column.is-full-touch { - flex: none; - width: 100%; } - .column.is-three-quarters-touch { - flex: none; - width: 75%; } - .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; } - .column.is-half-touch { - flex: none; - width: 50%; } - .column.is-one-third-touch { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-touch { - flex: none; - width: 25%; } - .column.is-one-fifth-touch { - flex: none; - width: 20%; } - .column.is-two-fifths-touch { - flex: none; - width: 40%; } - .column.is-three-fifths-touch { - flex: none; - width: 60%; } - .column.is-four-fifths-touch { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-touch { - margin-left: 75%; } - .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; } - .column.is-offset-half-touch { - margin-left: 50%; } - .column.is-offset-one-third-touch { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-touch { - margin-left: 25%; } - .column.is-offset-one-fifth-touch { - margin-left: 20%; } - .column.is-offset-two-fifths-touch { - margin-left: 40%; } - .column.is-offset-three-fifths-touch { - margin-left: 60%; } - .column.is-offset-four-fifths-touch { - margin-left: 80%; } - .column.is-0-touch { - flex: none; - width: 0%; } - .column.is-offset-0-touch { - margin-left: 0%; } - .column.is-1-touch { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-touch { - margin-left: 8.3333333333%; } - .column.is-2-touch { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-touch { - margin-left: 16.6666666667%; } - .column.is-3-touch { - flex: none; - width: 25%; } - .column.is-offset-3-touch { - margin-left: 25%; } - .column.is-4-touch { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-touch { - margin-left: 33.3333333333%; } - .column.is-5-touch { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-touch { - margin-left: 41.6666666667%; } - .column.is-6-touch { - flex: none; - width: 50%; } - .column.is-offset-6-touch { - margin-left: 50%; } - .column.is-7-touch { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-touch { - margin-left: 58.3333333333%; } - .column.is-8-touch { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-touch { - margin-left: 66.6666666667%; } - .column.is-9-touch { - flex: none; - width: 75%; } - .column.is-offset-9-touch { - margin-left: 75%; } - .column.is-10-touch { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-touch { - margin-left: 83.3333333333%; } - .column.is-11-touch { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-touch { - margin-left: 91.6666666667%; } - .column.is-12-touch { - flex: none; - width: 100%; } - .column.is-offset-12-touch { - margin-left: 100%; } } - @media screen and (min-width: 1056px) { - .column.is-narrow-desktop { - flex: none; } - .column.is-full-desktop { - flex: none; - width: 100%; } - .column.is-three-quarters-desktop { - flex: none; - width: 75%; } - .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; } - .column.is-half-desktop { - flex: none; - width: 50%; } - .column.is-one-third-desktop { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-desktop { - flex: none; - width: 25%; } - .column.is-one-fifth-desktop { - flex: none; - width: 20%; } - .column.is-two-fifths-desktop { - flex: none; - width: 40%; } - .column.is-three-fifths-desktop { - flex: none; - width: 60%; } - .column.is-four-fifths-desktop { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-desktop { - margin-left: 75%; } - .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; } - .column.is-offset-half-desktop { - margin-left: 50%; } - .column.is-offset-one-third-desktop { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-desktop { - margin-left: 25%; } - .column.is-offset-one-fifth-desktop { - margin-left: 20%; } - .column.is-offset-two-fifths-desktop { - margin-left: 40%; } - .column.is-offset-three-fifths-desktop { - margin-left: 60%; } - .column.is-offset-four-fifths-desktop { - margin-left: 80%; } - .column.is-0-desktop { - flex: none; - width: 0%; } - .column.is-offset-0-desktop { - margin-left: 0%; } - .column.is-1-desktop { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-desktop { - margin-left: 8.3333333333%; } - .column.is-2-desktop { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-desktop { - margin-left: 16.6666666667%; } - .column.is-3-desktop { - flex: none; - width: 25%; } - .column.is-offset-3-desktop { - margin-left: 25%; } - .column.is-4-desktop { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-desktop { - margin-left: 33.3333333333%; } - .column.is-5-desktop { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-desktop { - margin-left: 41.6666666667%; } - .column.is-6-desktop { - flex: none; - width: 50%; } - .column.is-offset-6-desktop { - margin-left: 50%; } - .column.is-7-desktop { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-desktop { - margin-left: 58.3333333333%; } - .column.is-8-desktop { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-desktop { - margin-left: 66.6666666667%; } - .column.is-9-desktop { - flex: none; - width: 75%; } - .column.is-offset-9-desktop { - margin-left: 75%; } - .column.is-10-desktop { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-desktop { - margin-left: 83.3333333333%; } - .column.is-11-desktop { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-desktop { - margin-left: 91.6666666667%; } - .column.is-12-desktop { - flex: none; - width: 100%; } - .column.is-offset-12-desktop { - margin-left: 100%; } } - @media screen and (min-width: 1216px) { - .column.is-narrow-widescreen { - flex: none; } - .column.is-full-widescreen { - flex: none; - width: 100%; } - .column.is-three-quarters-widescreen { - flex: none; - width: 75%; } - .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; } - .column.is-half-widescreen { - flex: none; - width: 50%; } - .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-widescreen { - flex: none; - width: 25%; } - .column.is-one-fifth-widescreen { - flex: none; - width: 20%; } - .column.is-two-fifths-widescreen { - flex: none; - width: 40%; } - .column.is-three-fifths-widescreen { - flex: none; - width: 60%; } - .column.is-four-fifths-widescreen { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-widescreen { - margin-left: 75%; } - .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; } - .column.is-offset-half-widescreen { - margin-left: 50%; } - .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-widescreen { - margin-left: 25%; } - .column.is-offset-one-fifth-widescreen { - margin-left: 20%; } - .column.is-offset-two-fifths-widescreen { - margin-left: 40%; } - .column.is-offset-three-fifths-widescreen { - margin-left: 60%; } - .column.is-offset-four-fifths-widescreen { - margin-left: 80%; } - .column.is-0-widescreen { - flex: none; - width: 0%; } - .column.is-offset-0-widescreen { - margin-left: 0%; } - .column.is-1-widescreen { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-widescreen { - margin-left: 8.3333333333%; } - .column.is-2-widescreen { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-widescreen { - margin-left: 16.6666666667%; } - .column.is-3-widescreen { - flex: none; - width: 25%; } - .column.is-offset-3-widescreen { - margin-left: 25%; } - .column.is-4-widescreen { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-widescreen { - margin-left: 33.3333333333%; } - .column.is-5-widescreen { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-widescreen { - margin-left: 41.6666666667%; } - .column.is-6-widescreen { - flex: none; - width: 50%; } - .column.is-offset-6-widescreen { - margin-left: 50%; } - .column.is-7-widescreen { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-widescreen { - margin-left: 58.3333333333%; } - .column.is-8-widescreen { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-widescreen { - margin-left: 66.6666666667%; } - .column.is-9-widescreen { - flex: none; - width: 75%; } - .column.is-offset-9-widescreen { - margin-left: 75%; } - .column.is-10-widescreen { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-widescreen { - margin-left: 83.3333333333%; } - .column.is-11-widescreen { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-widescreen { - margin-left: 91.6666666667%; } - .column.is-12-widescreen { - flex: none; - width: 100%; } - .column.is-offset-12-widescreen { - margin-left: 100%; } } - @media screen and (min-width: 1408px) { - .column.is-narrow-fullhd { - flex: none; } - .column.is-full-fullhd { - flex: none; - width: 100%; } - .column.is-three-quarters-fullhd { - flex: none; - width: 75%; } - .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; } - .column.is-half-fullhd { - flex: none; - width: 50%; } - .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-fullhd { - flex: none; - width: 25%; } - .column.is-one-fifth-fullhd { - flex: none; - width: 20%; } - .column.is-two-fifths-fullhd { - flex: none; - width: 40%; } - .column.is-three-fifths-fullhd { - flex: none; - width: 60%; } - .column.is-four-fifths-fullhd { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-fullhd { - margin-left: 75%; } - .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; } - .column.is-offset-half-fullhd { - margin-left: 50%; } - .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-fullhd { - margin-left: 25%; } - .column.is-offset-one-fifth-fullhd { - margin-left: 20%; } - .column.is-offset-two-fifths-fullhd { - margin-left: 40%; } - .column.is-offset-three-fifths-fullhd { - margin-left: 60%; } - .column.is-offset-four-fifths-fullhd { - margin-left: 80%; } - .column.is-0-fullhd { - flex: none; - width: 0%; } - .column.is-offset-0-fullhd { - margin-left: 0%; } - .column.is-1-fullhd { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-fullhd { - margin-left: 8.3333333333%; } - .column.is-2-fullhd { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-fullhd { - margin-left: 16.6666666667%; } - .column.is-3-fullhd { - flex: none; - width: 25%; } - .column.is-offset-3-fullhd { - margin-left: 25%; } - .column.is-4-fullhd { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-fullhd { - margin-left: 33.3333333333%; } - .column.is-5-fullhd { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-fullhd { - margin-left: 41.6666666667%; } - .column.is-6-fullhd { - flex: none; - width: 50%; } - .column.is-offset-6-fullhd { - margin-left: 50%; } - .column.is-7-fullhd { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-fullhd { - margin-left: 58.3333333333%; } - .column.is-8-fullhd { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-fullhd { - margin-left: 66.6666666667%; } - .column.is-9-fullhd { - flex: none; - width: 75%; } - .column.is-offset-9-fullhd { - margin-left: 75%; } - .column.is-10-fullhd { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-fullhd { - margin-left: 83.3333333333%; } - .column.is-11-fullhd { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-fullhd { - margin-left: 91.6666666667%; } - .column.is-12-fullhd { - flex: none; - width: 100%; } - .column.is-offset-12-fullhd { - margin-left: 100%; } } -.columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - .columns:last-child { - margin-bottom: -0.75rem; } - .columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); } - .columns.is-centered { - justify-content: center; } - .columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; } - .columns.is-gapless > .column { - margin: 0; - padding: 0 !important; } - .columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; } - .columns.is-gapless:last-child { - margin-bottom: 0; } - .columns.is-mobile { - display: flex; } - .columns.is-multiline { - flex-wrap: wrap; } - .columns.is-vcentered { - align-items: center; } - @media screen and (min-width: 769px), print { - .columns:not(.is-desktop) { - display: flex; } } - @media screen and (min-width: 1056px) { - .columns.is-desktop { - display: flex; } } -.columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); } - .columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); } - .columns.is-variable.is-0 { - --columnGap: 0rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-0-mobile { - --columnGap: 0rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-0-tablet { - --columnGap: 0rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-0-touch { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-0-desktop { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; } } - .columns.is-variable.is-1 { - --columnGap: 0.25rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; } } - .columns.is-variable.is-2 { - --columnGap: 0.5rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; } } - .columns.is-variable.is-3 { - --columnGap: 0.75rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; } } - .columns.is-variable.is-4 { - --columnGap: 1rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-4-mobile { - --columnGap: 1rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-4-tablet { - --columnGap: 1rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-4-touch { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-4-desktop { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; } } - .columns.is-variable.is-5 { - --columnGap: 1.25rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; } } - .columns.is-variable.is-6 { - --columnGap: 1.5rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; } } - .columns.is-variable.is-7 { - --columnGap: 1.75rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; } } - .columns.is-variable.is-8 { - --columnGap: 2rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-8-mobile { - --columnGap: 2rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-8-tablet { - --columnGap: 2rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-8-touch { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-8-desktop { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; } } -.tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: min-content; } - .tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - .tile.is-ancestor:last-child { - margin-bottom: -0.75rem; } - .tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; } - .tile.is-child { - margin: 0 !important; } - .tile.is-parent { - padding: 0.75rem; } - .tile.is-vertical { - flex-direction: column; } - .tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; } - @media screen and (min-width: 769px), print { - .tile:not(.is-child) { - display: flex; } - .tile.is-1 { - flex: none; - width: 8.3333333333%; } - .tile.is-2 { - flex: none; - width: 16.6666666667%; } - .tile.is-3 { - flex: none; - width: 25%; } - .tile.is-4 { - flex: none; - width: 33.3333333333%; } - .tile.is-5 { - flex: none; - width: 41.6666666667%; } - .tile.is-6 { - flex: none; - width: 50%; } - .tile.is-7 { - flex: none; - width: 58.3333333333%; } - .tile.is-8 { - flex: none; - width: 66.6666666667%; } - .tile.is-9 { - flex: none; - width: 75%; } - .tile.is-10 { - flex: none; - width: 83.3333333333%; } - .tile.is-11 { - flex: none; - width: 91.6666666667%; } - .tile.is-12 { - flex: none; - width: 100%; } } -.hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; } - .hero .navbar { - background: none; } - .hero .tabs ul { - border-bottom: none; } - .hero.is-white { - background-color: white; - color: #0a0a0a; } - .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-white strong { - color: inherit; } - .hero.is-white .title { - color: #0a0a0a; } - .hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); } - .hero.is-white .subtitle a:not(.button), - .hero.is-white .subtitle strong { - color: #0a0a0a; } - @media screen and (max-width: 1055px) { - .hero.is-white .navbar-menu { - background-color: white; } } - .hero.is-white .navbar-item, - .hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); } - .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, - .hero.is-white .navbar-link:hover, - .hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; } - .hero.is-white .tabs a:hover { - opacity: 1; } - .hero.is-white .tabs li.is-active a { - opacity: 1; } - .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; } - .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } - @media screen and (max-width: 768px) { - .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } - .hero.is-black { - background-color: #0a0a0a; - color: white; } - .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-black strong { - color: inherit; } - .hero.is-black .title { - color: white; } - .hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-black .subtitle a:not(.button), - .hero.is-black .subtitle strong { - color: white; } - @media screen and (max-width: 1055px) { - .hero.is-black .navbar-menu { - background-color: #0a0a0a; } } - .hero.is-black .navbar-item, - .hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, - .hero.is-black .navbar-link:hover, - .hero.is-black .navbar-link.is-active { - background-color: black; - color: white; } - .hero.is-black .tabs a { - color: white; - opacity: 0.9; } - .hero.is-black .tabs a:hover { - opacity: 1; } - .hero.is-black .tabs li.is-active a { - opacity: 1; } - .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { - color: white; } - .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; } - .hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } - @media screen and (max-width: 768px) { - .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } - .hero.is-light { - background-color: whitesmoke; - color: #363636; } - .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-light strong { - color: inherit; } - .hero.is-light .title { - color: #363636; } - .hero.is-light .subtitle { - color: rgba(54, 54, 54, 0.9); } - .hero.is-light .subtitle a:not(.button), - .hero.is-light .subtitle strong { - color: #363636; } - @media screen and (max-width: 1055px) { - .hero.is-light .navbar-menu { - background-color: whitesmoke; } } - .hero.is-light .navbar-item, - .hero.is-light .navbar-link { - color: rgba(54, 54, 54, 0.7); } - .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, - .hero.is-light .navbar-link:hover, - .hero.is-light .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .hero.is-light .tabs a { - color: #363636; - opacity: 0.9; } - .hero.is-light .tabs a:hover { - opacity: 1; } - .hero.is-light .tabs li.is-active a { - opacity: 1; } - .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { - color: #363636; } - .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .hero.is-light.is-bold { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } - @media screen and (max-width: 768px) { - .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } - .hero.is-dark, .content kbd.hero { - background-color: #363636; - color: whitesmoke; } - .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-dark strong, - .content kbd.hero strong { - color: inherit; } - .hero.is-dark .title, .content kbd.hero .title { - color: whitesmoke; } - .hero.is-dark .subtitle, .content kbd.hero .subtitle { - color: rgba(245, 245, 245, 0.9); } - .hero.is-dark .subtitle a:not(.button), .content kbd.hero .subtitle a:not(.button), - .hero.is-dark .subtitle strong, - .content kbd.hero .subtitle strong { - color: whitesmoke; } - @media screen and (max-width: 1055px) { - .hero.is-dark .navbar-menu, .content kbd.hero .navbar-menu { - background-color: #363636; } } - .hero.is-dark .navbar-item, .content kbd.hero .navbar-item, - .hero.is-dark .navbar-link, - .content kbd.hero .navbar-link { - color: rgba(245, 245, 245, 0.7); } - .hero.is-dark a.navbar-item:hover, .content kbd.hero a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, .content kbd.hero a.navbar-item.is-active, - .hero.is-dark .navbar-link:hover, - .content kbd.hero .navbar-link:hover, - .hero.is-dark .navbar-link.is-active, - .content kbd.hero .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .hero.is-dark .tabs a, .content kbd.hero .tabs a { - color: whitesmoke; - opacity: 0.9; } - .hero.is-dark .tabs a:hover, .content kbd.hero .tabs a:hover { - opacity: 1; } - .hero.is-dark .tabs li.is-active a, .content kbd.hero .tabs li.is-active a { - opacity: 1; } - .hero.is-dark .tabs.is-boxed a, .content kbd.hero .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .content kbd.hero .tabs.is-toggle a { - color: whitesmoke; } - .hero.is-dark .tabs.is-boxed a:hover, .content kbd.hero .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .content kbd.hero .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-dark .tabs.is-boxed li.is-active a, .content kbd.hero .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .content kbd.hero .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .hero.is-dark.is-bold, .content kbd.hero.is-bold { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } - @media screen and (max-width: 768px) { - .hero.is-dark.is-bold .navbar-menu, .content kbd.hero.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } - .hero.is-primary, .docstring > section > a.hero.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-primary strong, - .docstring > section > a.hero.docs-sourcelink strong { - color: inherit; } - .hero.is-primary .title, .docstring > section > a.hero.docs-sourcelink .title { - color: #fff; } - .hero.is-primary .subtitle, .docstring > section > a.hero.docs-sourcelink .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-primary .subtitle a:not(.button), .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), - .hero.is-primary .subtitle strong, - .docstring > section > a.hero.docs-sourcelink .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-primary .navbar-menu, .docstring > section > a.hero.docs-sourcelink .navbar-menu { - background-color: #4eb5de; } } - .hero.is-primary .navbar-item, .docstring > section > a.hero.docs-sourcelink .navbar-item, - .hero.is-primary .navbar-link, - .docstring > section > a.hero.docs-sourcelink .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-primary a.navbar-item:hover, .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, - .hero.is-primary .navbar-link:hover, - .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, - .hero.is-primary .navbar-link.is-active, - .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .hero.is-primary .tabs a, .docstring > section > a.hero.docs-sourcelink .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-primary .tabs a:hover, .docstring > section > a.hero.docs-sourcelink .tabs a:hover { - opacity: 1; } - .hero.is-primary .tabs li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { - opacity: 1; } - .hero.is-primary .tabs.is-boxed a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { - color: #fff; } - .hero.is-primary .tabs.is-boxed a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-primary .tabs.is-boxed li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #4eb5de; } - .hero.is-primary.is-bold, .docstring > section > a.hero.is-bold.docs-sourcelink { - background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } - @media screen and (max-width: 768px) { - .hero.is-primary.is-bold .navbar-menu, .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { - background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } } - .hero.is-link { - background-color: #2e63b8; - color: #fff; } - .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-link strong { - color: inherit; } - .hero.is-link .title { - color: #fff; } - .hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-link .subtitle a:not(.button), - .hero.is-link .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-link .navbar-menu { - background-color: #2e63b8; } } - .hero.is-link .navbar-item, - .hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, - .hero.is-link .navbar-link:hover, - .hero.is-link .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .hero.is-link .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-link .tabs a:hover { - opacity: 1; } - .hero.is-link .tabs li.is-active a { - opacity: 1; } - .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { - color: #fff; } - .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #2e63b8; } - .hero.is-link.is-bold { - background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } - @media screen and (max-width: 768px) { - .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } } - .hero.is-info { - background-color: #209cee; - color: #fff; } - .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-info strong { - color: inherit; } - .hero.is-info .title { - color: #fff; } - .hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-info .subtitle a:not(.button), - .hero.is-info .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-info .navbar-menu { - background-color: #209cee; } } - .hero.is-info .navbar-item, - .hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, - .hero.is-info .navbar-link:hover, - .hero.is-info .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .hero.is-info .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-info .tabs a:hover { - opacity: 1; } - .hero.is-info .tabs li.is-active a { - opacity: 1; } - .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { - color: #fff; } - .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #209cee; } - .hero.is-info.is-bold { - background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } - @media screen and (max-width: 768px) { - .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } } - .hero.is-success { - background-color: #22c35b; - color: #fff; } - .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-success strong { - color: inherit; } - .hero.is-success .title { - color: #fff; } - .hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-success .subtitle a:not(.button), - .hero.is-success .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-success .navbar-menu { - background-color: #22c35b; } } - .hero.is-success .navbar-item, - .hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, - .hero.is-success .navbar-link:hover, - .hero.is-success .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .hero.is-success .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-success .tabs a:hover { - opacity: 1; } - .hero.is-success .tabs li.is-active a { - opacity: 1; } - .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { - color: #fff; } - .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #22c35b; } - .hero.is-success.is-bold { - background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } - @media screen and (max-width: 768px) { - .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } } - .hero.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-warning strong { - color: inherit; } - .hero.is-warning .title { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .subtitle { - color: rgba(0, 0, 0, 0.9); } - .hero.is-warning .subtitle a:not(.button), - .hero.is-warning .subtitle strong { - color: rgba(0, 0, 0, 0.7); } - @media screen and (max-width: 1055px) { - .hero.is-warning .navbar-menu { - background-color: #ffdd57; } } - .hero.is-warning .navbar-item, - .hero.is-warning .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, - .hero.is-warning .navbar-link:hover, - .hero.is-warning .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .tabs a { - color: rgba(0, 0, 0, 0.7); - opacity: 0.9; } - .hero.is-warning .tabs a:hover { - opacity: 1; } - .hero.is-warning .tabs li.is-active a { - opacity: 1; } - .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: rgba(0, 0, 0, 0.7); - border-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } - @media screen and (max-width: 768px) { - .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } } - .hero.is-danger { - background-color: #da0b00; - color: #fff; } - .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-danger strong { - color: inherit; } - .hero.is-danger .title { - color: #fff; } - .hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-danger .subtitle a:not(.button), - .hero.is-danger .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-danger .navbar-menu { - background-color: #da0b00; } } - .hero.is-danger .navbar-item, - .hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, - .hero.is-danger .navbar-link:hover, - .hero.is-danger .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-danger .tabs a:hover { - opacity: 1; } - .hero.is-danger .tabs li.is-active a { - opacity: 1; } - .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { - color: #fff; } - .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #da0b00; } - .hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } - @media screen and (max-width: 768px) { - .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } } - .hero.is-small .hero-body, #documenter .docs-sidebar form.docs-search > input.hero .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; } - @media screen and (min-width: 769px), print { - .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; } } - @media screen and (min-width: 769px), print { - .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; } } - .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; } - .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; } - .hero.is-halfheight { - min-height: 50vh; } - .hero.is-fullheight { - min-height: 100vh; } - -.hero-video { - overflow: hidden; } - .hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - transform: translate3d(-50%, -50%, 0); } - .hero-video.is-transparent { - opacity: 0.3; } - @media screen and (max-width: 768px) { - .hero-video { - display: none; } } -.hero-buttons { - margin-top: 1.5rem; } - @media screen and (max-width: 768px) { - .hero-buttons .button { - display: flex; } - .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; } } - @media screen and (min-width: 769px), print { - .hero-buttons { - display: flex; - justify-content: center; } - .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; } } -.hero-head, -.hero-foot { - flex-grow: 0; - flex-shrink: 0; } - -.hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; } - -.section { - padding: 3rem 1.5rem; } - @media screen and (min-width: 1056px) { - .section.is-medium { - padding: 9rem 1.5rem; } - .section.is-large { - padding: 18rem 1.5rem; } } -.footer { - background-color: #fafafa; - padding: 3rem 1.5rem 6rem; } - -h1 .docs-heading-anchor, h1 .docs-heading-anchor:hover, h1 .docs-heading-anchor:visited, h2 .docs-heading-anchor, h2 .docs-heading-anchor:hover, h2 .docs-heading-anchor:visited, h3 .docs-heading-anchor, h3 .docs-heading-anchor:hover, h3 .docs-heading-anchor:visited, h4 .docs-heading-anchor, h4 .docs-heading-anchor:hover, h4 .docs-heading-anchor:visited, h5 .docs-heading-anchor, h5 .docs-heading-anchor:hover, h5 .docs-heading-anchor:visited, h6 .docs-heading-anchor, h6 .docs-heading-anchor:hover, h6 .docs-heading-anchor:visited { - color: #222222; } - -h1 .docs-heading-anchor-permalink, h2 .docs-heading-anchor-permalink, h3 .docs-heading-anchor-permalink, h4 .docs-heading-anchor-permalink, h5 .docs-heading-anchor-permalink, h6 .docs-heading-anchor-permalink { - visibility: hidden; - vertical-align: middle; - margin-left: 0.5em; - font-size: 0.7rem; } - h1 .docs-heading-anchor-permalink::before, h2 .docs-heading-anchor-permalink::before, h3 .docs-heading-anchor-permalink::before, h4 .docs-heading-anchor-permalink::before, h5 .docs-heading-anchor-permalink::before, h6 .docs-heading-anchor-permalink::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f0c1"; } - -h1:hover .docs-heading-anchor-permalink, h2:hover .docs-heading-anchor-permalink, h3:hover .docs-heading-anchor-permalink, h4:hover .docs-heading-anchor-permalink, h5:hover .docs-heading-anchor-permalink, h6:hover .docs-heading-anchor-permalink { - visibility: visible; } - -.docs-dark-only { - display: none !important; } - -pre { - position: relative; - overflow: hidden; } - pre code, pre code.hljs { - padding: 0 0.75rem !important; - overflow: auto; - display: block; } - pre code:first-of-type, pre code.hljs:first-of-type { - padding-top: 0.5rem !important; } - pre code:last-of-type, pre code.hljs:last-of-type { - padding-bottom: 0.5rem !important; } - pre .copy-button { - opacity: 0.2; - transition: opacity 0.2s; - position: absolute; - right: 0em; - top: 0em; - padding: 0.5em; - width: 2.5em; - height: 2.5em; - background: transparent; - border: none; - font-family: "Font Awesome 5 Free"; - color: #222222; - cursor: pointer; - text-align: center; } - pre .copy-button:focus, pre .copy-button:hover { - opacity: 1; - background: rgba(34, 34, 34, 0.1); - color: #2e63b8; } - pre .copy-button.success { - color: #259a12; - opacity: 1; } - pre .copy-button.error { - color: #cb3c33; - opacity: 1; } - pre:hover .copy-button { - opacity: 1; } - -.admonition { - background-color: #b5b5b5; - border-style: solid; - border-width: 1px; - border-color: #363636; - border-radius: 4px; - font-size: 1rem; } - .admonition strong { - color: currentColor; } - .admonition.is-small, #documenter .docs-sidebar form.docs-search > input.admonition { - font-size: 0.75rem; } - .admonition.is-medium { - font-size: 1.25rem; } - .admonition.is-large { - font-size: 1.5rem; } - .admonition.is-default { - background-color: #b5b5b5; - border-color: #363636; } - .admonition.is-default > .admonition-header { - background-color: #363636; - color: #fff; } - .admonition.is-default > .admonition-body { - color: #fff; } - .admonition.is-info { - background-color: #def0fc; - border-color: #209cee; } - .admonition.is-info > .admonition-header { - background-color: #209cee; - color: #fff; } - .admonition.is-info > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-success { - background-color: #bdf4d1; - border-color: #22c35b; } - .admonition.is-success > .admonition-header { - background-color: #22c35b; - color: #fff; } - .admonition.is-success > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-warning { - background-color: #fff3c5; - border-color: #ffdd57; } - .admonition.is-warning > .admonition-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .admonition.is-warning > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-danger { - background-color: #ffaba7; - border-color: #da0b00; } - .admonition.is-danger > .admonition-header { - background-color: #da0b00; - color: #fff; } - .admonition.is-danger > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-compat { - background-color: #bdeff5; - border-color: #1db5c9; } - .admonition.is-compat > .admonition-header { - background-color: #1db5c9; - color: #fff; } - .admonition.is-compat > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - -.admonition-header { - color: #fff; - background-color: #363636; - align-items: center; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.5rem 0.75rem; - position: relative; } - .admonition-header:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-right: 0.75rem; - content: "\f06a"; } - -.admonition-body { - color: #222222; - padding: 0.5rem 0.75rem; } - .admonition-body pre { - background-color: whitesmoke; } - .admonition-body code { - background-color: rgba(0, 0, 0, 0.05); } - -.docstring { - margin-bottom: 1em; - background-color: transparent; - border: 1px solid #dbdbdb; - box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); - max-width: 100%; } - .docstring > header { - display: flex; - flex-grow: 1; - align-items: stretch; - padding: 0.5rem 0.75rem; - background-color: whitesmoke; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - box-shadow: none; - border-bottom: 1px solid #dbdbdb; } - .docstring > header code { - background-color: transparent; } - .docstring > header .docstring-binding { - margin-right: 0.3em; } - .docstring > header .docstring-category { - margin-left: 0.3em; } - .docstring > section { - position: relative; - padding: 0.75rem 0.75rem; - border-bottom: 1px solid #dbdbdb; } - .docstring > section:last-child { - border-bottom: none; } - .docstring > section > a.docs-sourcelink { - transition: opacity 0.3s; - opacity: 0; - position: absolute; - right: 0.375rem; - bottom: 0.375rem; } - .docstring > section > a.docs-sourcelink:focus { - opacity: 1 !important; } - .docstring:hover > section > a.docs-sourcelink { - opacity: 0.2; } - .docstring:focus-within > section > a.docs-sourcelink { - opacity: 0.2; } - .docstring > section:hover a.docs-sourcelink { - opacity: 1; } - -.documenter-example-output { - background-color: white; } - -.outdated-warning-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - z-index: 999; - background-color: #ffaba7; - color: rgba(0, 0, 0, 0.7); - border-bottom: 3px solid #da0b00; - padding: 10px 35px; - text-align: center; - font-size: 15px; } - .outdated-warning-overlay .outdated-warning-closer { - position: absolute; - top: calc(50% - 10px); - right: 18px; - cursor: pointer; - width: 12px; } - .outdated-warning-overlay a { - color: #2e63b8; } - .outdated-warning-overlay a:hover { - color: #363636; } - -.content pre { - border: 1px solid #dbdbdb; } - -.content code { - font-weight: inherit; } - -.content a code { - color: #2e63b8; } - -.content h1 code, .content h2 code, .content h3 code, .content h4 code, .content h5 code, .content h6 code { - color: #222222; } - -.content table { - display: block; - width: initial; - max-width: 100%; - overflow-x: auto; } - -.content blockquote > ul:first-child, .content blockquote > ol:first-child, .content .admonition-body > ul:first-child, .content .admonition-body > ol:first-child { - margin-top: 0; } - -pre, code { - font-variant-ligatures: no-contextual; } - -.breadcrumb a.is-disabled { - cursor: default; - pointer-events: none; } - .breadcrumb a.is-disabled, .breadcrumb a.is-disabled:hover { - color: #222222; } - -.hljs { - background: initial !important; } - -.katex .katex-mathml { - top: 0; - right: 0; } - -.katex-display, mjx-container, .MathJax_Display { - margin: 0.5em 0 !important; } - -html { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; } - -li.no-marker { - list-style: none; } - -/* This file contain the overall layout. - * - * The main container is
that is identified by id #documenter. - */ -#documenter .docs-main > article { - overflow-wrap: break-word; } - #documenter .docs-main > article .math-container { - overflow-x: auto; - overflow-y: hidden; } - -@media screen and (min-width: 1056px) { - #documenter .docs-main { - max-width: 52rem; - margin-left: 20rem; - padding-right: 1rem; } } - -@media screen and (max-width: 1055px) { - #documenter .docs-main { - width: 100%; } - #documenter .docs-main > article { - max-width: 52rem; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - padding: 0 1rem; } - #documenter .docs-main > header, #documenter .docs-main > nav { - max-width: 100%; - width: 100%; - margin: 0; } } - -#documenter .docs-main header.docs-navbar { - background-color: white; - border-bottom: 1px solid #dbdbdb; - z-index: 2; - min-height: 4rem; - margin-bottom: 1rem; - display: flex; } - #documenter .docs-main header.docs-navbar .breadcrumb { - flex-grow: 1; } - #documenter .docs-main header.docs-navbar .docs-right { - display: flex; - white-space: nowrap; } - #documenter .docs-main header.docs-navbar .docs-right .docs-icon, #documenter .docs-main header.docs-navbar .docs-right .docs-label, #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - display: inline-block; } - #documenter .docs-main header.docs-navbar .docs-right .docs-label { - padding: 0; - margin-left: 0.3em; } - #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { - margin: auto 0 auto 1rem; } - #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - font-size: 1.5rem; - margin: auto 0 auto 1rem; } - #documenter .docs-main header.docs-navbar > * { - margin: auto 0; } - @media screen and (max-width: 1055px) { - #documenter .docs-main header.docs-navbar { - position: sticky; - top: 0; - padding: 0 1rem; - /* For Headroom.js */ - transition-property: top, box-shadow; - -webkit-transition-property: top, box-shadow; - /* Safari */ - transition-duration: 0.3s; - -webkit-transition-duration: 0.3s; - /* Safari */ } - #documenter .docs-main header.docs-navbar.headroom--not-top { - box-shadow: 0.2rem 0rem 0.4rem #bbb; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } - #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { - top: -4.5rem; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } } -#documenter .docs-main section.footnotes { - border-top: 1px solid #dbdbdb; } - #documenter .docs-main section.footnotes li .tag:first-child, #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, #documenter .docs-main section.footnotes li .content kbd:first-child, .content #documenter .docs-main section.footnotes li kbd:first-child { - margin-right: 1em; - margin-bottom: 0.4em; } - -#documenter .docs-main .docs-footer { - display: flex; - flex-wrap: wrap; - margin-left: 0; - margin-right: 0; - border-top: 1px solid #dbdbdb; - padding-top: 1rem; - padding-bottom: 1rem; } - @media screen and (max-width: 1055px) { - #documenter .docs-main .docs-footer { - padding-left: 1rem; - padding-right: 1rem; } } - #documenter .docs-main .docs-footer .docs-footer-nextpage, #documenter .docs-main .docs-footer .docs-footer-prevpage { - flex-grow: 1; } - #documenter .docs-main .docs-footer .docs-footer-nextpage { - text-align: right; } - #documenter .docs-main .docs-footer .flexbox-break { - flex-basis: 100%; - height: 0; } - #documenter .docs-main .docs-footer .footer-message { - font-size: 0.8em; - margin: 0.5em auto 0 auto; - text-align: center; } - -#documenter .docs-sidebar { - display: flex; - flex-direction: column; - color: #0a0a0a; - background-color: whitesmoke; - border-right: 1px solid #dbdbdb; - padding: 0; - flex: 0 0 18rem; - z-index: 5; - font-size: 1rem; - position: fixed; - left: -18rem; - width: 18rem; - height: 100%; - transition: left 0.3s; - /* Setting up a nicer theme style for the scrollbar */ } - #documenter .docs-sidebar.visible { - left: 0; - box-shadow: 0.4rem 0rem 0.8rem #bbb; } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar.visible { - box-shadow: none; } } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar { - left: 0; - top: 0; } } - #documenter .docs-sidebar .docs-logo { - margin-top: 1rem; - padding: 0 1rem; } - #documenter .docs-sidebar .docs-logo > img { - max-height: 6rem; - margin: auto; } - #documenter .docs-sidebar .docs-package-name { - flex-shrink: 0; - font-size: 1.5rem; - font-weight: 700; - text-align: center; - white-space: nowrap; - overflow: hidden; - padding: 0.5rem 0; } - #documenter .docs-sidebar .docs-package-name .docs-autofit { - max-width: 16.2rem; } - #documenter .docs-sidebar .docs-package-name a, #documenter .docs-sidebar .docs-package-name a:hover { - color: #0a0a0a; } - #documenter .docs-sidebar .docs-version-selector { - border-top: 1px solid #dbdbdb; - display: none; - padding: 0.5rem; } - #documenter .docs-sidebar .docs-version-selector.visible { - display: flex; } - #documenter .docs-sidebar ul.docs-menu { - flex-grow: 1; - user-select: none; - border-top: 1px solid #dbdbdb; - padding-bottom: 1.5rem; - /* Managing collapsible submenus */ } - #documenter .docs-sidebar ul.docs-menu > li > .tocitem { - font-weight: bold; } - #documenter .docs-sidebar ul.docs-menu > li li { - font-size: 0.95rem; - margin-left: 1em; - border-left: 1px solid #dbdbdb; } - #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { - display: none; } - #documenter .docs-sidebar ul.docs-menu ul.collapsed { - display: none; } - #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { - display: block; } - #documenter .docs-sidebar ul.docs-menu label.tocitem { - display: flex; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { - flex-grow: 2; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - font-size: 0.75rem; - margin-left: 1rem; - margin-top: auto; - margin-bottom: auto; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f054"; } - #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { - content: "\f078"; } - #documenter .docs-sidebar ul.docs-menu .tocitem { - display: block; - padding: 0.5rem 0.5rem; } - #documenter .docs-sidebar ul.docs-menu .tocitem, #documenter .docs-sidebar ul.docs-menu .tocitem:hover { - color: #0a0a0a; - background: whitesmoke; } - #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { - color: #0a0a0a; - background-color: #ebebeb; } - #documenter .docs-sidebar ul.docs-menu li.is-active { - border-top: 1px solid #dbdbdb; - border-bottom: 1px solid #dbdbdb; - background-color: white; } - #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { - background-color: white; - color: #0a0a0a; } - #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { - background-color: #ebebeb; - color: #0a0a0a; } - #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { - border-top: none; } - #documenter .docs-sidebar ul.docs-menu ul.internal { - margin: 0 0.5rem 0.5rem; - border-top: 1px solid #dbdbdb; } - #documenter .docs-sidebar ul.docs-menu ul.internal li { - font-size: 0.85rem; - border-left: none; - margin-left: 0; - margin-top: 0.5rem; } - #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { - width: 100%; - padding: 0; } - #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { - content: "⚬"; - margin-right: 0.4em; } - #documenter .docs-sidebar form.docs-search { - margin: auto; - margin-top: 0.5rem; - margin-bottom: 0.5rem; } - #documenter .docs-sidebar form.docs-search > input { - width: 14.4rem; } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar ul.docs-menu { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { - width: .3rem; - background: none; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #e0e0e0; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { - background: #cccccc; } } - @media screen and (max-width: 1055px) { - #documenter .docs-sidebar { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - #documenter .docs-sidebar::-webkit-scrollbar { - width: .3rem; - background: none; } - #documenter .docs-sidebar::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #e0e0e0; } - #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { - background: #cccccc; } } -#documenter .docs-main #documenter-search-info { - margin-bottom: 1rem; } - -#documenter .docs-main #documenter-search-results { - list-style-type: circle; - list-style-position: outside; } - #documenter .docs-main #documenter-search-results li { - margin-left: 2rem; } - #documenter .docs-main #documenter-search-results .docs-highlight { - background-color: yellow; } - -.ansi span.sgr1 { - font-weight: bolder; } - -.ansi span.sgr2 { - font-weight: lighter; } - -.ansi span.sgr3 { - font-style: italic; } - -.ansi span.sgr4 { - text-decoration: underline; } - -.ansi span.sgr7 { - color: white; - background-color: #222222; } - -.ansi span.sgr8 { - color: transparent; } - .ansi span.sgr8 span { - color: transparent; } - -.ansi span.sgr9 { - text-decoration: line-through; } - -.ansi span.sgr30 { - color: #242424; } - -.ansi span.sgr31 { - color: #a7201f; } - -.ansi span.sgr32 { - color: #066f00; } - -.ansi span.sgr33 { - color: #856b00; } - -.ansi span.sgr34 { - color: #2149b0; } - -.ansi span.sgr35 { - color: #7d4498; } - -.ansi span.sgr36 { - color: #007989; } - -.ansi span.sgr37 { - color: gray; } - -.ansi span.sgr40 { - background-color: #242424; } - -.ansi span.sgr41 { - background-color: #a7201f; } - -.ansi span.sgr42 { - background-color: #066f00; } - -.ansi span.sgr43 { - background-color: #856b00; } - -.ansi span.sgr44 { - background-color: #2149b0; } - -.ansi span.sgr45 { - background-color: #7d4498; } - -.ansi span.sgr46 { - background-color: #007989; } - -.ansi span.sgr47 { - background-color: gray; } - -.ansi span.sgr90 { - color: #616161; } - -.ansi span.sgr91 { - color: #cb3c33; } - -.ansi span.sgr92 { - color: #0e8300; } - -.ansi span.sgr93 { - color: #a98800; } - -.ansi span.sgr94 { - color: #3c5dcd; } - -.ansi span.sgr95 { - color: #9256af; } - -.ansi span.sgr96 { - color: #008fa3; } - -.ansi span.sgr97 { - color: whitesmoke; } - -.ansi span.sgr100 { - background-color: #616161; } - -.ansi span.sgr101 { - background-color: #cb3c33; } - -.ansi span.sgr102 { - background-color: #0e8300; } - -.ansi span.sgr103 { - background-color: #a98800; } - -.ansi span.sgr104 { - background-color: #3c5dcd; } - -.ansi span.sgr105 { - background-color: #9256af; } - -.ansi span.sgr106 { - background-color: #008fa3; } - -.ansi span.sgr107 { - background-color: whitesmoke; } - -code.language-julia-repl > span.hljs-meta { - color: #066f00; - font-weight: bolder; } - -/*! +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! Theme: Default Description: Original highlight.js style Author: (c) Ivan Sagalaev @@ -7644,95 +6,4 @@ code.language-julia-repl > span.hljs-meta { Website: https://highlightjs.org/ License: see project LICENSE Touched: 2021 -*/ -/* -This is left on purpose making default.css the single file that can be lifted -as-is from the repository directly without the need for a build step - -Typically this "required" baseline CSS is added by `makestuff.js` during build. -*/ -pre code.hljs { - display: block; - overflow-x: auto; } - -code.hljs { - padding: 3px 5px; } - -/* end baseline CSS */ -.hljs { - background: #F0F0F0; - color: #444; } - -/* Base color: saturation 0; */ -.hljs-subst { - /* default */ } - -/* purposely ignored */ -.hljs-comment { - color: #888888; } - -.hljs-tag, -.hljs-punctuation { - color: #444a; } - -.hljs-tag .hljs-name, -.hljs-tag .hljs-attr { - color: #444; } - -.hljs-keyword, -.hljs-attribute, -.hljs-selector-tag, -.hljs-meta .hljs-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; } - -/* User color: hue: 0 */ -.hljs-type, -.hljs-string, -.hljs-number, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; } - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; } - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-operator, -.hljs-selector-pseudo { - color: #BC6060; } - -/* Language color: hue: 90; */ -.hljs-literal { - color: #78A960; } - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #397300; } - -/* Meta color: hue: 200 */ -.hljs-meta { - color: #1f7199; } - -.hljs-meta .hljs-string { - color: #4d99bf; } - -/* Misc effects */ -.hljs-emphasis { - font-style: italic; } - -.hljs-strong { - font-weight: bold; } +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/dev/assets/themeswap.js b/dev/assets/themeswap.js index c58e993e..9f5eebe6 100644 --- a/dev/assets/themeswap.js +++ b/dev/assets/themeswap.js @@ -1,20 +1,17 @@ // Small function to quickly swap out themes. Gets put into the tag.. function set_theme_from_local_storage() { - // Intialize the theme to null, which means default + // Initialize the theme to null, which means default var theme = null; // If the browser supports the localstorage and is not disabled then try to get the // documenter theme - if(window.localStorage != null) { + if (window.localStorage != null) { // Get the user-picked theme from localStorage. May be `null`, which means the default // theme. - theme = window.localStorage.getItem("documenter-theme"); + theme = window.localStorage.getItem("documenter-theme"); } - // Check if the browser supports user color preference - var darkPreference = false; // Check if the users preference is for dark color scheme - if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) { - darkPreference = true; - } + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; // Initialize a few variables for the loop: // // - active: will contain the index of the theme that should be active. Note that there @@ -24,43 +21,64 @@ function set_theme_from_local_storage() { // // - disabled: style sheets that should be disabled (i.e. all the theme style sheets // that are not the currently active theme) - var active = null; var disabled = []; var darkTheme = null; + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; for (var i = 0; i < document.styleSheets.length; i++) { var ss = document.styleSheets[i]; // The tag of each style sheet is expected to have a data-theme-name attribute // which must contain the name of the theme. The names in localStorage much match this. var themename = ss.ownerNode.getAttribute("data-theme-name"); // attribute not set => non-theme stylesheet => ignore - if(themename === null) continue; + if (themename === null) continue; // To distinguish the default (primary) theme, it needs to have the data-theme-primary // attribute set. - var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null); - // Check if the theme is primary dark theme - var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null); - // If ss is for dark theme then set the value of darkTheme to the name of the theme - if(isDarkTheme) darkTheme = themename; + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } // If we find a matching theme (and it's not the default), we'll set active to non-null - if(themename === theme) active = i; + if (themename === theme) active = i; // Store the style sheets of inactive themes so that we could disable them - if(themename !== theme) disabled.push(ss); + if (themename !== theme) disabled.push(ss); } - if(active !== null) { + var activeTheme = null; + if (active !== null) { // If we did find an active theme, we'll (1) add the theme--$(theme) class to - document.getElementsByTagName('html')[0].className = "theme--" + theme; - // and (2) disable all the other theme stylesheets - disabled.forEach(function(ss){ - ss.disabled = true; - }); + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } } - else if(darkTheme !== null && darkPreference === true) { - // If we did find an active theme, we'll (1) add the theme--$(theme) class to - document.getElementsByTagName('html')[0].className = "theme--" + darkTheme; - // and (2) disable all the other theme stylesheets - disabled.forEach(function(ss){ - if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) { - ss.disabled = true; - } - }); + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); } } set_theme_from_local_storage(); diff --git a/dev/assets/warner.js b/dev/assets/warner.js index 5531c885..3f6f5d00 100644 --- a/dev/assets/warner.js +++ b/dev/assets/warner.js @@ -1,49 +1,52 @@ -function maybeAddWarning () { - // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE - // in siteinfo.js. - // If either of these are undefined something went horribly wrong, so we abort. - if ( - window.DOCUMENTER_NEWEST === undefined || - window.DOCUMENTER_CURRENT_VERSION === undefined || - window.DOCUMENTER_STABLE === undefined - ) { - return - }; +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } - // Current version is not a version number, so we can't tell if it's the newest version. Abort. - if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { - return - }; + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } - // Current version is newest version, so no need to add a warning. - if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { - return - }; + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } - // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. - if (document.body.querySelector('meta[name="robots"]') === null) { - const meta = document.createElement('meta'); - meta.name = 'robots'; - meta.content = 'noindex'; + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; - document.getElementsByTagName('head')[0].appendChild(meta); - }; + document.getElementsByTagName("head")[0].appendChild(meta); + } - const div = document.createElement('div'); - div.classList.add('outdated-warning-overlay'); - const closer = document.createElement('button'); - closer.classList.add('outdated-warning-closer', 'delete'); - closer.addEventListener('click', function () { - document.body.removeChild(div); - }); - const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE; - div.innerHTML = 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; - div.appendChild(closer); - document.body.appendChild(div); -}; + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', maybeAddWarning); +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); } else { - maybeAddWarning(); -}; + maybeAddWarning(); +} diff --git a/dev/contributing/index.html b/dev/contributing/index.html index 2519067f..f7ef8dd8 100644 --- a/dev/contributing/index.html +++ b/dev/contributing/index.html @@ -1,3 +1,3 @@ -Contributor's guide · GeophysicalFlows.jl

Contributors' Guide

This is a short guide for potential GeophysicalFlows.jl contributors.

Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

What can I do?

  • Tackle an existing issue.

  • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

  • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

  • Improve documentation, docstrings, or comments if you found something is hard to use.

  • Implement a new feature (e.g., a new diagnostic into a module).

  • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

Ground Rules

  • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
  • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
  • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
  • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

Reporting a bug

The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

  • Head over to the issues page.
  • Search to see if your issue already exists or has even been solved previously.
  • If you indeed have a new issue or request, click the "New Issue" button.
  • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

Setting up your development environment

  • Install Julia on your system.
  • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
  • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
  • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
    git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
  • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
  • Connect your repository to the upstream (main project).
    git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
  • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
  • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

Your development environment is now ready!

Pull Requests

Changes and contributions should be made via GitHub pull requests against the main branch.

When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

Documentation

All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
-julia --project=docs/ docs/make.jl

and then open docs/build/index.html in your favorite browser.

Credits

This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

+Contributor's guide · GeophysicalFlows.jl

Contributors' Guide

This is a short guide for potential GeophysicalFlows.jl contributors.

Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

What can I do?

  • Tackle an existing issue.

  • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

  • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

  • Improve documentation, docstrings, or comments if you found something is hard to use.

  • Implement a new feature (e.g., a new diagnostic into a module).

  • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

Ground Rules

  • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
  • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
  • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
  • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

Reporting a bug

The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

  • Head over to the issues page.
  • Search to see if your issue already exists or has even been solved previously.
  • If you indeed have a new issue or request, click the "New Issue" button.
  • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

Setting up your development environment

  • Install Julia on your system.
  • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
  • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
  • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
    git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
  • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
  • Connect your repository to the upstream (main project).
    git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
  • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
  • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

Your development environment is now ready!

Pull Requests

Changes and contributions should be made via GitHub pull requests against the main branch.

When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

Documentation

All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
+julia --project=docs/ docs/make.jl

and then open docs/build/index.html in your favorite browser.

Credits

This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

diff --git a/dev/gpu/index.html b/dev/gpu/index.html index 866c9ccb..4f77bf23 100644 --- a/dev/gpu/index.html +++ b/dev/gpu/index.html @@ -1,5 +1,5 @@ -GPU · GeophysicalFlows.jl

GPU

GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
+GPU · GeophysicalFlows.jl

GPU

GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
 Problem
   ├─────────── grid: grid (on GPU)
   ├───── parameters: params
@@ -7,4 +7,4 @@
   ├─── state vector: sol
   ├─────── equation: eqn
   ├────────── clock: clock
-  └──── timestepper: RK4TimeStepper

Selecting GPU device

FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

+ └──── timestepper: RK4TimeStepper

Selecting GPU device

FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

diff --git a/dev/index.html b/dev/index.html index 730f2bad..877edbdf 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,5 +1,5 @@ -Home · GeophysicalFlows.jl

GeophysicalFlows.jl Documentation

Overview

GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

Examples

Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

Fourier transforms normalization

Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

\[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

\[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{- i k_x x_0}} ,\]

where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

Read more in the FourierFlows.jl Documentation; see Grids section.

Unicode

Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

Read more about Unicode symbols in the Julia Documentation.

Developers

The development of GeophysicalFlows.jl started by Navid C. Constantinou and Gregory L. Wagner during the 21st AOFD Meeting 2017. During the course of time various people have contributed to GeophysicalFlows.jl, including Lia Siegelman, Brodie Pearson, and André Palóczy (see the example in FourierFlows.jl).

Citing

If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

The bibtex entry for the paper is:

@article{GeophysicalFlowsJOSS,
+Home · GeophysicalFlows.jl

GeophysicalFlows.jl Documentation

Overview

GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

Examples

Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

Fourier transforms normalization

Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

\[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

\[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

Read more in the FourierFlows.jl Documentation; see Grids section.

Unicode

Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

Read more about Unicode symbols in the Julia Documentation.

Developers

The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

Citing

If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

The bibtex entry for the paper is:

@article{GeophysicalFlowsJOSS,
   doi = {10.21105/joss.03053},
   url = {https://doi.org/10.21105/joss.03053},
   year = {2021},
@@ -10,4 +10,4 @@
   author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
   title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
   journal = {Journal of Open Source Software}
-}
+}

Papers using GeophysicalFlows.jl

  1. Parfenyev, V., Blumenau, M., and Nikitin, I. (2024) Inferring parameters and reconstruction of two-dimensional turbulent flows with physics-informed neural networks. arXiv preprint arXiv:2404.01193, doi:10.48550/arXiv.2404.01193.

  2. Bischoff, T., and Deck, K. (2024) Unpaired downscaling of fluid flows with diffusion bridges. Artificial Intelligence for the Earth Systems, doi:10.1175/AIES-D-23-0039.1, in press.

  3. Kolokolov, I. V., Lebedev, V. V., and Parfenyev, V. M. (2024) Correlations in a weakly interacting two-dimensional random flow. Physical Review E, 109(3), 035103, doi:10.1103/PhysRevE.109.035103.

  4. Parfenyev, V. (2024) Statistical analysis of vortex condensate motion in two-dimensional turbulence. Physics of Fluids, 36, 015148, doi:10.1063/5.0187030.

  5. LaCasce, J. H., Palóczy, A., and Trodahl, M. (2024). Vortices over bathymetry. Journal of Fluid Mechanics, 979, A32, doi:10.1017/jfm.2023.1084.

  6. Drivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surveys in Mathematical Sciences, 10(1), 1–100, doi:10.4171/emss/66.

  7. Shokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.

  8. Siegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.

  9. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

  10. Parfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.

  11. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.

  12. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.

  13. Palóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

  14. Karrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

diff --git a/dev/installation_instructions/index.html b/dev/installation_instructions/index.html index d35607a7..370c5579 100644 --- a/dev/installation_instructions/index.html +++ b/dev/installation_instructions/index.html @@ -1,4 +1,4 @@ -Installation instructions · GeophysicalFlows.jl

Installation instructions

You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

julia>]
+Installation instructions · GeophysicalFlows.jl

Installation instructions

You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

julia> ]
 (v1.6) pkg> add GeophysicalFlows
-(v1.6) pkg> instantiate

We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

(v1.6) pkg> update GeophysicalFlows

Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

Use Julia 1.6 or newer

The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1

+(v1.6) pkg> instantiate

We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

(v1.6) pkg> update GeophysicalFlows

Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

Use Julia 1.6 or newer

The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

diff --git a/dev/lib/functions/index.html b/dev/lib/functions/index.html index d27892d7..9a7a36a8 100644 --- a/dev/lib/functions/index.html +++ b/dev/lib/functions/index.html @@ -1,83 +1,88 @@ -Functions · GeophysicalFlows.jl

Functions

GeophysicalFlows

Exported functions

GeophysicalFlows.lambdipoleFunction
lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

source
GeophysicalFlows.peakedisotropicspectrumFunction
peakedisotropicspectrum(grid, kpeak, E₀; mask=mask, allones=false)

Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

source

TwoDNavierStokes

Exported functions

GeophysicalFlows.TwoDNavierStokes.ProblemFunction
Problem(dev::Device=CPU();
-            nx = 256,
-            ny = nx,
-            Lx = 2π,
-            Ly = Lx,
-             ν = 0,
-            nν = 1,
-             μ = 0,
-            nμ = 0,
-            dt = 0.01,
-       stepper = "RK4",
-         calcF = nothingfunction,
-    stochastic = false,

aliased_fraction = 1/3, T = Float64)

Construct a two-dimensional Navier-Stokes problem on device dev.

Keyword arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.
  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Large-scale (hypo)-viscosity coefficient.
  • : (Hypo)-viscosity order, $≤ 0$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.TwoDNavierStokes.energy_workFunction
energy_work(prob)

Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

\[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

where $ψ$ is the stream flow.

source
GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
enstrophy_work(prob)

Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

\[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

where $ζ$ is the relative vorticity.

source

Private functions

GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

\[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

source
GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
energy_dissipation(prob, ξ, νξ)

Return the domain-averaged energy dissipation rate done by the viscous term,

\[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

source
GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
enstrophy_dissipation(prob, ξ, νξ)

Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

\[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

source

SingleLayerQG

Exported functions

GeophysicalFlows.SingleLayerQG.ProblemFunction
Problem(dev::Device=CPU();
-                  nx = 256,
-                  ny = nx,
-                  Lx = 2π,
-                  Ly = Lx,
-                   β = 0.0,
-  deformation_radius = Inf,
-                 eta = nothing,
-                   ν = 0.0,
-                  nν = 1,
-                   μ = 0.0,
-                  dt = 0.01,
-             stepper = "RK4",
-               calcF = nothingfunction,
-          stochastic = false,
-    aliased_fraction = 1/3,
-                   T = Float64)

Construct a single-layer quasi-geostrophic problem on device dev.

Keyword arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.
  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • β: Planetary vorticity $y$-gradient.
  • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
  • eta: Topographic potential vorticity.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Linear drag coefficient.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source

Private functions

GeophysicalFlows.SingleLayerQG.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

\[N = - \widehat{𝖩(ψ, q+η)} = - i k_x \widehat{u (q+η)} - i k_y \widehat{v (q+η)} .\]

source

MultiLayerQG

Exported functions

GeophysicalFlows.MultiLayerQG.ProblemFunction
Problem(nlayers::Int,
-            dev = CPU();
-             nx = 128,
-             ny = nx,
-             Lx = 2π,
-             Ly = Lx,
-             f₀ = 1.0,
-              β = 0.0,
-              g = 1.0,
-              U = zeros(nlayers),
-              H = 1/nlayers * ones(nlayers),
-              ρ = Array{Float64}(1:nlayers),
-            eta = nothing,
-              μ = 0,
-              ν = 0,
-             nν = 1,
-             dt = 0.01,
-        stepper = "RK4",
-         calcFq = nothingfunction,
-     stochastic = false,
-         linear = false,

aliased_fraction = 1/3, T = Float64)

Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

Keyword arguments

  • nlayers: (required) Number of fluid layers.
  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.
  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • f₀: Constant planetary vorticity.
  • β: Planetary vorticity $y$-gradient.
  • g: Gravitational acceleration constant.
  • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
  • H: Rest height of each fluid layer.
  • ρ: Density of each fluid layer.
  • eta: Topographic potential vorticity.
  • μ: Linear bottom drag coefficient.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
streamfunctionfrompv!(ψh, qh, params, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

source
streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

source
streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

\[ψ̂₁ = - [k⁻² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

\[ψ̂₂ = - [k⁻² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

source
GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
pvfromstreamfunction!(qh, ψh, params, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

source
pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

source
pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

\[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) * (ψ̂₂ - ψ̂₁) ,\]

\[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) * (ψ̂₁ - ψ̂₂) .\]

(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

source

Private functions

GeophysicalFlows.MultiLayerQG.LinearEquationFunction
LinearEquation(params, grid)

Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

The nonlinear term is computed via function calcNlinear!.

source
GeophysicalFlows.MultiLayerQG.calcNlinear!Function
calcNlinear!(N, sol, t, clock, vars, params, grid)

Compute the nonlinear term of the linearized equations:

\[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} -- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

source
GeophysicalFlows.MultiLayerQG.calcN_advection!Function
calcN_advection!(N, sol, vars, params, grid)

Compute the advection term and stores it in N:

\[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} - + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

source
GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
calcN_linearadvection!(N, sol, vars, params, grid)

Compute the advection term of the linearized equations and stores it in N:

\[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} - + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

source

SurfaceQG

Exported functions

GeophysicalFlows.SurfaceQG.ProblemFunction
Problem(dev::Device=CPU();
-             nx = 256,
-             Lx = 2π,
-             ny = nx,
-             Ly = Lx,
-              ν = 0,
-             nν = 1,
-             dt = 0.01,
-        stepper = "RK4",
-          calcF = nothingfunction,
-     stochastic = false,

aliased_fraction = 1/3, T = Float64)

Construct a surface quasi-geostrophic problem on device dev.

Keyword arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.
  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
buoyancy_dissipation(prob)

Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

\[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

source
GeophysicalFlows.SurfaceQG.buoyancy_workFunction
buoyancy_work(prob)
-buoyancy_work(sol, vars, grid)

Return the domain-averaged rate of work of buoyancy variance by the forcing,

\[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

source

Private functions

GeophysicalFlows.SurfaceQG.calcN_advection!Function
calcN_advection(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

\[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

source

BarotropicQGQL

Exported functions

GeophysicalFlows.BarotropicQGQL.ProblemFunction
Problem(dev::Device=CPU();
-                  nx = 256,
-                  ny = nx,
-                  Lx = 2π,
-                  Ly = Lx,
-                   β = 0.0,
-  deformation_radius = Inf,
-                 eta = nothing,
-                   ν = 0.0,
-                  nν = 1,
-                   μ = 0.0,
-                  dt = 0.01,
-             stepper = "RK4",
-               calcF = nothingfunction,
-          stochastic = false,
-    aliased_fraction = 1/3,
-                   T = Float64)

Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

Keyword arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.
  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • β: Planetary vorticity $y$-gradient.
  • eta: Topographic potential vorticity.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Linear drag coefficient.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source

Private functions

+Functions · GeophysicalFlows.jl

Functions

GeophysicalFlows

GeophysicalFlows.GeophysicalFlowsModule

Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.

source

Exported functions

GeophysicalFlows.lambdipoleFunction
lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

source
GeophysicalFlows.peakedisotropicspectrumFunction
peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

source

TwoDNavierStokes

Exported functions

GeophysicalFlows.TwoDNavierStokes.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 ny = nx,
+                 Lx = 2π,
+                 Ly = Lx,
+                  ν = 0,
+                 nν = 1,
+                  μ = 0,
+                 nμ = 0,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a two-dimensional Navier-Stokes problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Large-scale (hypo)-viscosity coefficient.
  • : (Hypo)-viscosity order, $≤ 0$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.TwoDNavierStokes.energy_workFunction
energy_work(prob)

Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

\[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

where $ψ$ is the stream flow.

source
GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
enstrophy_work(prob)

Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

\[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

where $ζ$ is the relative vorticity.

source
GeophysicalFlows.TwoDNavierStokes.palinstrophyFunction
palinstrophy(prob)

Return the problem's (prob) domain-averaged palinstrophy,

\[\int \frac1{2} |{\bf ∇} ζ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ζ̂|² ,\]

where $ζ$ is the relative vorticity.

source

Private functions

GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

\[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

source
GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
energy_dissipation(prob, ξ, νξ)

Return the domain-averaged energy dissipation rate done by the viscous term,

\[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

source
GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
enstrophy_dissipation(prob, ξ, νξ)

Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

\[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

source

SingleLayerQG

Exported functions

GeophysicalFlows.SingleLayerQG.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 ny = nx,
+                 Lx = 2π,
+                 Ly = Lx,
+                  β = 0.0,
+ deformation_radius = Inf,
+                eta = nothing,
+                  ν = 0.0,
+                 nν = 1,
+                  μ = 0.0,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a single-layer quasi-geostrophic problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • β: Planetary vorticity $y$-gradient.
  • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
  • eta: Topographic potential vorticity.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Linear drag coefficient.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source

Private functions

GeophysicalFlows.SingleLayerQG.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

\[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

source

MultiLayerQG

Exported functions

GeophysicalFlows.MultiLayerQG.ProblemFunction
Problem(nlayers :: Int,
+                    dev = CPU();
+                     nx = 128,
+                     ny = nx,
+                     Lx = 2π,
+                     Ly = Lx,
+                     f₀ = 1.0,
+                      β = 0.0,
+                      U = zeros(nlayers),
+                      H = 1/nlayers * ones(nlayers),
+                      b = -(1 .+ 1/nlayers * Array{Float64}(0:nlayers-1)),
+                    eta = nothing,
+topographic_pv_gradient = (0, 0),
+                      μ = 0,
+                      ν = 0,
+                     nν = 1,
+                     dt = 0.01,
+                stepper = "RK4",
+                 calcFq = nothingfunction,
+             stochastic = false,
+                 linear = false,
+       aliased_fraction = 1/3,
+                      T = Float64)

Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

Arguments

  • nlayers: (required) Number of fluid layers.
  • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • f₀: Constant planetary vorticity.
  • β: Planetary vorticity $y$-gradient.
  • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
  • H: Rest height of each fluid layer.
  • b: Boussinesq buoyancy of each fluid layer.
  • eta: Periodic component of the topographic potential vorticity.
  • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
  • μ: Linear bottom drag coefficient.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
  • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64 (default); floating point type used for problem data.
source
GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
streamfunctionfrompv!(ψh, qh, params, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

source
streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

source
streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

\[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

\[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

source
GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
pvfromstreamfunction!(qh, ψh, params, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

source
pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

source
pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

\[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) (ψ̂₂ - ψ̂₁) ,\]

\[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) (ψ̂₁ - ψ̂₂) .\]

(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

source

Private functions

GeophysicalFlows.MultiLayerQG.LinearEquationFunction
LinearEquation(params, grid)

Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

The nonlinear term is computed via function calcNlinear!.

source
GeophysicalFlows.MultiLayerQG.calcS!Function
calcS!(S, Fp, Fm, nlayers, grid)

Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

source
GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
calcS⁻¹!(S, Fp, Fm, nlayers, grid)

Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

source
GeophysicalFlows.MultiLayerQG.calcNlinear!Function
calcNlinear!(N, sol, t, clock, vars, params, grid)

Compute the nonlinear term of the linearized equations:

\[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

source
GeophysicalFlows.MultiLayerQG.calcN_advection!Function
calcN_advection!(N, sol, vars, params, grid)

Compute the advection term and stores it in N:

\[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

source
GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
calcN_linearadvection!(N, sol, vars, params, grid)

Compute the advection term of the linearized equations and stores it in N:

\[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

source

SurfaceQG

Exported functions

GeophysicalFlows.SurfaceQG.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 Lx = 2π,
+                 ny = nx,
+                 Ly = Lx,
+                  ν = 0,
+                 nν = 1,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a surface quasi-geostrophic problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
buoyancy_dissipation(prob)

Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

\[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

source
GeophysicalFlows.SurfaceQG.buoyancy_workFunction
buoyancy_work(prob)
+buoyancy_work(sol, vars, grid)

Return the domain-averaged rate of work of buoyancy variance by the forcing,

\[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

source

Private functions

GeophysicalFlows.SurfaceQG.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

\[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

source

BarotropicQGQL

Exported functions

GeophysicalFlows.BarotropicQGQL.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 ny = nx,
+                 Lx = 2π,
+                 Ly = Lx,
+                  β = 0.0,
+                eta = nothing,
+                  ν = 0.0,
+                 nν = 1,
+                  μ = 0.0,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • β: Planetary vorticity $y$-gradient.
  • eta: Topographic potential vorticity.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Linear drag coefficient.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source

Private functions

diff --git a/dev/lib/types/index.html b/dev/lib/types/index.html index 7af3f168..7d0bd991 100644 --- a/dev/lib/types/index.html +++ b/dev/lib/types/index.html @@ -1,2 +1,2 @@ -Private types · GeophysicalFlows.jl

Private types

TwoDNavierStokes

GeophysicalFlows.TwoDNavierStokes.ParamsType
struct Params{T} <: AbstractParams

The parameters for a two-dimensional Navier-Stokes problem:

  • ν::Any

    small-scale (hyper)-viscosity coefficient

  • nν::Int64

    (hyper)-viscosity order, $≥ 1$

  • μ::Any

    large-scale (hypo)-viscosity coefficient

  • nμ::Int64

    (hypo)-viscosity order, $≤ 0$

  • calcF!::Function

    function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.TwoDNavierStokes.VarsType
struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

The variables for two-dimensional Navier-Stokes problem:

  • ζ

    relative vorticity

  • u

    x-component of velocity

  • v

    y-component of velocity

  • ζh

    Fourier transform of relative vorticity

  • uh

    Fourier transform of x-component of velocity

  • vh

    Fourier transform of y-component of velocity

  • Fh

    Fourier transform of forcing

  • prevsol

    sol at previous time-step

source

SingleLayerQG

GeophysicalFlows.SingleLayerQG.ParamsType
struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

The parameters for the SingleLayerQG problem.

  • β::Any

    planetary vorticity $y$-gradient

  • deformation_radius::Any

    Rossby radius of deformation

  • eta::Any

    topographic potential vorticity

  • etah::Any

    Fourier transform of topographic potential vorticity

  • μ::Any

    linear drag coefficient

  • ν::Any

    small-scale (hyper)-viscosity coefficient

  • nν::Int64

    (hyper)-viscosity order, $≥ 1$

  • calcF!::Function

    function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.SingleLayerQG.VarsType
struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

The variables for SingleLayer QG:

  • q

    relative vorticity (+ vortex stretching)

  • ψ

    streamfunction

  • u

    x-component of velocity

  • v

    y-component of velocity

  • qh

    Fourier transform of relative vorticity (+ vortex stretching)

  • ψh

    Fourier transform of streamfunction

  • uh

    Fourier transform of x-component of velocity

  • vh

    Fourier transform of y-component of velocity

  • Fh

    Fourier transform of forcing

  • prevsol

    sol at previous time-step

source

MultiLayerQG

GeophysicalFlows.MultiLayerQG.ParamsType
struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams

The parameters for the MultiLayerQG problem.

  • nlayers::Int64

    number of fluid layers

  • g::Any

    gravitational constant

  • f₀::Any

    constant planetary vorticity

  • β::Any

    planetary vorticity $y$-gradient

  • ρ::Any

    array with density of each fluid layer

  • H::Any

    array with rest height of each fluid layer

  • U::Any

    array with imposed constant zonal flow $U(y)$ in each fluid layer

  • eta::Any

    array containing the topographic PV

  • μ::Any

    linear bottom drag coefficient

  • ν::Any

    small-scale (hyper)-viscosity coefficient

  • nν::Int64

    (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function

    function that calculates the Fourier transform of the forcing, $F̂$

  • g′::Any

    array with the reduced gravity constants for each fluid interface

  • Qx::Any

    array containing $x$-gradient of PV due to eta in each fluid layer

  • Qy::Any

    array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

  • S::Any

    array containing coeffients for getting PV from streamfunction

  • S⁻¹::Any

    array containing coeffients for inverting PV to streamfunction

  • rfftplan::Any

    rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

The parameters for the SingleLayerQG problem.

  • β::Any

    planetary vorticity y-gradient

  • U::Any

    array with imposed constant zonal flow U(y)

  • eta::Any

    array containing topographic PV

  • μ::Any

    linear drag coefficient

  • ν::Any

    small-scale (hyper)-viscosity coefficient

  • nν::Int64

    (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function

    function that calculates the Fourier transform of the forcing, $F̂$

  • Qx::Any

    array containing x-gradient of PV due to eta

  • Qy::Any

    array containing y-gradient of PV due to β, U, and eta

  • rfftplan::Any

    rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.VarsType
struct Vars{Aphys, Atrans, F, P} <: AbstractVars

The variables for MultiLayer QG.

  • q

    relative vorticity + vortex stretching

  • ψ

    streamfunction

  • u

    x-component of velocity

  • v

    y-component of velocity

  • qh

    Fourier transform of relative vorticity + vortex stretching

  • ψh

    Fourier transform of streamfunction

  • uh

    Fourier transform of x-component of velocity

  • vh

    Fourier transform of y-component of velocity

  • Fqh

    Fourier transform of forcing

  • prevsol

    sol at previous time-step

source

SurfaceQG

GeophysicalFlows.SurfaceQG.ParamsType
Params{T}(ν, nν, calcF!)

A struct containing the parameters for Surface QG dynamics. Included are:

  • ν::Any

    buoyancy (hyper)-viscosity coefficient

  • nν::Int64

    buoyancy (hyper)-viscosity order

  • calcF!::Function

    function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.SurfaceQG.VarsType
Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

The variables for surface QG problem:

  • b

    buoyancy

  • u

    x-component of velocity

  • v

    y-component of velocity

  • bh

    Fourier transform of buoyancy

  • uh

    Fourier transform of x-component of velocity

  • vh

    Fourier transform of y-component of velocity

  • Fh

    Fourier transform of forcing

  • prevsol

    sol at previous time-step

source

BarotropicQGQL

GeophysicalFlows.BarotropicQGQL.ParamsType
Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

A struct containing the parameters for a barotropic QL QG problem. Included are:

  • β::Any

    planetary vorticity $y$-gradient

  • eta::Any

    topographic potential vorticity

  • etah::Any

    Fourier transform of topographic potential vorticity

  • μ::Any

    linear drag coefficient

  • ν::Any

    small-scale (hyper)-viscosity coefficient

  • nν::Int64

    (hyper)-viscosity order, $≥ 1$

  • calcF!::Function

    function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.BarotropicQGQL.VarsType
Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

The variables for barotropic QL QG:

  • u

    x-component of small-scale velocity

  • v

    y-component of small-scale velocity

  • U

    x-component of large-scale velocity

  • uzeta

    small-scale u′ζ′

  • vzeta

    small-scale v′ζ′

  • zeta

    small-scale relative vorticity

  • Zeta

    large-scale relative vorticity

  • psi

    small-scale relative vorticity

  • Psi

    large-scale relative vorticity

  • Nz

    small-scale nonlinear term

  • NZ

    large-scale nonlinear term

  • uh

    Fourier transform of x-component of small-scale velocity

  • vh

    Fourier transform of y-component of small-scale velocity

  • Uh

    Fourier transform of x-component of large-scale velocity

  • zetah

    Fourier transform of small-scale relative vorticity

  • Zetah

    Fourier transform of large-scale relative vorticity

  • psih

    Fourier transform of small-scale relative vorticity

  • Psih

    Fourier transform of large-scale relative vorticity

  • Fh

    Fourier transform of forcing

  • prevsol

    sol at previous time-step

source
+Private types · GeophysicalFlows.jl

Private types

TwoDNavierStokes

GeophysicalFlows.TwoDNavierStokes.ParamsType
struct Params{T} <: AbstractParams

The parameters for a two-dimensional Navier-Stokes problem:

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • μ::Any: large-scale (hypo)-viscosity coefficient

  • nμ::Int64: (hypo)-viscosity order, $≤ 0$

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.TwoDNavierStokes.VarsType
struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

The variables for two-dimensional Navier-Stokes problem:

  • ζ: relative vorticity

  • u: x-component of velocity

  • v: y-component of velocity

  • ζh: Fourier transform of relative vorticity

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

SingleLayerQG

GeophysicalFlows.SingleLayerQG.ParamsType
struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

The parameters for the SingleLayerQG problem.

  • β::Any: planetary vorticity $y$-gradient

  • deformation_radius::Any: Rossby radius of deformation

  • eta::Any: topographic potential vorticity

  • etah::Any: Fourier transform of topographic potential vorticity

  • μ::Any: linear drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.SingleLayerQG.VarsType
struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

The variables for SingleLayer QG:

  • q: relative vorticity (+ vortex stretching)

  • ψ: streamfunction

  • u: $x$-component of velocity

  • v: $y$-component of velocity

  • qh: Fourier transform of relative vorticity (+ vortex stretching)

  • ψh: Fourier transform of streamfunction

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

MultiLayerQG

GeophysicalFlows.MultiLayerQG.ParamsType
struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams

The parameters for the MultiLayerQG problem.

  • nlayers::Int64: number of fluid layers

  • f₀::Any: constant planetary vorticity

  • β::Any: planetary vorticity $y$-gradient

  • b::Tuple: array with Boussinesq buoyancy of each fluid layer

  • H::Tuple: array with rest height of each fluid layer

  • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

  • eta::Any: array containing the topographic PV

  • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

  • μ::Any: linear bottom drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

  • g′::Tuple: array with the reduced gravity constants for each fluid interface

  • Qx::Any: array containing $x$-gradient of PV due to eta in each fluid layer

  • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

  • S::Any: array containing coeffients for getting PV from streamfunction

  • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

  • rfftplan::Any: rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

The parameters for the a single-layer MultiLayerQG problem.

  • β::Any: planetary vorticity $y$-gradient

  • U::Any: array with imposed constant zonal flow $U(y)$

  • eta::Any: array containing the periodic component of the topographic PV

  • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

  • μ::Any: linear drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

  • Qx::Any: array containing $x$-gradient of PV due to topographic PV

  • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

  • rfftplan::Any: rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

The parameters for the a two-layer MultiLayerQG problem.

  • f₀::Any: constant planetary vorticity

  • β::Any: planetary vorticity $y$-gradient

  • b::Tuple: array with Boussinesq buoyancy of each fluid layer

  • H::Tuple: tuple with rest height of each fluid layer

  • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

  • eta::Any: array containing periodic component of the topographic PV

  • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

  • μ::Any: linear bottom drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

  • g′::Any: the reduced gravity constants for the fluid interface

  • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

  • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

  • rfftplan::Any: rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.VarsType
struct Vars{Aphys, Atrans, F, P} <: AbstractVars

The variables for multi-layer QG problem.

  • q: relative vorticity + vortex stretching

  • ψ: streamfunction

  • u: x-component of velocity

  • v: y-component of velocity

  • qh: Fourier transform of relative vorticity + vortex stretching

  • ψh: Fourier transform of streamfunction

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fqh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

SurfaceQG

GeophysicalFlows.SurfaceQG.ParamsType
Params{T}(ν, nν, calcF!)

A struct containing the parameters for Surface QG dynamics. Included are:

  • ν::Any: buoyancy (hyper)-viscosity coefficient

  • nν::Int64: buoyancy (hyper)-viscosity order

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.SurfaceQG.VarsType
Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

The variables for surface QG problem:

  • b: buoyancy

  • u: $x$-component of velocity

  • v: $y$-component of velocity

  • bh: Fourier transform of buoyancy

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

BarotropicQGQL

GeophysicalFlows.BarotropicQGQL.ParamsType
Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

A struct containing the parameters for a barotropic QL QG problem. Included are:

  • β::Any: planetary vorticity $y$-gradient

  • eta::Any: topographic potential vorticity

  • etah::Any: Fourier transform of topographic potential vorticity

  • μ::Any: linear drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.BarotropicQGQL.VarsType
Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

The variables for barotropic QL QG:

  • u: $x$-component of small-scale velocity

  • v: $y$-component of small-scale velocity

  • U: $x$-component of large-scale velocity

  • uzeta: small-scale $u′ζ′$

  • vzeta: small-scale $v′ζ′$

  • zeta: small-scale relative vorticity

  • Zeta: large-scale relative vorticity

  • psi: small-scale streamfunction

  • Psi: large-scale streamfunction

  • Nz: small-scale nonlinear term

  • NZ: large-scale nonlinear term

  • uh: Fourier transform of $x$-component of small-scale velocity

  • vh: Fourier transform of $y$-component of small-scale velocity

  • Uh: Fourier transform of $x$-component of large-scale velocity

  • zetah: Fourier transform of small-scale relative vorticity

  • Zetah: Fourier transform of large-scale relative vorticity

  • psih: Fourier transform of small-scale relative vorticity

  • Psih: Fourier transform of large-scale relative vorticity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source
diff --git a/dev/literated/barotropicqgql_betaforced-24.png b/dev/literated/barotropicqgql_betaforced-24.png new file mode 100644 index 00000000..46f9c19c Binary files /dev/null and b/dev/literated/barotropicqgql_betaforced-24.png differ diff --git a/dev/literated/barotropicqgql_betaforced.mp4 b/dev/literated/barotropicqgql_betaforced.mp4 index 3e8321b6..11437bfd 100644 Binary files a/dev/literated/barotropicqgql_betaforced.mp4 and b/dev/literated/barotropicqgql_betaforced.mp4 differ diff --git a/dev/literated/barotropicqgql_betaforced/index.html b/dev/literated/barotropicqgql_betaforced/index.html index 64f8d36b..962f990a 100644 --- a/dev/literated/barotropicqgql_betaforced/index.html +++ b/dev/literated/barotropicqgql_betaforced/index.html @@ -1,11 +1,11 @@ -Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

This example can be viewed as a Jupyter notebook via .

A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CUDA, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
 
 using Statistics: mean
 
 parsevalsum = FourierFlows.parsevalsum
-record = CairoMakie.record
record (generic function with 2 methods)

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

      n = 128            # 2D resolution = n^2
+record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

      n = 128            # 2D resolution = n^2
 stepper = "FilteredRK4"  # timestepper
      dt = 0.05           # timestep
  nsteps = 8000           # total number of time-steps
@@ -23,11 +23,9 @@
 @CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
 
 ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
-@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

random_uniform = dev==CPU() ? rand : CUDA.rand
-
-function calcF!(Fh, sol, t, clock, vars, params, grid)
-  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
-
+@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

function calcF!(Fh, sol, t, clock, vars, params, grid)
+  randn!(Fh)
+  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
   return nothing
 end

Problem setup

We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
                               calcF=calcF!, stochastic=true, aliased_fraction=0)

and define some shortcuts.

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
@@ -46,7 +44,7 @@
 heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
          colormap = :balance, colorrange = (-8, 8))
 
-fig

Setting initial conditions

Our initial condition is simply fluid at rest.

BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostics – energy and enstrophy are functions imported at the top.

E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
+fig

Setting initial conditions

Our initial condition is simply fluid at rest.

BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostics – energy and enstrophy are functions imported at the top.

E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
 Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

We can also define our custom diagnostics via functions.

zetaMean(prob) = prob.sol[1, :]
 
 zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

We combile all diags in a list.

diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

Output

We choose folder for outputing .jld2 files and snapshots (.png files).

filepath = "."
@@ -64,10 +62,10 @@
   return  vars.u
 end
 
-out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
Output
+out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
Output
   ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
   ├──── path: ./forcedbetaQLturb.jld2
-  └── fields: Dict{Symbol, Function}(:sol => Main.get_sol, :u => Main.get_u)

Visualizing the simulation

We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
+  └── fields: Dict{Symbol, Function}(:sol => Main.var"##246".get_sol, :u => Main.var"##246".get_u)

Visualizing the simulation

We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
 title_ψ = "streamfunction ψ"
 
 fig = Figure(resolution=(1000, 600))
@@ -129,7 +127,8 @@
 lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
 
 lines!(axE, μt, energy; linewidth = 3)
-lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
+lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)
+

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
 
 frames = 0:round(Int, nsteps / nsubs)
 
@@ -157,13 +156,14 @@
 
   stepforward!(prob, diags, nsubs)
   BarotropicQGQL.updatevars!(prob)
-end
step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
-step: 1000, t: 50, cfl: 0.73, E: 0.0306, Q: 4.1841, walltime: 0.12 min
-step: 2000, t: 100, cfl: 0.81, E: 0.0400, Q: 3.8932, walltime: 0.23 min
-step: 3000, t: 150, cfl: 0.83, E: 0.0451, Q: 4.1653, walltime: 0.36 min
-step: 4000, t: 200, cfl: 0.84, E: 0.0467, Q: 4.3571, walltime: 0.49 min
-step: 5000, t: 250, cfl: 0.82, E: 0.0473, Q: 4.0309, walltime: 0.62 min
-step: 6000, t: 300, cfl: 1.07, E: 0.0473, Q: 3.4528, walltime: 0.76 min
-step: 7000, t: 350, cfl: 0.90, E: 0.0461, Q: 3.4042, walltime: 0.91 min
-step: 8000, t: 400, cfl: 0.86, E: 0.0476, Q: 3.6934, walltime: 1.06 min

Save

Finally, we can save, e.g., the last snapshot via

savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
-savefig(savename)

This page was generated using Literate.jl.

+end
step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
+step: 1000, t: 50, cfl: 0.67, E: 0.0319, Q: 4.6924, walltime: 0.13 min
+step: 2000, t: 100, cfl: 0.81, E: 0.0410, Q: 4.1952, walltime: 0.23 min
+step: 3000, t: 150, cfl: 0.80, E: 0.0453, Q: 4.0640, walltime: 0.33 min
+step: 4000, t: 200, cfl: 0.96, E: 0.0458, Q: 4.1056, walltime: 0.44 min
+step: 5000, t: 250, cfl: 0.87, E: 0.0474, Q: 4.3665, walltime: 0.55 min
+step: 6000, t: 300, cfl: 0.79, E: 0.0495, Q: 4.6566, walltime: 0.67 min
+step: 7000, t: 350, cfl: 0.79, E: 0.0484, Q: 4.2472, walltime: 0.80 min
+step: 8000, t: 400, cfl: 0.92, E: 0.0479, Q: 3.8324, walltime: 0.93 min
+

Save

Finally, we can save, e.g., the last snapshot via

savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
+savefig(savename)

This page was generated using Literate.jl.

diff --git a/dev/literated/multilayerqg_2layer-31.png b/dev/literated/multilayerqg_2layer-31.png new file mode 100644 index 00000000..890c434c Binary files /dev/null and b/dev/literated/multilayerqg_2layer-31.png differ diff --git a/dev/literated/multilayerqg_2layer.mp4 b/dev/literated/multilayerqg_2layer.mp4 index 942ba5db..5b7d72e6 100644 Binary files a/dev/literated/multilayerqg_2layer.mp4 and b/dev/literated/multilayerqg_2layer.mp4 differ diff --git a/dev/literated/multilayerqg_2layer/index.html b/dev/literated/multilayerqg_2layer/index.html index 56a4e470..61b2dcc3 100644 --- a/dev/literated/multilayerqg_2layer/index.html +++ b/dev/literated/multilayerqg_2layer/index.html @@ -1,5 +1,5 @@ -Phillips model of Baroclinic Instability · GeophysicalFlows.jl

Phillips model of Baroclinic Instability

This example can be viewed as a Jupyter notebook via .

A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+Phillips model of Baroclinic Instability · GeophysicalFlows.jl

Phillips model of Baroclinic Instability

A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CairoMakie, Printf"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CairoMakie, Printf
 
 using Random: seed!

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

n = 128                  # 2D resolution = n²
@@ -11,13 +11,13 @@
 β = 5                    # the y-gradient of planetary PV
 
 nlayers = 2              # number of layers
-f₀, g = 1, 1             # Coriolis parameter and gravitational constant
+f₀ = 1                   # Coriolis parameter
 H = [0.2, 0.8]           # the rest depths of each layer
-ρ = [4.0, 5.0]           # the density of each layer
+b = [-1.0, -1.2]         # Boussinesq buoyancy of each layer
 
 U = zeros(nlayers)       # the imposed mean zonal flow in each layer
 U[1] = 1.0
-U[2] = 0.0

Problem setup

We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,
+U[2] = 0.0

Problem setup

We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, H, b, U, μ, β,
                             dt, stepper, aliased_fraction=0)

and define some shortcuts.

sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
 x, y = grid.x, grid.y

Setting initial conditions

Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

seed!(1234) # reset of the random number generator for reproducibility
 q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
@@ -126,7 +126,7 @@
 
 lines!(axPE, PE; linewidth = 3)
 
-fig

Time-stepping the Problem forward

Finally, we time-step the Problem forward in time.

startwalltime = time()
+fig

Time-stepping the Problem forward

Finally, we time-step the Problem forward in time.

startwalltime = time()
 
 frames = 0:round(Int, nsteps / nsubs)
 
@@ -156,26 +156,26 @@
 
   stepforward!(prob, diags, nsubs)
   MultiLayerQG.updatevars!(prob)
-end
step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.155e-08, KE₂: 5.483e-08, PE: 2.958e-09, walltime: 0.00 min
-step: 1000, t: 2.5, cfl: 0.00, KE₁: 5.244e-08, KE₂: 5.825e-08, PE: 5.358e-08, walltime: 0.16 min
-step: 2000, t: 5.0, cfl: 0.00, KE₁: 2.217e-07, KE₂: 1.199e-07, PE: 2.265e-07, walltime: 0.31 min
-step: 3000, t: 7.5, cfl: 0.00, KE₁: 1.086e-06, KE₂: 4.801e-07, PE: 1.064e-06, walltime: 0.47 min
-step: 4000, t: 10.0, cfl: 0.00, KE₁: 5.889e-06, KE₂: 2.540e-06, PE: 5.620e-06, walltime: 0.64 min
-step: 5000, t: 12.5, cfl: 0.00, KE₁: 3.371e-05, KE₂: 1.462e-05, PE: 3.161e-05, walltime: 0.82 min
-step: 6000, t: 15.0, cfl: 0.01, KE₁: 1.982e-04, KE₂: 8.661e-05, PE: 1.830e-04, walltime: 1.00 min
-step: 7000, t: 17.5, cfl: 0.01, KE₁: 1.183e-03, KE₂: 5.208e-04, PE: 1.079e-03, walltime: 1.18 min
-step: 8000, t: 20.0, cfl: 0.03, KE₁: 7.085e-03, KE₂: 3.135e-03, PE: 6.403e-03, walltime: 1.37 min
-step: 9000, t: 22.5, cfl: 0.07, KE₁: 4.052e-02, KE₂: 1.793e-02, PE: 3.677e-02, walltime: 1.55 min
-step: 10000, t: 25.0, cfl: 0.14, KE₁: 1.811e-01, KE₂: 8.137e-02, PE: 1.657e-01, walltime: 1.73 min
-step: 11000, t: 27.5, cfl: 0.25, KE₁: 4.429e-01, KE₂: 2.442e-01, PE: 4.258e-01, walltime: 1.90 min
-step: 12000, t: 30.0, cfl: 0.32, KE₁: 4.698e-01, KE₂: 3.582e-01, PE: 4.651e-01, walltime: 2.05 min
-step: 13000, t: 32.5, cfl: 0.26, KE₁: 5.896e-01, KE₂: 4.633e-01, PE: 6.751e-01, walltime: 2.20 min
-step: 14000, t: 35.0, cfl: 0.34, KE₁: 6.182e-01, KE₂: 5.679e-01, PE: 7.170e-01, walltime: 2.35 min
-
-step: 15000, t: 37.5, cfl: 0.30, KE₁: 5.797e-01, KE₂: 6.093e-01, PE: 6.326e-01, walltime: 2.51 min
-step: 16000, t: 40.0, cfl: 0.46, KE₁: 6.247e-01, KE₂: 7.122e-01, PE: 6.174e-01, walltime: 2.66 min
-step: 17000, t: 42.5, cfl: 0.29, KE₁: 6.080e-01, KE₂: 7.531e-01, PE: 5.883e-01, walltime: 2.80 min
-step: 18000, t: 45.0, cfl: 0.26, KE₁: 5.854e-01, KE₂: 7.434e-01, PE: 5.653e-01, walltime: 2.94 min
-step: 19000, t: 47.5, cfl: 0.29, KE₁: 5.787e-01, KE₂: 8.048e-01, PE: 5.229e-01, walltime: 3.08 min
-step: 20000, t: 50.0, cfl: 0.25, KE₁: 5.467e-01, KE₂: 7.608e-01, PE: 5.300e-01, walltime: 3.23 min

Save

Finally, we can save, e.g., the last snapshot via

savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
-savefig(savename)

This page was generated using Literate.jl.

+end
step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min
+step: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.31 min
+step: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.45 min
+step: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.58 min
+step: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.72 min
+step: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.85 min
+step: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.99 min
+step: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.14 min
+step: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.30 min
+step: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.45 min
+step: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.59 min
+step: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.74 min
+step: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.88 min
+step: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 2.01 min
+step: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.14 min
+step: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.27 min
+step: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.40 min
+step: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.52 min
+step: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.64 min
+step: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.76 min
+step: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.87 min
+

Save

Finally, we can save, e.g., the last snapshot via

savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
+savefig(savename)

This page was generated using Literate.jl.

diff --git a/dev/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/dev/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 index ce3517c7..b179cb38 100644 Binary files a/dev/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 and b/dev/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/dev/literated/singlelayerqg_betadecay-20.png b/dev/literated/singlelayerqg_betadecay-20.png new file mode 100644 index 00000000..941ac868 Binary files /dev/null and b/dev/literated/singlelayerqg_betadecay-20.png differ diff --git a/dev/literated/singlelayerqg_betadecay-33.png b/dev/literated/singlelayerqg_betadecay-33.png new file mode 100644 index 00000000..c5f81adc Binary files /dev/null and b/dev/literated/singlelayerqg_betadecay-33.png differ diff --git a/dev/literated/singlelayerqg_betadecay.mp4 b/dev/literated/singlelayerqg_betadecay.mp4 index 7c70eb00..6aee0c68 100644 Binary files a/dev/literated/singlelayerqg_betadecay.mp4 and b/dev/literated/singlelayerqg_betadecay.mp4 differ diff --git a/dev/literated/singlelayerqg_betadecay/index.html b/dev/literated/singlelayerqg_betadecay/index.html index 684bfe86..75ed4d34 100644 --- a/dev/literated/singlelayerqg_betadecay/index.html +++ b/dev/literated/singlelayerqg_betadecay/index.html @@ -1,12 +1,12 @@ -Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

Decaying barotropic QG beta-plane turbulence

This example can be viewed as a Jupyter notebook via .

An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

Decaying barotropic QG beta-plane turbulence

An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CairoMakie, Printf, Random
 
 using Statistics: mean

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

      n = 128            # 2D resolution: n² grid points
 stepper = "FilteredRK4"  # timestepper
      dt = 0.04           # timestep
  nsteps = 2000           # total number of time-steps
- nsubs  = 20             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

Physical parameters

L = 2π        # domain size
+ nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

Physical parameters

L = 2π        # domain size
 β = 10.0      # planetary PV gradient
 μ = 0.0       # bottom drag

Problem setup

We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

and define some shortcuts

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
 x, y = grid.x, grid.y

Setting initial conditions

Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

E₀ = 0.08 # energy of initial condition
@@ -43,7 +43,7 @@
 
 contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
 
-fig

Diagnostics

Create Diagnostics – energy and enstrophy functions are imported at the top.

E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
+fig

Diagnostics

Create Diagnostics – energy and enstrophy functions are imported at the top.

E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
 Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
 diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

Output

We choose folder for outputing .jld2 files and snapshots (.png files).

filepath = "."
 plotpath = "./plots_decayingbetaturb"
@@ -99,11 +99,11 @@
 lines!(axū, ūₘ, y; linewidth = 3)
 lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
 
-fig

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
+fig

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
 
 frames = 0:round(Int, nsteps / nsubs)
 
-record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 8) do j
+record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 12) do j
   if j % round(Int, nsteps/nsubs / 4) == 0
     cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
 
@@ -122,9 +122,10 @@
 
   stepforward!(prob, diags, nsubs)
   SingleLayerQG.updatevars!(prob)
-end
step: 0000, t: 0, cfl: 0.86, E: 0.0800, Q: 5.0860, walltime: 0.00 min
-step: 0500, t: 20, cfl: 0.87, E: 0.0786, Q: 1.8862, walltime: 0.10 min
-step: 1000, t: 40, cfl: 0.71, E: 0.0784, Q: 1.2623, walltime: 0.19 min
-step: 1500, t: 60, cfl: 0.87, E: 0.0783, Q: 1.1067, walltime: 0.27 min
-step: 2000, t: 80, cfl: 0.85, E: 0.0783, Q: 1.0400, walltime: 0.36 min

Save

Finally, we can save, e.g., the last snapshot via

savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
-savefig(savename)

This page was generated using Literate.jl.

+end
step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min
+step: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.16 min
+step: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.28 min
+step: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.40 min
+step: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.52 min
+

Save

Finally, we can save, e.g., the last snapshot via

savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
+savefig(savename)

This page was generated using Literate.jl.

diff --git a/dev/literated/singlelayerqg_betaforced-23.png b/dev/literated/singlelayerqg_betaforced-23.png new file mode 100644 index 00000000..46f9c19c Binary files /dev/null and b/dev/literated/singlelayerqg_betaforced-23.png differ diff --git a/dev/literated/singlelayerqg_betaforced-48.png b/dev/literated/singlelayerqg_betaforced-48.png new file mode 100644 index 00000000..83303a8a Binary files /dev/null and b/dev/literated/singlelayerqg_betaforced-48.png differ diff --git a/dev/literated/singlelayerqg_betaforced.mp4 b/dev/literated/singlelayerqg_betaforced.mp4 index 48e12083..e4810073 100644 Binary files a/dev/literated/singlelayerqg_betaforced.mp4 and b/dev/literated/singlelayerqg_betaforced.mp4 differ diff --git a/dev/literated/singlelayerqg_betaforced/index.html b/dev/literated/singlelayerqg_betaforced/index.html index c16a42fb..bce73143 100644 --- a/dev/literated/singlelayerqg_betaforced/index.html +++ b/dev/literated/singlelayerqg_betaforced/index.html @@ -1,16 +1,17 @@ -Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

Forced-dissipative barotropic QG beta-plane turbulence

This example can be viewed as a Jupyter notebook via .

A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

Forced-dissipative barotropic QG beta-plane turbulence

A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
 
 using Statistics: mean
 using LinearAlgebra: ldiv!
 
 parsevalsum = FourierFlows.parsevalsum
-record = CairoMakie.record
record (generic function with 2 methods)

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

      n = 128            # 2D resolution: n² grid points
+record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

      n = 128            # 2D resolution: n² grid points
 stepper = "FilteredRK4"  # timestepper
      dt = 0.05           # timestep
- nsteps = 8000           # total number of timesteps
- save_substeps = 10      # number of timesteps after which output is saved

Physical parameters

L = 2π        # domain size
+ nsteps = 8000          # total number of timesteps
+ save_substeps = 10      # number of timesteps after which output is saved
+

Physical parameters

L = 2π        # domain size
 β = 10.0      # planetary PV gradient
 μ = 0.01      # bottom drag

Forcing

We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
 forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
@@ -24,11 +25,9 @@
 @CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
 
 ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
-@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

random_uniform = dev==CPU() ? rand : CUDA.rand
-
-function calcF!(Fh, sol, t, clock, vars, params, grid)
-  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
-
+@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

function calcF!(Fh, sol, t, clock, vars, params, grid)
+  randn!(Fh)
+  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
   return nothing
 end

Problem setup

We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
                              calcF=calcF!, stochastic=true)

Let's define some shortcuts.

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
@@ -47,7 +46,7 @@
 heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
          colormap = :balance, colorrange = (-8, 8))
 
-fig

Setting initial conditions

Our initial condition is simply fluid at rest.

SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostic – energy and enstrophy are functions imported at the top.

E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
+fig

Setting initial conditions

Our initial condition is simply fluid at rest.

SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostic – energy and enstrophy are functions imported at the top.

E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
 Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
 diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

Output

We choose folder for outputing .jld2 files and snapshots (.png files).

filepath = "."
 plotpath = "./plots_forcedbetaturb"
@@ -88,23 +87,24 @@
 end
 
 savediagnostic(E, "energy", output.path)
-savediagnostic(Z, "enstrophy", output.path)
step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
-step: 0500, t: 25, cfl: 0.55, E: 0.0188, Q: 2.6813, walltime: 0.02 min
-step: 1000, t: 50, cfl: 0.62, E: 0.0301, Q: 2.6856, walltime: 0.05 min
-step: 1500, t: 75, cfl: 0.74, E: 0.0360, Q: 2.5495, walltime: 0.07 min
-step: 2000, t: 100, cfl: 0.62, E: 0.0390, Q: 2.4782, walltime: 0.09 min
-step: 2500, t: 125, cfl: 0.70, E: 0.0421, Q: 2.6692, walltime: 0.12 min
-step: 3000, t: 150, cfl: 0.81, E: 0.0442, Q: 2.6919, walltime: 0.14 min
-step: 3500, t: 175, cfl: 0.77, E: 0.0456, Q: 2.6213, walltime: 0.17 min
-step: 4000, t: 200, cfl: 0.76, E: 0.0458, Q: 2.6167, walltime: 0.19 min
-step: 4500, t: 225, cfl: 0.74, E: 0.0459, Q: 2.6116, walltime: 0.22 min
-step: 5000, t: 250, cfl: 0.80, E: 0.0464, Q: 2.6694, walltime: 0.25 min
-step: 5500, t: 275, cfl: 0.80, E: 0.0473, Q: 2.6463, walltime: 0.27 min
-step: 6000, t: 300, cfl: 0.83, E: 0.0471, Q: 2.5833, walltime: 0.30 min
-step: 6500, t: 325, cfl: 0.81, E: 0.0464, Q: 2.4590, walltime: 0.32 min
-step: 7000, t: 350, cfl: 0.85, E: 0.0468, Q: 2.5589, walltime: 0.35 min
-step: 7500, t: 375, cfl: 0.84, E: 0.0465, Q: 2.4946, walltime: 0.37 min
-step: 8000, t: 400, cfl: 0.76, E: 0.0466, Q: 2.5481, walltime: 0.40 min

Load saved output and visualize

We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

file = jldopen(output.path)
+savediagnostic(Z, "enstrophy", output.path)
step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
+step: 0500, t: 25, cfl: 0.55, E: 0.0182, Q: 2.6371, walltime: 0.04 min
+step: 1000, t: 50, cfl: 0.61, E: 0.0293, Q: 2.8787, walltime: 0.06 min
+step: 1500, t: 75, cfl: 0.67, E: 0.0364, Q: 2.8105, walltime: 0.08 min
+step: 2000, t: 100, cfl: 0.87, E: 0.0403, Q: 2.6290, walltime: 0.10 min
+step: 2500, t: 125, cfl: 0.83, E: 0.0433, Q: 2.7528, walltime: 0.12 min
+step: 3000, t: 150, cfl: 0.91, E: 0.0446, Q: 2.6793, walltime: 0.13 min
+step: 3500, t: 175, cfl: 0.77, E: 0.0455, Q: 2.6078, walltime: 0.15 min
+step: 4000, t: 200, cfl: 0.71, E: 0.0455, Q: 2.6548, walltime: 0.17 min
+step: 4500, t: 225, cfl: 0.78, E: 0.0458, Q: 2.6460, walltime: 0.19 min
+step: 5000, t: 250, cfl: 0.89, E: 0.0473, Q: 2.7878, walltime: 0.21 min
+step: 5500, t: 275, cfl: 0.90, E: 0.0480, Q: 2.7345, walltime: 0.23 min
+step: 6000, t: 300, cfl: 0.87, E: 0.0482, Q: 2.8067, walltime: 0.24 min
+step: 6500, t: 325, cfl: 0.74, E: 0.0478, Q: 2.7029, walltime: 0.26 min
+step: 7000, t: 350, cfl: 0.86, E: 0.0461, Q: 2.5248, walltime: 0.28 min
+step: 7500, t: 375, cfl: 0.78, E: 0.0465, Q: 2.6692, walltime: 0.30 min
+step: 8000, t: 400, cfl: 0.74, E: 0.0456, Q: 2.5986, walltime: 0.32 min
+

Load saved output and visualize

We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

file = jldopen(output.path)
 
 iterations = parse.(Int, keys(file["snapshots/t"]))
 t = [file["snapshots/t/$i"] for i ∈ iterations]
@@ -112,8 +112,8 @@
 qh = [file["snapshots/qh/$i"] for i ∈ iterations]
 u  = [file["snapshots/u/$i"] for i ∈ iterations]
 
-E_t  = file["diagnostics/energy/t"]
-Z_t  = file["diagnostics/enstrophy/t"]
+E_t = file["diagnostics/energy/t"]
+Z_t = file["diagnostics/enstrophy/t"]
 E_data = file["diagnostics/energy/data"]
 Z_data = file["diagnostics/enstrophy/data"]
 
@@ -121,16 +121,16 @@
 nx, ny = file["grid/nx"], file["grid/ny"]
 Lx, Ly = file["grid/Lx"], file["grid/Ly"]
 
-close(file)

We create a figure using Makie's Observables

j = Observable(1)
+close(file)

We create a figure using Makie's Observables

n = Observable(1)
 
-q = @lift irfft(qh[$j], nx)
-ψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)
-q̄ = @lift real(ifft(qh[$j][1, :] / ny))
-ū = @lift vec(mean(u[$j], dims=1))
+qₙ = @lift irfft(qh[$n], nx)
+ψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)
+q̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))
+ūₙ = @lift vec(mean(u[$n], dims=1))
 
-title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$j])
+title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$n])
 
-energy = Observable([Point2f(E_t[1], E_data[1])])
+energy    = Observable([Point2f(E_t[1], E_data[1])])
 enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
 
 fig = Figure(resolution=(1000, 600))
@@ -168,29 +168,29 @@
            aspect = 1,
            limits = ((-0.1, 4.1), (0, 3.1)))
 
-heatmap!(axq, x, y, q;
+heatmap!(axq, x, y, qₙ;
          colormap = :balance, colorrange = (-8, 8))
 
 levels = collect(-0.32:0.04:0.32)
 
-contourf!(axψ, x, y, ψ;
+contourf!(axψ, x, y, ψₙ;
           levels, colormap = :viridis, colorrange = (-0.22, 0.22))
-contour!(axψ, x, y, ψ;
+contour!(axψ, x, y, ψₙ;
          levels, color = :black)
 
-lines!(axq̄, q̄, y; linewidth = 3)
+lines!(axq̄, q̄ₙ, y; linewidth = 3)
 lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
 
-lines!(axū, ū, y; linewidth = 3)
+lines!(axū, ūₙ, y; linewidth = 3)
 lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
 
 lines!(axE, energy; linewidth = 3)
 lines!(axZ, enstrophy; linewidth = 3, color = :red)
 
-fig

We are now ready to animate all saved output.

frames = 1:length(t)
-record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 18) do i
-  j[] = i
+fig

We are now ready to animate all saved output.

frames = 1:length(t)
+record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 16) do i
+  n[] = i
 
-  energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))
+  energy[]    = push!(energy[],    Point2f(μ * E_t[i], E_data[i]))
   enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
-end


This page was generated using Literate.jl.

+end


This page was generated using Literate.jl.

diff --git a/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png b/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png new file mode 100644 index 00000000..bc7e32cb Binary files /dev/null and b/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png differ diff --git a/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html index 688ea268..a0480398 100644 --- a/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html +++ b/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -1,5 +1,5 @@ -SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

This example can be viewed as a Jupyter notebook via .

We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, Printf, Random, CairoMakie
 
 using GeophysicalFlows: peakedisotropicspectrum
@@ -55,7 +55,7 @@
 heatmap!(ax2, x, y, ζ_eqbqg;
          colormap = :balance, colorrange = (-40, 40))
 
-fig

Time-stepping the Problem forward

Now we time-step both problems forward and animate the relative vorticity in each case.

startwalltime = time()
+fig

Time-stepping the Problem forward

Now we time-step both problems forward and animate the relative vorticity in each case.

startwalltime = time()
 
 cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
 
@@ -80,13 +80,14 @@
   t_eqbqg[] = prob_eqbqg.clock.t
   ζ_bqg[] = relativevorticity(prob_bqg)
   ζ_eqbqg[] = relativevorticity(prob_eqbqg)
-end
barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min
-equivalent barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min
-barotropic; step: 1000, t: 10, cfl: 0.65, walltime: 0.08 min
-equivalent barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.08 min
-barotropic; step: 2000, t: 20, cfl: 0.52, walltime: 0.16 min
-equivalent barotropic; step: 2000, t: 20, cfl: 0.35, walltime: 0.16 min
-barotropic; step: 3000, t: 30, cfl: 0.48, walltime: 0.24 min
-equivalent barotropic; step: 3000, t: 30, cfl: 0.32, walltime: 0.24 min
-barotropic; step: 4000, t: 40, cfl: 0.49, walltime: 0.32 min
-equivalent barotropic; step: 4000, t: 40, cfl: 0.34, walltime: 0.32 min


This page was generated using Literate.jl.

+end
barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
+equivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
+barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.08 min
+equivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.08 min
+barotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.16 min
+equivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.16 min
+barotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.22 min
+equivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.22 min
+barotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.29 min
+equivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.29 min
+


This page was generated using Literate.jl.

diff --git a/dev/literated/singlelayerqg_decaying_topography-19.png b/dev/literated/singlelayerqg_decaying_topography-19.png new file mode 100644 index 00000000..b0a7e4a1 Binary files /dev/null and b/dev/literated/singlelayerqg_decaying_topography-19.png differ diff --git a/dev/literated/singlelayerqg_decaying_topography-24.png b/dev/literated/singlelayerqg_decaying_topography-24.png new file mode 100644 index 00000000..a07aa345 Binary files /dev/null and b/dev/literated/singlelayerqg_decaying_topography-24.png differ diff --git a/dev/literated/singlelayerqg_decaying_topography.mp4 b/dev/literated/singlelayerqg_decaying_topography.mp4 index 62fcc621..a0e9be10 100644 Binary files a/dev/literated/singlelayerqg_decaying_topography.mp4 and b/dev/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/dev/literated/singlelayerqg_decaying_topography/index.html b/dev/literated/singlelayerqg_decaying_topography/index.html index c7c4b638..ce650824 100644 --- a/dev/literated/singlelayerqg_decaying_topography/index.html +++ b/dev/literated/singlelayerqg_decaying_topography/index.html @@ -1,5 +1,5 @@ -Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

Decaying barotropic QG turbulence over topography

This example can be viewed as a Jupyter notebook via .

An example of decaying barotropic quasi-geostrophic turbulence over topography.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

Decaying barotropic QG turbulence over topography

An example of decaying barotropic quasi-geostrophic turbulence over topography.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CairoMakie, Printf, Random
 
 using Statistics: mean

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical parameters and time-stepping parameters

      n = 128            # 2D resolution = n²
@@ -22,7 +22,7 @@
 contourf!(ax, x, y, η;
           levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
 
-fig

Setting initial conditions

Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

E₀ = 0.04 # energy of initial condition
+fig

Setting initial conditions

Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

E₀ = 0.04 # energy of initial condition
 
 K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
 
@@ -50,21 +50,21 @@
 axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
 
 hm = heatmap!(axq, x, y, q;
-         colormap = :balance, colorrange = (-8, 8))
+              colormap = :balance, colorrange = (-8, 8))
 
 Colorbar(fig[1, 2], hm)
 
 levels = collect(range(-0.28, stop=0.28, length=11))
 
 hc = contourf!(axψ, x, y, ψ;
-          levels, colormap = :viridis, colorrange = (-0.28, 0.28),
-          extendlow = :auto, extendhigh = :auto)
+               levels, colormap = :viridis, colorrange = (-0.28, 0.28),
+               extendlow = :auto, extendhigh = :auto)
 contour!(axψ, x, y, ψ;
          levels, color = :black)
 
 Colorbar(fig[1, 4], hc)
 
-fig

Diagnostics

Create Diagnostics – energy and enstrophy functions are imported at the top.

E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
+fig

Diagnostics

Create Diagnostics – energy and enstrophy functions are imported at the top.

E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
 Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
 diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

Output

We choose folder for outputing .jld2 files.

filepath = "."
 filename = joinpath(filepath, "decayingbetaturb.jld2")

Do some basic file management,

if isfile(filename); rm(filename); end

and then create Output.

get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
@@ -75,7 +75,8 @@
          levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
 
 title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
-title_ψ[] = "streamfunction ψ"

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
+title_ψ[] = "streamfunction ψ"
+

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
 
 record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
   if j % (1000 / nsubs) == 0
@@ -95,6 +96,7 @@
 
   stepforward!(prob, diags, nsubs)
   SingleLayerQG.updatevars!(prob)
-end
step: 0000, t: 0, cfl: 0.81, E: 0.0394, Q: 3.1940, walltime: 0.00 min
-step: 1000, t: 50, cfl: 0.62, E: 0.0382, Q: 0.5561, walltime: 0.29 min
-step: 2000, t: 100, cfl: 0.85, E: 0.0381, Q: 0.2791, walltime: 0.55 min


This page was generated using Literate.jl.

+end
step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min
+step: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.24 min
+step: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.46 min
+


This page was generated using Literate.jl.

diff --git a/dev/literated/sqg_ellipticalvortex.mp4 b/dev/literated/sqg_ellipticalvortex.mp4 index bb579b14..8e168d95 100644 Binary files a/dev/literated/sqg_ellipticalvortex.mp4 and b/dev/literated/sqg_ellipticalvortex.mp4 differ diff --git a/dev/literated/surfaceqg_decaying-19.png b/dev/literated/surfaceqg_decaying-19.png new file mode 100644 index 00000000..3ba5674a Binary files /dev/null and b/dev/literated/surfaceqg_decaying-19.png differ diff --git a/dev/literated/surfaceqg_decaying-34.png b/dev/literated/surfaceqg_decaying-34.png new file mode 100644 index 00000000..861be2c3 Binary files /dev/null and b/dev/literated/surfaceqg_decaying-34.png differ diff --git a/dev/literated/surfaceqg_decaying-39.png b/dev/literated/surfaceqg_decaying-39.png new file mode 100644 index 00000000..b16b665b Binary files /dev/null and b/dev/literated/surfaceqg_decaying-39.png differ diff --git a/dev/literated/surfaceqg_decaying/index.html b/dev/literated/surfaceqg_decaying/index.html index 6854d3d3..061b7d58 100644 --- a/dev/literated/surfaceqg_decaying/index.html +++ b/dev/literated/surfaceqg_decaying/index.html @@ -1,5 +1,5 @@ -Decaying Surface QG turbulence · GeophysicalFlows.jl

Decaying Surface QG turbulence

This example can be run online via . Also, it can be viewed as a Jupyter notebook via .

A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.

An example of decaying barotropic quasi-geostrophic turbulence over topography.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+Decaying Surface QG turbulence · GeophysicalFlows.jl

Decaying Surface QG turbulence

A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).

An example of decaying barotropic quasi-geostrophic turbulence over topography.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CairoMakie, Printf, Random
 
 using Statistics: mean
@@ -29,10 +29,10 @@
 
 Colorbar(fig[1, 2], hm)
 
-fig

Diagnostics

Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
+fig

Diagnostics

Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
 KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
 Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
-diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

Output

We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

base_filename = string("SurfaceQG_decaying_n_", n)
"SurfaceQG_decaying_n_256"

We choose folder for outputing .jld2 files and snapshots (.png files).

datapath = "./"
+diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

Output

We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

base_filename = string("SurfaceQG_decaying_n_", n)
"SurfaceQG_decaying_n_256"

We choose folder for outputing .jld2 files and snapshots (.png files).

datapath = "./"
 plotpath = "./"
 
 dataname = joinpath(datapath, base_filename)
@@ -68,7 +68,7 @@
 
 Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
 
-fig

Time-stepping the Problem forward and create animation by updating the plot.

startwalltime = time()
+fig

Time-stepping the Problem forward and create animation by updating the plot.

startwalltime = time()
 
 record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
   if j % (500 / nsubs) == 0
@@ -94,16 +94,17 @@
 
   stepforward!(prob, diags, nsubs)
   SurfaceQG.updatevars!(prob)
-end
step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
+end
step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
 buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
-step: 0500, t: 15.0, cfl: 0.588, walltime: 0.08 min
-buoyancy variance: 1.83e-02, buoyancy variance dissipation: 3.97e-11
-step: 1000, t: 30.0, cfl: 0.571, walltime: 0.16 min
-buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.08e-09
-step: 1500, t: 45.0, cfl: 0.575, walltime: 0.23 min
-buoyancy variance: 1.83e-02, buoyancy variance dissipation: 8.29e-09
-step: 2000, t: 60.0, cfl: 0.577, walltime: 0.31 min
-buoyancy variance: 1.82e-02, buoyancy variance dissipation: 9.89e-09

Let's see how all flow fields look like at the end of the simulation.

fig = Figure(resolution = (800, 380))
+step: 0500, t: 15.0, cfl: 0.588, walltime: 0.07 min
+buoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11
+step: 1000, t: 30.0, cfl: 0.571, walltime: 0.12 min
+buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09
+step: 1500, t: 45.0, cfl: 0.577, walltime: 0.17 min
+buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08
+step: 2000, t: 60.0, cfl: 0.574, walltime: 0.22 min
+buoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08
+

Let's see how all flow fields look like at the end of the simulation.

fig = Figure(resolution = (800, 380))
 
 axis_kwargs = (xlabel = "x",
                ylabel = "y",
@@ -115,18 +116,18 @@
 axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
 
 hb = heatmap!(axb, x, y, Array(vars.b);
-             colormap = :deep, colorrange = (0, 1))
+              colormap = :deep, colorrange = (0, 1))
 
 Colorbar(fig[2, 1], hb, vertical = false)
 
 hu = heatmap!(axu, x, y, Array(vars.u);
-             colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
+              colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
 
 Colorbar(fig[2, 2], hu, vertical = false)
 
 hv = heatmap!(axv, x, y, Array(vars.v);
-             colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
+              colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
 
 Colorbar(fig[2, 3], hv, vertical = false)
 
-fig

Save

We can save the output at the end of the simulation by calling

saveoutput(out)

This page was generated using Literate.jl.

+fig

Save

We can save the output at the end of the simulation by calling

saveoutput(out)

This page was generated using Literate.jl.

diff --git a/dev/literated/twodnavierstokes_decaying-20.png b/dev/literated/twodnavierstokes_decaying-20.png new file mode 100644 index 00000000..ce91dd5b Binary files /dev/null and b/dev/literated/twodnavierstokes_decaying-20.png differ diff --git a/dev/literated/twodnavierstokes_decaying-33.png b/dev/literated/twodnavierstokes_decaying-33.png new file mode 100644 index 00000000..acb4feb3 Binary files /dev/null and b/dev/literated/twodnavierstokes_decaying-33.png differ diff --git a/dev/literated/twodnavierstokes_decaying-42.png b/dev/literated/twodnavierstokes_decaying-42.png new file mode 100644 index 00000000..0da1a370 Binary files /dev/null and b/dev/literated/twodnavierstokes_decaying-42.png differ diff --git a/dev/literated/twodnavierstokes_decaying/index.html b/dev/literated/twodnavierstokes_decaying/index.html index 342078b9..c52f0f74 100644 --- a/dev/literated/twodnavierstokes_decaying/index.html +++ b/dev/literated/twodnavierstokes_decaying/index.html @@ -1,5 +1,5 @@ -2D decaying turbulence · GeophysicalFlows.jl

2D decaying turbulence

This example can be viewed as a Jupyter notebook via .

A simulation of decaying two-dimensional turbulence.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+2D decaying turbulence · GeophysicalFlows.jl

2D decaying turbulence

A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, Printf, Random, CairoMakie
 
 using Random: seed!
@@ -7,7 +7,7 @@
 nsteps = 4000  # total number of steps
  nsubs = 20    # number of steps between each plot

Problem setup

We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

Next we define some shortcuts for convenience.

sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
 x,  y  = grid.x,  grid.y
-Lx, Ly = grid.Lx, grid.Ly

Setting initial conditions

Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).

seed!(1234)
+Lx, Ly = grid.Lx, grid.Ly

Setting initial conditions

Our initial condition tries to reproduce the initial condition used by McWilliams (1984).

seed!(1234)
 k₀, E₀ = 6, 0.5
 ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
 TwoDNavierStokes.set_ζ!(prob, ζ₀)

Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

fig = Figure()
@@ -21,7 +21,7 @@
 heatmap!(ax, x, y, Array(vars.ζ');
          colormap = :balance, colorrange = (-40, 40))
 
-fig

Diagnostics

Create Diagnostics – energy and enstrophy functions are imported at the top.

E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
+fig

Diagnostics

Create Diagnostics – energy and enstrophy functions are imported at the top.

E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
 Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
 diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

Output

We choose folder for outputing .jld2 files and snapshots (.png files).

filepath = "."
 plotpath = "./plots_decayingTwoDNavierStokes"
@@ -57,7 +57,7 @@
 hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
 Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
 
-fig

Time-stepping the Problem forward

We time-step the Problem forward in time.

startwalltime = time()
+fig

Time-stepping the Problem forward

We time-step the Problem forward in time.

startwalltime = time()
 
 record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
   if j % (1000 / nsubs) == 0
@@ -78,11 +78,12 @@
 
   stepforward!(prob, diags, nsubs)
   TwoDNavierStokes.updatevars!(prob)
-end
step: 0000, t: 0, cfl: 0.47, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.00 min
-step: 1000, t: 10, cfl: 0.38, ΔE: 0.9687, ΔZ: 0.1880, walltime: 0.05 min
-step: 2000, t: 20, cfl: 0.34, ΔE: 0.9655, ΔZ: 0.1084, walltime: 0.09 min
-step: 3000, t: 30, cfl: 0.51, ΔE: 0.9645, ΔZ: 0.0831, walltime: 0.14 min
-step: 4000, t: 40, cfl: 0.46, ΔE: 0.9642, ΔZ: 0.0734, walltime: 0.18 min

Radial energy spectrum

After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
+end
step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min
+step: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.10 min
+step: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.14 min
+step: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.18 min
+step: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.22 min
+

Radial energy spectrum

After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
 Eh = rfft(E)                         # Fourier transform of energy density
 
 # compute radial specturm of `Eh`
@@ -93,4 +94,4 @@
               xscale = log10,
               yscale = log10,
               title = "Radial energy spectrum",
-              limits = ((0.3, 1e2), (1e0, 1e5))))

This page was generated using Literate.jl.

+ limits = ((0.3, 1e2), (1e0, 1e5))))


This page was generated using Literate.jl.

diff --git a/dev/literated/twodnavierstokes_stochasticforcing-23.png b/dev/literated/twodnavierstokes_stochasticforcing-23.png new file mode 100644 index 00000000..340422ac Binary files /dev/null and b/dev/literated/twodnavierstokes_stochasticforcing-23.png differ diff --git a/dev/literated/twodnavierstokes_stochasticforcing-32.png b/dev/literated/twodnavierstokes_stochasticforcing-32.png new file mode 100644 index 00000000..95e1529d Binary files /dev/null and b/dev/literated/twodnavierstokes_stochasticforcing-32.png differ diff --git a/dev/literated/twodnavierstokes_stochasticforcing/index.html b/dev/literated/twodnavierstokes_stochasticforcing/index.html index 62509927..22cd47cb 100644 --- a/dev/literated/twodnavierstokes_stochasticforcing/index.html +++ b/dev/literated/twodnavierstokes_stochasticforcing/index.html @@ -1,9 +1,9 @@ -2D forced-dissipative turbulence · GeophysicalFlows.jl

2D forced-dissipative turbulence

This example can be viewed as a Jupyter notebook via .

A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+2D forced-dissipative turbulence · GeophysicalFlows.jl

2D forced-dissipative turbulence

A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CUDA, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
 
 parsevalsum = FourierFlows.parsevalsum
-record = CairoMakie.record
record (generic function with 2 methods)

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical, domain, and simulation parameters

First, we pick some numerical and physical parameters for our model.

 n, L  = 256, 2π             # grid resolution and domain length
+record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical, domain, and simulation parameters

First, we pick some numerical and physical parameters for our model.

 n, L  = 256, 2π             # grid resolution and domain length
  ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
  μ, nμ = 1e-1, 0             # linear drag coefficient
     dt = 0.005               # timestep
@@ -20,11 +20,9 @@
 @CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
 
 ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
-@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

random_uniform = dev==CPU() ? rand : CUDA.rand
-
-function calcF!(Fh, sol, t, clock, vars, params, grid)
-  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
-
+@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

function calcF!(Fh, sol, t, clock, vars, params, grid)
+  randn!(Fh)
+  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
   return nothing
 end

Problem setup

We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
                                 calcF=calcF!, stochastic=true)

Define some shortcuts for convenience.

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
@@ -43,7 +41,7 @@
 heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
          colormap = :balance, colorrange = (-200, 200))
 
-fig

Setting initial conditions

Our initial condition is a fluid at rest.

TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostics; the diagnostics are aimed to probe the energy budget.

E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
+fig

Setting initial conditions

Our initial condition is a fluid at rest.

TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostics; the diagnostics are aimed to probe the energy budget.

E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
 Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
 diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

Visualizing the simulation

We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

ζ = Observable(Array(vars.ζ))
 title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
@@ -69,9 +67,9 @@
 
 hE = lines!(ax2, energy; linewidth = 3)
 hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
-Legend(fig[1, 3], [hE, hZ], ["energy E(t)" "enstrophy Z(t) / k_f²"])
+Legend(fig[1, 3], [hE, hZ], ["energy E(t)", "enstrophy Z(t) / k_f²"])
 
-fig

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
+fig

Time-stepping the Problem forward

We step the Problem forward in time.

startwalltime = time()
 
 record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
   if j % (1000/nsubs) == 0
@@ -91,8 +89,9 @@
 
   stepforward!(prob, diags, nsubs)
   TwoDNavierStokes.updatevars!(prob)
-end
step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
-step: 1000, t: 5, cfl: 0.41, E: 0.2963, Z: 36.2331, walltime: 0.16 min
-step: 2000, t: 10, cfl: 0.51, E: 0.4157, Z: 38.0039, walltime: 0.33 min
-step: 3000, t: 15, cfl: 0.57, E: 0.4570, Z: 37.1752, walltime: 0.49 min
-step: 4000, t: 20, cfl: 0.51, E: 0.4460, Z: 34.7938, walltime: 0.65 min


This page was generated using Literate.jl.

+end
step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
+step: 1000, t: 5, cfl: 0.43, E: 0.2881, Z: 34.9014, walltime: 0.15 min
+step: 2000, t: 10, cfl: 0.53, E: 0.3803, Z: 33.7438, walltime: 0.24 min
+step: 3000, t: 15, cfl: 0.48, E: 0.4326, Z: 36.7366, walltime: 0.34 min
+step: 4000, t: 20, cfl: 0.53, E: 0.4520, Z: 34.9454, walltime: 0.44 min
+


This page was generated using Literate.jl.

diff --git a/dev/literated/twodnavierstokes_stochasticforcing_budgets-22.png b/dev/literated/twodnavierstokes_stochasticforcing_budgets-22.png new file mode 100644 index 00000000..340422ac Binary files /dev/null and b/dev/literated/twodnavierstokes_stochasticforcing_budgets-22.png differ diff --git a/dev/literated/twodnavierstokes_stochasticforcing_budgets-33.png b/dev/literated/twodnavierstokes_stochasticforcing_budgets-33.png new file mode 100644 index 00000000..0fd45594 Binary files /dev/null and b/dev/literated/twodnavierstokes_stochasticforcing_budgets-33.png differ diff --git a/dev/literated/twodnavierstokes_stochasticforcing_budgets-35.png b/dev/literated/twodnavierstokes_stochasticforcing_budgets-35.png new file mode 100644 index 00000000..3686719c Binary files /dev/null and b/dev/literated/twodnavierstokes_stochasticforcing_budgets-35.png differ diff --git a/dev/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/dev/literated/twodnavierstokes_stochasticforcing_budgets/index.html index 854e4b1c..77089547 100644 --- a/dev/literated/twodnavierstokes_stochasticforcing_budgets/index.html +++ b/dev/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -1,9 +1,9 @@ -2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

2D forced-dissipative turbulence budgets

This example can viewed as a Jupyter notebook via .

A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
+2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

2D forced-dissipative turbulence budgets

A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

Install dependencies

First let's make sure we have all required packages installed.

using Pkg
 pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

Let's begin

Let's load GeophysicalFlows.jl and some other packages we need.

using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
 
 parsevalsum = FourierFlows.parsevalsum
-record = CairoMakie.record
record (generic function with 2 methods)

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical, domain, and simulation parameters

First, we pick some numerical and physical parameters for our model.

 n, L  = 256, 2π              # grid resolution and domain length
+record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

Choosing a device: CPU or GPU

dev = CPU()     # Device (CPU/GPU)

Numerical, domain, and simulation parameters

First, we pick some numerical and physical parameters for our model.

 n, L  = 256, 2π              # grid resolution and domain length
  ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
  μ, nμ = 1e-1, 0              # linear drag coefficient
 dt, tf = 0.005, 0.2 / μ       # timestep and final time
@@ -20,11 +20,9 @@
 @CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
 
 ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
-@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

random_uniform = dev==CPU() ? rand : CUDA.rand
-
-function calcF!(Fh, sol, t, clock, vars, params, grid)
-  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
-
+@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

We reset of the random number generator for reproducibility

if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

function calcF!(Fh, sol, t, clock, vars, params, grid)
+  randn!(Fh)
+  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
   return nothing
 end

Problem setup

We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
                                 calcF=calcF!, stochastic=true)

Define some shortcuts for convenience.

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
@@ -44,7 +42,7 @@
 heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
          colormap = :balance, colorrange = (-200, 200))
 
-fig

Setting initial conditions

Our initial condition is a fluid at rest.

TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
+fig

Setting initial conditions

Our initial condition is a fluid at rest.

TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

Diagnostics

Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
 Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
 Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
 Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
@@ -64,10 +62,11 @@
         cfl, (time()-startwalltime)/60)
 
   println(log)
-end
step: 0100, t: 0.5, cfl: 0.158, walltime: 0.02 min
-step: 0200, t: 1.0, cfl: 0.245, walltime: 0.04 min
-step: 0300, t: 1.5, cfl: 0.283, walltime: 0.05 min
-step: 0400, t: 2.0, cfl: 0.284, walltime: 0.07 min

Plot

Now let's see the final snapshot of the vorticity.

fig = Figure(resolution = (400, 400))
+end
step: 0100, t: 0.5, cfl: 0.172, walltime: 0.01 min
+step: 0200, t: 1.0, cfl: 0.214, walltime: 0.03 min
+step: 0300, t: 1.5, cfl: 0.269, walltime: 0.04 min
+step: 0400, t: 2.0, cfl: 0.355, walltime: 0.05 min
+

Plot

Now let's see the final snapshot of the vorticity.

fig = Figure(resolution = (400, 400))
 
 ax = Axis(fig[1, 1];
           xlabel = "x",
@@ -79,7 +78,7 @@
 heatmap!(ax, x, y, Array(vars.ζ);
          colormap = :viridis, colorrange = (-25, 25))
 
-fig

And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
+fig

And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
 
 TwoDNavierStokes.updatevars!(prob)
 
@@ -119,14 +118,14 @@
 
 Legend(fig[2, 1],
        [hWᵋ, hε, hDᵋ, hRᵋ],
-       ["energy work, Wᵋ" "ensemble mean energy work, <Wᵋ>" "dissipation, Dᵋ" "drag, Rᵋ = - 2μE"])
+       ["energy work, Wᵋ", "ensemble mean energy work, <Wᵋ>", "dissipation, Dᵋ", "drag, Rᵋ = - 2μE"])
 
 hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
 hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
 
 Legend(fig[4, 1],
        [hc, hn],
-       ["computed Wᵋ-Dᵋ" "numerical dE/dt"])
+       ["computed Wᵋ-Dᵋ", "numerical dE/dt"])
 
 hr = lines!(ax3E, t, residual_E)
 
@@ -141,14 +140,14 @@
 
 Legend(fig[2, 2],
        [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
-       ["enstrophy work, Wᶻ" "ensemble mean enstophy work, <Wᶻ>" "dissipation, Dᶻ" "drag, Rᶻ = - 2μZ"])
+       ["enstrophy work, Wᶻ", "ensemble mean enstophy work, <Wᶻ>", "dissipation, Dᶻ", "drag, Rᶻ = - 2μZ"])
 
 hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
 hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
 
 Legend(fig[4, 2],
        [hcᶻ, hnᶻ],
-       ["computed Wᶻ-Dᶻ" "numerical dZ/dt"])
+       ["computed Wᶻ-Dᶻ", "numerical dZ/dt"])
 
 hrᶻ = lines!(ax3Z, t, residual_Z)
 
@@ -156,4 +155,4 @@
        [hr],
        ["residual"])
 
-fig

This page was generated using Literate.jl.

+fig


This page was generated using Literate.jl.

diff --git a/dev/literated/twodturb.mp4 b/dev/literated/twodturb.mp4 index b842a363..50500cd5 100644 Binary files a/dev/literated/twodturb.mp4 and b/dev/literated/twodturb.mp4 differ diff --git a/dev/literated/twodturb_forced.mp4 b/dev/literated/twodturb_forced.mp4 index 333f8636..99256000 100644 Binary files a/dev/literated/twodturb_forced.mp4 and b/dev/literated/twodturb_forced.mp4 differ diff --git a/dev/modules/barotropicqgql/index.html b/dev/modules/barotropicqgql/index.html index 29394abb..104717c3 100644 --- a/dev/modules/barotropicqgql/index.html +++ b/dev/modules/barotropicqgql/index.html @@ -1,12 +1,12 @@ -BarotropicQGQL · GeophysicalFlows.jl

BarotropicQGQL

Basic Equations

This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

\[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g.,

As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

\[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v +BarotropicQGQL · GeophysicalFlows.jl

BarotropicQGQL

Basic Equations

This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

\[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).

As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

\[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

\[\begin{aligned} \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . -\end{aligned}\]

where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

The state variable sol is the Fourier transform of vorticity, ζh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

The linear operator is constructed in Equation

GeophysicalFlows.BarotropicQGQL.EquationFunction
Equation(params, grid)

Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

Nonlinear term is computed via calcN! function.

source

and the nonlinear terms are computed via

GeophysicalFlows.BarotropicQGQL.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For decaying case (no forcing, $F = 0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

Helper functions

Diagnostics

The kinetic energy of the fluid is obtained via:

while the enstrophy via:

Other diagnostic include: dissipation, drag, and work.

Examples

  • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
+\end{aligned}\]

where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

The state variable sol is the Fourier transform of vorticity, ζh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

The linear operator is constructed in Equation

GeophysicalFlows.BarotropicQGQL.EquationFunction
Equation(params, grid)

Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

Nonlinear term is computed via calcN! function.

source

and the nonlinear terms are computed via

GeophysicalFlows.BarotropicQGQL.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Diagnostics

The kinetic energy of the fluid is obtained via:

while the enstrophy via:

Other diagnostic include: dissipation, drag, and work.

Examples

  • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
diff --git a/dev/modules/multilayerqg/index.html b/dev/modules/multilayerqg/index.html index f01d4551..07f08a9f 100644 --- a/dev/modules/multilayerqg/index.html +++ b/dev/modules/multilayerqg/index.html @@ -1,8 +1,10 @@ -MultiLayerQG · GeophysicalFlows.jl

MultiLayerQG

Basic Equations

This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

The QGPV in each layer is

\[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

\[q_1 = \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ -q_j = \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ -q_n = \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) .\]

with

\[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad -g'_{j+1/2} = g \frac{\rho_{j+1} - \rho_j}{\rho_{j+1}} .\]

In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

\[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +MultiLayerQG · GeophysicalFlows.jl

MultiLayerQG

Basic Equations

This module solves the layered Boussinesq quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

The QGPV in each layer is

\[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

\[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

with

\[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = b_j - b_{j+1} ,\]

where

\[b_{j} = - g \frac{\delta \rho_j}{\rho_0}\]

is the Boussinesq buoyancy in each layer, with $\rho = \rho_0 + \delta \rho$ the total density, $\rho_0$ a constant reference density, and $|\delta \rho| \ll \rho_0$ the perturbation density.

In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

\[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = \underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} \begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

where

\[\mathbb{F} \equiv \begin{pmatrix} -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ @@ -10,14 +12,16 @@ 0 & \ddots & \ddots & \ddots & \\ \vdots & & & & 0 \\ 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} -\end{pmatrix} .\]

Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

\[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

with

\[\partial_y Q_j \equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ -\partial_x Q_j \equiv \delta_{j, n} \partial_x \eta .\]

Implementation

Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

The equations of motion are time-stepped forward in Fourier space:

\[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} -+ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

The linear operator is constructed in Equation

GeophysicalFlows.MultiLayerQG.EquationFunction
Equation(params, grid)

Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

The nonlinear term is computed via function calcN!.

source
GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
hyperviscosity(params, grid)

Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

\[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

source

The nonlinear terms are computed via

GeophysicalFlows.MultiLayerQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

\[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} - + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

source

which in turn calls calcN_advection! and addforcing!.

Linearized MultiLayerQG dynamics

The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

Helper functions

GeophysicalFlows.MultiLayerQG.set_ψ!Function
set_ψ!(params, vars, grid, sol, ψ)
-set_ψ!(prob, ψ)

Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

source

Diagnostics

The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies():

GeophysicalFlows.MultiLayerQG.energiesFunction
energies(vars, params, grid, sol)
-energies(prob)

Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

The kinetic energy at the $j$-th fluid layer is

\[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

\[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

source

The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes():

GeophysicalFlows.MultiLayerQG.fluxesFunction
fluxes(vars, params, grid, sol)
-fluxes(prob)

Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

The lateral eddy fluxes within the $j$-th fluid layer are

\[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j -\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

\[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, -v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

source

Examples

+\end{pmatrix} .\]

Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

\[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

with

\[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

Implementation

Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

The equations of motion are time-stepped forward in Fourier space:

\[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

The linear operator is constructed in Equation

GeophysicalFlows.MultiLayerQG.EquationFunction
Equation(params, grid)

Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

The nonlinear term is computed via function calcN!.

source
GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
hyperviscosity(params, grid)

Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

\[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

source

The nonlinear terms are computed via

GeophysicalFlows.MultiLayerQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

\[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

source

which in turn calls calcN_advection! and addforcing!.

Linearized MultiLayerQG dynamics

The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

Helper functions

GeophysicalFlows.MultiLayerQG.set_ψ!Function
set_ψ!(params, vars, grid, sol, ψ)
+set_ψ!(prob, ψ)

Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

source

Diagnostics

The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

GeophysicalFlows.MultiLayerQG.energiesFunction
energies(vars, params, grid, sol)
+energies(prob)

Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

The kinetic energy at the $j$-th fluid layer is

\[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

\[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

source

The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

GeophysicalFlows.MultiLayerQG.fluxesFunction
fluxes(vars, params, grid, sol)
+fluxes(prob)

Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

The lateral eddy fluxes within the $j$-th fluid layer are

\[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

\[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

source

Examples

diff --git a/dev/modules/singlelayerqg/index.html b/dev/modules/singlelayerqg/index.html index 0eab02cb..43799fc5 100644 --- a/dev/modules/singlelayerqg/index.html +++ b/dev/modules/singlelayerqg/index.html @@ -1,6 +1,6 @@ -SingleLayerQG · GeophysicalFlows.jl

SingleLayerQG

Basic Equations

This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

\[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v +SingleLayerQG · GeophysicalFlows.jl

SingleLayerQG

Basic Equations

This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

\[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v - \partial_y u}_{\text{relative vorticity}} \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

The dynamical variable is $q$. Thus, the equation solved by the module is:

\[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = -\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

The linear operator is constructed in Equation

GeophysicalFlows.SingleLayerQG.EquationFunction
Equation(params::BarotropicQGParams, grid)

Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

The nonlinear term is computed via calcN! function.

source
Equation(params::EquivalentBarotropicQGParams, grid)

Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

The nonlinear term is computed via calcN! function.

source

The nonlinear terms are computed via

GeophysicalFlows.SingleLayerQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, q+η)} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

Helper functions

Some helper functions included in the module are:

Diagnostics

The kinetic energy of the fluid is computed via:

GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
kinetic_energy(prob)

Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

source

while the potential energy, for an equivalent barotropic fluid, is computed via:

GeophysicalFlows.SingleLayerQG.potential_energyFunction
potential_energy(prob)

Return the problem's (prob) domain-averaged potential energy of the fluid,

\[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

source

The total energy is:

GeophysicalFlows.SingleLayerQG.energyFunction
energy(prob)

Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

source

Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

Examples

+\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

The linear operator is constructed in Equation

GeophysicalFlows.SingleLayerQG.EquationFunction
Equation(params::BarotropicQGParams, grid)

Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

The nonlinear term is computed via calcN! function.

source
Equation(params::EquivalentBarotropicQGParams, grid)

Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

The nonlinear term is computed via calcN! function.

source

The nonlinear terms are computed via

GeophysicalFlows.SingleLayerQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Some helper functions included in the module are:

Diagnostics

The kinetic energy of the fluid is computed via:

GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
kinetic_energy(prob)

Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

source

while the potential energy, for an equivalent barotropic fluid, is computed via:

GeophysicalFlows.SingleLayerQG.potential_energyFunction
potential_energy(prob)

Return the problem's (prob) domain-averaged potential energy of the fluid,

\[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

source

The total energy is:

GeophysicalFlows.SingleLayerQG.energyFunction
energy(prob)

Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

source

Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

Examples

diff --git a/dev/modules/surfaceqg/index.html b/dev/modules/surfaceqg/index.html index 02e08f08..00a85061 100644 --- a/dev/modules/surfaceqg/index.html +++ b/dev/modules/surfaceqg/index.html @@ -1,2 +1,2 @@ -SurfaceQG · GeophysicalFlows.jl

SurfaceQG

Basic Equations

This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

\[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

The SQG model evolves the surface buoyancy,

\[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

\[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

\[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

Implementation

The buoyancy equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

The linear operator is constructed in Equation

GeophysicalFlows.SurfaceQG.EquationFunction
Equation(params, grid)

Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

\[L = - ν |𝐤|^{2 n_ν} .\]

Plain old viscocity corresponds to $n_ν=1$.

The nonlinear term is computed via function calcN!().

source

while the nonlinear terms via

GeophysicalFlows.SurfaceQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For decaying case (no forcing, $F = 0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

Helper functions

Diagnostics

GeophysicalFlows.SurfaceQG.kinetic_energyFunction
kinetic_energy(prob)

Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

In SQG, this is identical to half the domain-averaged surface buoyancy variance.

source
GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
buoyancy_variance(prob)

Return the buoyancy variance,

\[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

source

Other diagnostic include: buoyancy_dissipation and buoyancy_work.

Examples

  • examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.

    Capet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.

+SurfaceQG · GeophysicalFlows.jl

SurfaceQG

Basic Equations

This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

\[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

The SQG model evolves the surface buoyancy,

\[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

\[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

\[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

Implementation

The buoyancy equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

The linear operator is constructed in Equation

GeophysicalFlows.SurfaceQG.EquationFunction
Equation(params, grid)

Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

\[L = - ν |𝐤|^{2 n_ν} .\]

Plain old viscocity corresponds to $n_ν=1$.

The nonlinear term is computed via function calcN!().

source

while the nonlinear terms via

GeophysicalFlows.SurfaceQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Diagnostics

Some useful diagnostics are kinetic energy and buoyancy variance.

GeophysicalFlows.SurfaceQG.kinetic_energyFunction
kinetic_energy(prob)

Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

In SQG, this is identical to half the domain-averaged surface buoyancy variance.

source
GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
buoyancy_variance(prob)

Return the buoyancy variance,

\[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

source

Other diagnostic include: buoyancy_dissipation and buoyancy_work.

Examples

diff --git a/dev/modules/twodnavierstokes/index.html b/dev/modules/twodnavierstokes/index.html index c321fa48..198c82dc 100644 --- a/dev/modules/twodnavierstokes/index.html +++ b/dev/modules/twodnavierstokes/index.html @@ -1,4 +1,4 @@ -TwoDNavierStokes · GeophysicalFlows.jl

TwoDNavierStokes

Basic Equations

This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

\[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} +TwoDNavierStokes · GeophysicalFlows.jl

TwoDNavierStokes

Basic Equations

This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

\[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} + \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} -+ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

The state variable sol is the Fourier transform of vorticity, ζh.

The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

The linear operator is constructed in Equation

GeophysicalFlows.TwoDNavierStokes.EquationFunction
Equation(params, grid)

Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

\[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

The nonlinear term is computed via the function calcN!.

source

The nonlinear terms are computed via

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For decaying case (no forcing, $F=0$), vars can be constructed with Vars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

Helper functions

Some helper functions included in the module are:

Diagnostics

Some useful diagnostics are:

GeophysicalFlows.TwoDNavierStokes.energyFunction
energy(prob)

Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

where $ψ$ is the streamfunction.

source
GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
enstrophy(prob)

Returns the problem's (prob) domain-averaged enstrophy,

\[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

where $ζ$ is the relative vorticity.

source

Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

Examples

++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

The state variable sol is the Fourier transform of vorticity, ζh.

The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

The linear operator is constructed in Equation

GeophysicalFlows.TwoDNavierStokes.EquationFunction
Equation(params, grid)

Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

\[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

The nonlinear term is computed via the function calcN!.

source

The nonlinear terms are computed via calcN!,

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Some helper functions included in the module are:

Diagnostics

Some useful diagnostics are:

GeophysicalFlows.TwoDNavierStokes.energyFunction
energy(prob)

Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

where $ψ$ is the streamfunction.

source
GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
enstrophy(prob)

Return the problem's (prob) domain-averaged enstrophy,

\[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

where $ζ$ is the relative vorticity.

source

Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

Examples

diff --git a/dev/objects.inv b/dev/objects.inv new file mode 100644 index 00000000..a6c820d1 Binary files /dev/null and b/dev/objects.inv differ diff --git a/dev/references.bib b/dev/references.bib new file mode 100644 index 00000000..4007e7ac --- /dev/null +++ b/dev/references.bib @@ -0,0 +1,81 @@ +@article{Held-etal-1995, + title={Surface quasi-geostrophic dynamics}, + author={Held, Isaac M. and Pierrehumbert, Raymond T. and Garner, Stephen T. and Swanson, Kyle L.}, + journal={Journal of Fluid Mechanics}, + volume={282}, + pages={1--20}, + year={1995}, + doi={10.1017/S0022112095000012} +} + +@article{Capet-etal-2008, + title={Surface kinetic energy transfer in surface quasi-geostrophic flows}, + author={Capet, Xavier and Klein, Patrice and Hua, Bach Lien and Lapeyre, Guillaume and Mcwilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={604}, + pages={165--174}, + year={2008}, + doi={10.1017/S0022112008001110} +} + +@article{McWilliams-1984, + title={The emergence of isolated coherent vortices in turbulent flow}, + author={McWilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={146}, + pages={21--43}, + year={1984}, + doi={10.1017/S0022112084001750} +} + +@article{Farrell-Ioannou-2003, + title = {Structural stability of turbulent jets}, + author = {Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + pages = {2101--2118}, + volume = 60, + year = 2003, + doi = {10.1175/1520-0469(2003)060<2101:SSOTJ>2.0.CO;2}, +} + +@article{Constantinou-etal-2014, + title = {Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory}, + author = {Constantinou, Navid C. and Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {71}, + number = {5}, + pages = {1818--1842}, + year = {2014}, + doi = {10.1175/JAS-D-13-076.1}, +} + +@article{Srinivasan-Young-2012, + title = {Zonostrophic instability}, + author = {Srinivasan, Kaushik and Young, William R.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {69}, + number = {5}, + pages = {1633--1656}, + year = {2012}, + doi = {10.1175/JAS-D-11-0200.1}, +} + +@article{vanKampen-1981, + title={Itô versus Stratonovich}, + author={Van Kampen, Nicolaas G}, + journal={Journal of Statistical Physics}, + volume={24}, + pages={175--187}, + year={1981}, + doi={10.1007/BF01007642} +} + +@phdthesis{Constantinou-2015-phd, + title = {Formation of large-scale structures by turbulence in rotating planets}, + author = {Constantinou, N. C.}, + school = {National and Kapodistrian University of Athens}, + address = {Athens}, + url = {http://www.didaktorika.gr/eadd/handle/10442/35501?locale=en}, + year = {2015}, + note = {(also available at arXiv:1503.07644)} +} diff --git a/dev/references/index.html b/dev/references/index.html new file mode 100644 index 00000000..1231e405 --- /dev/null +++ b/dev/references/index.html @@ -0,0 +1,2 @@ + +References · GeophysicalFlows.jl

References

diff --git a/dev/search/index.html b/dev/search/index.html deleted file mode 100644 index 3cc7b49f..00000000 --- a/dev/search/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Search · GeophysicalFlows.jl diff --git a/dev/search_index.js b/dev/search_index.js index caee4aa3..c76eb3b3 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"q_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = g fracrho_j+1 - rho_jrho_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta ","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics \nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies():","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes():","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j \nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For decaying case (no forcing, F = 0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.\nCapet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia>]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic Forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"tip: Notation, e.g., ``x_t``\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic Forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that oftentimes this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic Forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"using Plots\nPlots.default(lw=2)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"using Plots\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nplot(μ * t, [E_numerical[:, 1] E_ito[:, 1] E_str[:, 1]],\n linewidth = [3 2 1],\n label = [\"½ xₜ²\" \"Eₜ (Ito)\" \"Eₜ (Stratonovich)\"],\n linestyle = [:solid :dash :dashdot],\n xlabel = \"μ t\",\n ylabel = \"E\",\n legend = :topleft,\n title = \"comparison of E(t) for single realization\")\n\nsavefig(\"assets/energy_comparison.svg\"); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2*μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nplot_E = plot(μ * t, [E_theory mean(E_ito[:, 1:some_realizations], dims=2) mean(E_ito, dims=2)],\n linewidth = [3 2],\n\t label = [\"theoretical ⟨E⟩\" \"⟨E⟩ from $some_realizations ensemble members\" \"⟨E⟩ from $n_realizations ensemble members\"],\n\t xlabel = \"μ t\",\n\t ylabel = \"E\",\n\t legend = :bottomright,\n\t title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nplot_Ebudget = plot(μ * t[1:nsteps-1], [dEdt_ito work_ito.-diss_ito dEdt_theory[1:nsteps-1]],\n linestyle = [:dash :dashdot :solid],\n linewidth = [2 1 3],\n label = [\"numerical 𝖽⟨E⟩/𝖽t\" \"⟨work - dissipation⟩\" \"theoretical 𝖽⟨E⟩/𝖽t\"],\n legend = :topright,\n xlabel = \"μ t\")\n\nplot(plot_E, plot_Ebudget, layout=grid(2, 1, heights=[0.65 ,0.35]), size=(600, 525))\n\nsavefig(\"assets/energy_budgets_Ito.svg\"); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2*μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nplot_E = plot(μ * t, [E_theory mean(E_str[:, 1:some_realizations], dims=2) mean(E_str, dims=2)],\n linewidth = [3 2],\n label = [\"theoretical ⟨E⟩\" \"⟨E⟩ from $some_realizations ensemble members\" \"⟨E⟩ from $n_realizations ensemble members\"],\n xlabel = \"μ t\",\n ylabel = \"E\",\n legend = :bottomright,\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nplot_Ebudget = plot(μ * t[1:nsteps-1], [dEdt_str[1:nsteps-1] work_str[1:nsteps-1].-diss_str[1:nsteps-1] dEdt_theory[1:nsteps-1]],\n linestyle = [:dash :dashdot :solid],\n linewidth = [2 1 3],\n label = [\"numerical 𝖽⟨E⟩/𝖽t\" \"⟨work - dissipation⟩\" \"theoretical 𝖽⟨E⟩/𝖽t\"],\n legend = :bottomleft,\n xlabel = \"μ t\")\n\nplot(plot_E, plot_Ebudget, layout=grid(2, 1, heights=[0.65 ,0.35]), size=(600, 525))\n\nsavefig(\"assets/energy_budgets_Stratonovich.svg\"); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic Forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic Forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic Forcing","title":"Stochastic Forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\" \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#[Phillips-model-of-Baroclinic-Instability](@ref-multilayerqg_2layer_example)","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀, g = 1, 1 # Coriolis parameter and gravitational constant\nH = [0.2, 0.8] # the rest depths of each layer\nρ = [4.0, 5.0] # the density of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,\n dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q+η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This example can viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\" \"ensemble mean energy work, \" \"dissipation, Dᵋ\" \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\" \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\" \"ensemble mean enstophy work, \" \"dissipation, Dᶻ\" \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\" \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\nnothing # hide\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any\nsmall-scale (hyper)-viscosity coefficient\nnν::Int64\n(hyper)-viscosity order, nν 1\nμ::Any\nlarge-scale (hypo)-viscosity coefficient\nnμ::Int64\n(hypo)-viscosity order, nμ 0\ncalcF!::Function\nfunction that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ\nrelative vorticity\nu\nx-component of velocity\nv\ny-component of velocity\nζh\nFourier transform of relative vorticity\nuh\nFourier transform of x-component of velocity\nvh\nFourier transform of y-component of velocity\nFh\nFourier transform of forcing\nprevsol\nsol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables vars for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables vars for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables vars for stochastically forced two-dimensional Navier-Stokes on device grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any\nplanetary vorticity y-gradient\ndeformation_radius::Any\nRossby radius of deformation\neta::Any\ntopographic potential vorticity\netah::Any\nFourier transform of topographic potential vorticity\nμ::Any\nlinear drag coefficient\nν::Any\nsmall-scale (hyper)-viscosity coefficient\nnν::Int64\n(hyper)-viscosity order, nν 1\ncalcF!::Function\nfunction that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq\nrelative vorticity (+ vortex stretching)\nψ\nstreamfunction\nu\nx-component of velocity\nv\ny-component of velocity\nqh\nFourier transform of relative vorticity (+ vortex stretching)\nψh\nFourier transform of streamfunction\nuh\nFourier transform of x-component of velocity\nvh\nFourier transform of y-component of velocity\nFh\nFourier transform of forcing\nprevsol\nsol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the vars for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the vars for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the vars for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64\nnumber of fluid layers\ng::Any\ngravitational constant\nf₀::Any\nconstant planetary vorticity\nβ::Any\nplanetary vorticity y-gradient\nρ::Any\narray with density of each fluid layer\nH::Any\narray with rest height of each fluid layer\nU::Any\narray with imposed constant zonal flow U(y) in each fluid layer\neta::Any\narray containing the topographic PV\nμ::Any\nlinear bottom drag coefficient\nν::Any\nsmall-scale (hyper)-viscosity coefficient\nnν::Int64\n(hyper)-viscosity order, nν 1\ncalcFq!::Function\nfunction that calculates the Fourier transform of the forcing, F\ng′::Any\narray with the reduced gravity constants for each fluid interface\nQx::Any\narray containing x-gradient of PV due to eta in each fluid layer\nQy::Any\narray containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any\narray containing coeffients for getting PV from streamfunction\nS⁻¹::Any\narray containing coeffients for inverting PV to streamfunction\nrfftplan::Any\nrfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any\nplanetary vorticity y-gradient\nU::Any\narray with imposed constant zonal flow U(y)\neta::Any\narray containing topographic PV\nμ::Any\nlinear drag coefficient\nν::Any\nsmall-scale (hyper)-viscosity coefficient\nnν::Int64\n(hyper)-viscosity order, nν 1\ncalcFq!::Function\nfunction that calculates the Fourier transform of the forcing, F\nQx::Any\narray containing x-gradient of PV due to eta\nQy::Any\narray containing y-gradient of PV due to β, U, and eta\nrfftplan::Any\nrfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for MultiLayer QG.\n\nq\nrelative vorticity + vortex stretching\nψ\nstreamfunction\nu\nx-component of velocity\nv\ny-component of velocity\nqh\nFourier transform of relative vorticity + vortex stretching\nψh\nFourier transform of streamfunction\nuh\nFourier transform of x-component of velocity\nvh\nFourier transform of y-component of velocity\nFqh\nFourier transform of forcing\nprevsol\nsol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(rid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any\nbuoyancy (hyper)-viscosity coefficient\nnν::Int64\nbuoyancy (hyper)-viscosity order\ncalcF!::Function\nfunction that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb\nbuoyancy\nu\nx-component of velocity\nv\ny-component of velocity\nbh\nFourier transform of buoyancy\nuh\nFourier transform of x-component of velocity\nvh\nFourier transform of y-component of velocity\nFh\nFourier transform of forcing\nprevsol\nsol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the vars for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the vars for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the vars for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any\nplanetary vorticity y-gradient\neta::Any\ntopographic potential vorticity\netah::Any\nFourier transform of topographic potential vorticity\nμ::Any\nlinear drag coefficient\nν::Any\nsmall-scale (hyper)-viscosity coefficient\nnν::Int64\n(hyper)-viscosity order, nν 1\ncalcF!::Function\nfunction that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu\nx-component of small-scale velocity\nv\ny-component of small-scale velocity\nU\nx-component of large-scale velocity\nuzeta\nsmall-scale u′ζ′\nvzeta\nsmall-scale v′ζ′\nzeta\nsmall-scale relative vorticity\nZeta\nlarge-scale relative vorticity\npsi\nsmall-scale relative vorticity\nPsi\nlarge-scale relative vorticity\nNz\nsmall-scale nonlinear term\nNZ\nlarge-scale nonlinear term\nuh\nFourier transform of x-component of small-scale velocity\nvh\nFourier transform of y-component of small-scale velocity\nUh\nFourier transform of x-component of large-scale velocity\nzetah\nFourier transform of small-scale relative vorticity\nZetah\nFourier transform of large-scale relative vorticity\npsih\nFourier transform of small-scale relative vorticity\nPsih\nFourier transform of large-scale relative vorticity\nFh\nFourier transform of forcing\nprevsol\nsol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the vars for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the vars for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the vars for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 20 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 8) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Farrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. J. Atmos. Sci., 60, 2101-2118.\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. J. Atmos. Sci., 69 (5), 1633-1656.\nConstantinou, N. C., Farrell, B. F., and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. J. Atmos. Sci., 71 (5), 1818-1842.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For decaying case (no forcing, F = 0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For decaying case (no forcing, F=0), vars can be constructed with Vars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturns the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. J. Fluid Mech., 146, 21-43.\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask=mask, allones=false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device=CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n\naliased_fraction = 1/3, T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nKeyword arguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device=CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nKeyword arguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q+η) = - i k_x widehatu (q+η) - i k_y widehatv (q+η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers::Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n g = 1.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n ρ = Array{Float64}(1:nlayers),\n eta = nothing,\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n\naliased_fraction = 1/3, T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nKeyword arguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\ng: Gravitational acceleration constant.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nρ: Density of each fluid layer.\neta: Topographic potential vorticity.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) * (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) * (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j) \n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device=CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n\naliased_fraction = 1/3, T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nKeyword arguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device=CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nKeyword arguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"j = Observable(1)\n\nq = @lift irfft(qh[$j], nx)\nψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)\nq̄ = @lift real(ifft(qh[$j][1, :] / ny))\nū = @lift vec(mean(u[$j], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$j])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ū, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 18) do i\n j[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"# we delete the .jld2 file before deploying the docs (takes too much space) #hide\nrm(output.path) #hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This example can be run online via (Image: ). Also, it can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.\nnothing # hidenothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^- i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started by Navid C. Constantinou and Gregory L. Wagner during the 21st AOFD Meeting 2017. During the course of time various people have contributed to GeophysicalFlows.jl, including Lia Siegelman, Brodie Pearson, and André Palóczy (see the example in FourierFlows.jl).","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decaying_topography","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min\nstep: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.10 min\nstep: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.14 min\nstep: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.18 min\nstep: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.22 min\n","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"Capet, X.; Klein, P.; Hua, B. L.; Lapeyre, G. and Mcwilliams, J. C. (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. Journal of Fluid Mechanics 604, 165–174.\n\n\n\nConstantinou, N. C. (2015). Formation of large-scale structures by turbulence in rotating planets. Ph.D. Thesis, National and Kapodistrian University of Athens (Athens) (also available at arXiv:1503.07644).\n\n\n\nConstantinou, N. C.; Farrell, B. F. and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. Journal of the Atmospheric Sciences 71, 1818–1842.\n\n\n\nFarrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. Journal of the Atmospheric Sciences 60, 2101–2118.\n\n\n\nHeld, I. M.; Pierrehumbert, R. T.; Garner, S. T. and Swanson, K. L. (1995). Surface quasi-geostrophic dynamics. Journal of Fluid Mechanics 282, 1–20.\n\n\n\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. Journal of Fluid Mechanics 146, 21–43.\n\n\n\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. Journal of the Atmospheric Sciences 69, 1633–1656.\n\n\n\nVan Kampen, N. G. (1981). Itô versus Stratonovich. Journal of Statistical Physics 24, 175–187.\n\n\n\n","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered Boussinesq quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = b_j - b_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"b_j = - g fracdelta rho_jrho_0","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"is the Boussinesq buoyancy in each layer, with rho = rho_0 + delta rho the total density, rho_0 a constant reference density, and delta rho ll rho_0 the perturbation density.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia> ]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Output\n ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}\n ├──── path: ./forcedbetaQLturb.jld2\n └── fields: Dict{Symbol, Function}(:sol => Main.var\"##246\".get_sol, :u => Main.var\"##246\".get_u)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0319, Q: 4.6924, walltime: 0.13 min\nstep: 2000, t: 100, cfl: 0.81, E: 0.0410, Q: 4.1952, walltime: 0.23 min\nstep: 3000, t: 150, cfl: 0.80, E: 0.0453, Q: 4.0640, walltime: 0.33 min\nstep: 4000, t: 200, cfl: 0.96, E: 0.0458, Q: 4.1056, walltime: 0.44 min\nstep: 5000, t: 250, cfl: 0.87, E: 0.0474, Q: 4.3665, walltime: 0.55 min\nstep: 6000, t: 300, cfl: 0.79, E: 0.0495, Q: 4.6566, walltime: 0.67 min\nstep: 7000, t: 350, cfl: 0.79, E: 0.0484, Q: 4.2472, walltime: 0.80 min\nstep: 8000, t: 400, cfl: 0.92, E: 0.0479, Q: 3.8324, walltime: 0.93 min\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that often this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\", \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min\nstep: 1000, t: 5, cfl: 0.43, E: 0.2881, Z: 34.9014, walltime: 0.15 min\nstep: 2000, t: 10, cfl: 0.53, E: 0.3803, Z: 33.7438, walltime: 0.24 min\nstep: 3000, t: 15, cfl: 0.48, E: 0.4326, Z: 36.7366, walltime: 0.34 min\nstep: 4000, t: 20, cfl: 0.53, E: 0.4520, Z: 34.9454, walltime: 0.44 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"../../../examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#multilayerqg_2layer_example","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀ = 1 # Coriolis parameter\nH = [0.2, 0.8] # the rest depths of each layer\nb = [-1.0, -1.2] # Boussinesq buoyancy of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, H, b, U, μ, β,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min\nstep: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.31 min\nstep: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.45 min\nstep: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.58 min\nstep: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.72 min\nstep: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.85 min\nstep: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.99 min\nstep: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.14 min\nstep: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.30 min\nstep: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.45 min\nstep: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.59 min\nstep: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.74 min\nstep: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.88 min\nstep: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 2.01 min\nstep: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.14 min\nstep: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.27 min\nstep: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.40 min\nstep: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.52 min\nstep: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.64 min\nstep: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.76 min\nstep: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.87 min\n","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"step: 0100, t: 0.5, cfl: 0.172, walltime: 0.01 min\nstep: 0200, t: 1.0, cfl: 0.214, walltime: 0.03 min\nstep: 0300, t: 1.5, cfl: 0.269, walltime: 0.04 min\nstep: 0400, t: 2.0, cfl: 0.355, walltime: 0.05 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\", \"ensemble mean energy work, \", \"dissipation, Dᵋ\", \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\", \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\", \"ensemble mean enstophy work, \", \"dissipation, Dᶻ\", \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\", \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"../../../examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nequivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nbarotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.08 min\nequivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.08 min\nbarotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.16 min\nequivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.16 min\nbarotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.22 min\nequivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.22 min\nbarotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.29 min\nequivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.29 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nb::Tuple: array with Boussinesq buoyancy of each fluid layer\nH::Tuple: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Tuple: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to eta in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nb::Tuple: array with Boussinesq buoyancy of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 12) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min\nstep: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.16 min\nstep: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.28 min\nstep: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.40 min\nstep: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.52 min\n","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.GeophysicalFlows","category":"page"},{"location":"lib/functions/#GeophysicalFlows.GeophysicalFlows","page":"Functions","title":"GeophysicalFlows.GeophysicalFlows","text":"Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.\n\n\n\n\n\n","category":"module"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work\nGeophysicalFlows.TwoDNavierStokes.palinstrophy","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.palinstrophy","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.palinstrophy","text":"palinstrophy(prob)\n\nReturn the problem's (prob) domain-averaged palinstrophy,\n\nint frac12 bf ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n b = -(1 .+ 1/nlayers * Array{Float64}(0:nlayers-1)),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nb: Boussinesq buoyancy of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 0500, t: 25, cfl: 0.55, E: 0.0182, Q: 2.6371, walltime: 0.04 min\nstep: 1000, t: 50, cfl: 0.61, E: 0.0293, Q: 2.8787, walltime: 0.06 min\nstep: 1500, t: 75, cfl: 0.67, E: 0.0364, Q: 2.8105, walltime: 0.08 min\nstep: 2000, t: 100, cfl: 0.87, E: 0.0403, Q: 2.6290, walltime: 0.10 min\nstep: 2500, t: 125, cfl: 0.83, E: 0.0433, Q: 2.7528, walltime: 0.12 min\nstep: 3000, t: 150, cfl: 0.91, E: 0.0446, Q: 2.6793, walltime: 0.13 min\nstep: 3500, t: 175, cfl: 0.77, E: 0.0455, Q: 2.6078, walltime: 0.15 min\nstep: 4000, t: 200, cfl: 0.71, E: 0.0455, Q: 2.6548, walltime: 0.17 min\nstep: 4500, t: 225, cfl: 0.78, E: 0.0458, Q: 2.6460, walltime: 0.19 min\nstep: 5000, t: 250, cfl: 0.89, E: 0.0473, Q: 2.7878, walltime: 0.21 min\nstep: 5500, t: 275, cfl: 0.90, E: 0.0480, Q: 2.7345, walltime: 0.23 min\nstep: 6000, t: 300, cfl: 0.87, E: 0.0482, Q: 2.8067, walltime: 0.24 min\nstep: 6500, t: 325, cfl: 0.74, E: 0.0478, Q: 2.7029, walltime: 0.26 min\nstep: 7000, t: 350, cfl: 0.86, E: 0.0461, Q: 2.5248, walltime: 0.28 min\nstep: 7500, t: 375, cfl: 0.78, E: 0.0465, Q: 2.6692, walltime: 0.30 min\nstep: 8000, t: 400, cfl: 0.74, E: 0.0456, Q: 2.5986, walltime: 0.32 min\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"n = Observable(1)\n\nqₙ = @lift irfft(qh[$n], nx)\nψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)\nq̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))\nūₙ = @lift vec(mean(u[$n], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$n])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, qₙ;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψₙ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψₙ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₙ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₙ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 16) do i\n n[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"../../../examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"\"SurfaceQG_decaying_n_256\"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16\nstep: 0500, t: 15.0, cfl: 0.588, walltime: 0.07 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11\nstep: 1000, t: 30.0, cfl: 0.571, walltime: 0.12 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09\nstep: 1500, t: 45.0, cfl: 0.577, walltime: 0.17 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08\nstep: 2000, t: 60.0, cfl: 0.574, walltime: 0.22 min\nbuoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08\n","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Parfenyev, V., Blumenau, M., and Nikitin, I. (2024) Inferring parameters and reconstruction of two-dimensional turbulent flows with physics-informed neural networks. arXiv preprint arXiv:2404.01193, doi:10.48550/arXiv.2404.01193.\nBischoff, T., and Deck, K. (2024) Unpaired downscaling of fluid flows with diffusion bridges. Artificial Intelligence for the Earth Systems, doi:10.1175/AIES-D-23-0039.1, in press.\nKolokolov, I. V., Lebedev, V. V., and Parfenyev, V. M. (2024) Correlations in a weakly interacting two-dimensional random flow. Physical Review E, 109(3), 035103, doi:10.1103/PhysRevE.109.035103.\nParfenyev, V. (2024) Statistical analysis of vortex condensate motion in two-dimensional turbulence. Physics of Fluids, 36, 015148, doi:10.1063/5.0187030.\nLaCasce, J. H., Palóczy, A., and Trodahl, M. (2024). Vortices over bathymetry. Journal of Fluid Mechanics, 979, A32, doi:10.1017/jfm.2023.1084.\nDrivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surveys in Mathematical Sciences, 10(1), 1–100, doi:10.4171/emss/66.\nShokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.\nSiegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.\nBisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nParfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.\nPalóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"../../../examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decay_topography_example","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.24 min\nstep: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.46 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] } diff --git a/dev/stochastic_forcing/index.html b/dev/stochastic_forcing/index.html index f2124974..8815f49a 100644 --- a/dev/stochastic_forcing/index.html +++ b/dev/stochastic_forcing/index.html @@ -1,5 +1,5 @@ -Stochastic Forcing · GeophysicalFlows.jl

Stochastic Forcing

Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

Itô or Stratonovich in GeophysicalFlows.jl?

All modules included in GeophysicalFlows.jl use Stratonovich calculus.

The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

Stochastic Differential Equations (SDEs)

A differential equation:

\[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

can also be equivalently written in an integral form:

\[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

In a similar manner, a stochastic differential equation (SDE),

\[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

\[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

Wiener process

A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

  1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
  2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
  3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
Notation, e.g., ``x_t``

It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

\[\begin{aligned} +Stochastic forcing · GeophysicalFlows.jl

Stochastic Forcing

Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

Itô or Stratonovich in GeophysicalFlows.jl?

All modules included in GeophysicalFlows.jl use Stratonovich calculus.

The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

Stochastic Differential Equations (SDEs)

A differential equation:

\[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

can also be equivalently written in an integral form:

\[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

In a similar manner, a stochastic differential equation (SDE),

\[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

\[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

Wiener process

A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

  1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
  2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
  3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
Notation

It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

\[\begin{aligned} {\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ {\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . \end{aligned}\]

The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

\[\begin{aligned} @@ -13,13 +13,13 @@ & \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ {\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ & \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . -\end{aligned}\]

SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.

A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

\[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

Note that in differential form (1) is written as:

\[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that oftentimes this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

\[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

\[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

\[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

\[\begin{aligned} +\end{aligned}\]

SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).

A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

\[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

Note that in differential form (1) is written as:

\[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that often this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

\[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

\[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

\[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

\[\begin{aligned} {\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ {\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . \end{aligned}\]

Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

\[\dot{x} = -\mu x + \xi , \tag{5}\]

where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

\[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

\[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

and using this solution we get

\[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

Numerical implementation

How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

\[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

\[\begin{aligned} \widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . -\end{aligned}\]

Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

Figure below compares the energy evolution as predicted by:

  • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
  • time-integration of (3) using Euler–Maruyama, and
  • time-integration of (4) using Euler–Heun.
using Plots
+\end{aligned}\]

Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

Figure below compares the energy evolution as predicted by:

  • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
  • time-integration of (3) using Euler–Maruyama, and
  • time-integration of (4) using Euler–Heun.
using CairoMakie
 using Statistics: mean
 using Random: randn, seed!
 seed!(1234) # for reproducing the same plots
@@ -42,7 +42,7 @@
 E_numerical = zeros(size(ΔW))
 
 for j = 2:nsteps # time step the equations
-	
+
   # time-step dx = - μ x dt + √σ dW
   @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
 
@@ -61,16 +61,20 @@
 @. E_numerical = 0.5 * x^2
 
 # compare the three E(t) solutions
-plot(μ * t, [E_numerical[:, 1] E_ito[:, 1] E_str[:, 1]],
-          linewidth = [3 2 1],
-              label = ["½ xₜ²" "Eₜ (Ito)" "Eₜ (Stratonovich)"],
-          linestyle = [:solid :dash :dashdot],
-             xlabel = "μ t",
-             ylabel = "E",
-             legend = :topleft,
-              title = "comparison of E(t) for single realization")
-
-savefig("assets/energy_comparison.svg"); nothing # hide

energy_comparison

Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

# theoretical results for ⟨E⟩ and d⟨E⟩/dt
+fig = Figure()
+ax = Axis(fig[1, 1];
+          xlabel = "μ t",
+          ylabel = "E",
+          title = "comparison of E(t) for single realization")
+
+hl1 = lines!(ax, μ * t, E_numerical[:, 1];
+             linewidth = 3, linestyle = :solid)
+hl2 = lines!(ax, μ * t, E_ito[:, 1];
+             linewidth = 2, linestyle = :dash)
+hl3 = lines!(ax, μ * t, E_str[:, 1];
+             linewidth = 1, linestyle = :dashdot)
+
+Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

energy_comparison

Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

# theoretical results for ⟨E⟩ and d⟨E⟩/dt
    E_theory = @. σ/4μ * (1 - exp(-2μ * t))
 dEdt_theory = @. σ/2  * exp(-2μ * t)
 
@@ -79,52 +83,76 @@
 
 # compute the work and dissipation
 work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
-diss_ito = 2*μ * (mean(E_ito[1:nsteps-1, :], dims=2))
+diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
 
 # Ensemble mean energy budgets from the Itô integration
 
-plot_E = plot(μ * t, [E_theory mean(E_ito[:, 1:some_realizations], dims=2) mean(E_ito, dims=2)],
-                linewidth = [3 2],
-	                  label = ["theoretical ⟨E⟩" "⟨E⟩ from $some_realizations ensemble members" "⟨E⟩ from $n_realizations ensemble members"],
-	                 xlabel = "μ t",
-	                 ylabel = "E",
-	                 legend = :bottomright,
-	                  title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
+fig = Figure()
+
+ax1 = Axis(fig[1, 1];
+           xlabel = "μ t",
+           ylabel = "E",
+           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
+
+hl1 = lines!(ax1, μ * t, E_theory;
+             linewidth = 3)
+hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
+             linewidth = 2)
+hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
+             linewidth = 1)
+
+Legend(fig[1, 2], [hl1, hl2, hl3],
+                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
 
-plot_Ebudget = plot(μ * t[1:nsteps-1], [dEdt_ito work_ito.-diss_ito dEdt_theory[1:nsteps-1]],
-                linestyle = [:dash :dashdot :solid],
-                linewidth = [2 1 3],
-                    label = ["numerical 𝖽⟨E⟩/𝖽t" "⟨work - dissipation⟩" "theoretical 𝖽⟨E⟩/𝖽t"],
-                   legend = :topright,
-                   xlabel = "μ t")
+ax2 = Axis(fig[2, 1];
+           xlabel = "μ t",
+           ylabel = "dE/dt")
 
-plot(plot_E, plot_Ebudget, layout=grid(2, 1, heights=[0.65 ,0.35]), size=(600, 525))
+hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
+             linewidth = 2, linestyle = :dash)
+hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
+             linewidth = 1, linestyle = :dashdot)
+hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
+             linewidth = 3, linestyle = :solid)
 
-savefig("assets/energy_budgets_Ito.svg"); nothing # hide

energy_budgets_Ito

# compute d⟨E⟩/dt numerically
+Legend(fig[2, 2], [hl1, hl2, hl3],
+                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

energy_budgets_Ito

# compute d⟨E⟩/dt numerically
 dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
 
 # compute the work and dissipation
 work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
-diss_str = 2*μ * (mean(E_str[1:nsteps-1, :], dims=2))
-
-plot_E = plot(μ * t, [E_theory mean(E_str[:, 1:some_realizations], dims=2) mean(E_str, dims=2)],
-                linewidth = [3 2],
-                    label = ["theoretical ⟨E⟩" "⟨E⟩ from $some_realizations ensemble members" "⟨E⟩ from $n_realizations ensemble members"],
-                   xlabel = "μ t",
-                   ylabel = "E",
-                   legend = :bottomright,
-                    title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
-
-plot_Ebudget = plot(μ * t[1:nsteps-1], [dEdt_str[1:nsteps-1] work_str[1:nsteps-1].-diss_str[1:nsteps-1] dEdt_theory[1:nsteps-1]],
-                linestyle = [:dash :dashdot :solid],
-                linewidth = [2 1 3],
-                    label = ["numerical 𝖽⟨E⟩/𝖽t" "⟨work - dissipation⟩" "theoretical 𝖽⟨E⟩/𝖽t"],
-                   legend = :bottomleft,
-                   xlabel = "μ t")
-
-plot(plot_E, plot_Ebudget, layout=grid(2, 1, heights=[0.65 ,0.35]), size=(600, 525))
-
-savefig("assets/energy_budgets_Stratonovich.svg"); nothing # hide

energy_budgets_Stratonovich

A simple Stochastic Partial Differential Equation (SPDE)

We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

\[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

\[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

The forcing $\xi$ obeys:

\[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

\[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

\[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

\[\begin{aligned} +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2)) + +fig = Figure() + +ax1 = Axis(fig[1, 1]; + xlabel = "μ t", + ylabel = "E", + title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ") + +hl1 = lines!(ax1, μ * t, E_theory; + linewidth = 3) +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2)); + linewidth = 2) +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)), + linewidth = 1) + +Legend(fig[1, 2], [hl1, hl2, hl3], + ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"]) + +ax2 = Axis(fig[2, 1]; + xlabel = "μ t", + ylabel = "dE/dt") + +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str); + linewidth = 2, linestyle = :dash) +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str); + linewidth = 1, linestyle = :dashdot) +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1]; + linewidth = 3, linestyle = :solid) + +Legend(fig[2, 2], [hl1, hl2, hl3], + ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

energy_budgets_Stratonovich

A simple Stochastic Partial Differential Equation (SPDE)

We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

\[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

\[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

The forcing $\xi$ obeys:

\[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

\[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

\[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

\[\begin{aligned} P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , \end{aligned}\]

or Itô-wise as

\[\begin{aligned} P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . @@ -134,4 +162,4 @@ & = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ & = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ & = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . -\end{aligned}\]

Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

\[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

\[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

\[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

Remember, previously the work done by the stochastic forcing was:

\[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

and by sampling over various forcing realizations:

\[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

A bit more elaborate SPDE

It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

\[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

\[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

+\end{aligned}\]

Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

\[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

\[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

\[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

Remember, previously the work done by the stochastic forcing was:

\[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

and by sampling over various forcing realizations:

\[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

A bit more elaborate SPDE

It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

\[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

\[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

diff --git a/dev/visualize/index.html b/dev/visualize/index.html new file mode 100644 index 00000000..0db25a6f --- /dev/null +++ b/dev/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

Visualize output

In the examples we use Makie.jl for plotting.

Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

diff --git a/previews/PR326/aliasing/index.html b/previews/PR326/aliasing/index.html new file mode 100644 index 00000000..bbd6ae51 --- /dev/null +++ b/previews/PR326/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

Aliasing

In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

De-aliasing scheme

FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
+
+julia> OneDimensionalGrid
+         ├─────────── Device: CPU
+         ├──────── FloatType: Float64
+         ├────────── size Lx: 6.283185307179586
+         ├──── resolution nx: 64
+         ├── grid spacing dx: 0.09817477042468103
+         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
+         └─ aliased fraction: 0.5

or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
+Problem
+  ├─────────── grid: grid (on CPU)
+  ├───── parameters: params
+  ├────── variables: vars
+  ├─── state vector: sol
+  ├─────── equation: eqn
+  ├────────── clock: clock
+  └──── timestepper: RK4TimeStepper
+  
+julia> prob.grid.aliased_fraction
+0.5

Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

diff --git a/previews/PR326/assets/README/index.html b/previews/PR326/assets/README/index.html new file mode 100644 index 00000000..b0700944 --- /dev/null +++ b/previews/PR326/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/previews/PR326/assets/documenter.js b/previews/PR326/assets/documenter.js new file mode 100644 index 00000000..6adfbbbf --- /dev/null +++ b/previews/PR326/assets/documenter.js @@ -0,0 +1,331 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fas", "fa-copy"); + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-times"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-times"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function() { + $('#documenter .docs-navbar').headroom({ + "tolerance": {"up": 10, "down": 10}, + }); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function() { + var settings = $('#documenter-settings'); + $('#documenter-settings-button').click(function(){ + settings.toggleClass('is-active'); + }); + // Close the dialog if X is clicked + $('#documenter-settings button.delete').click(function(){ + settings.removeClass('is-active'); + }); + // Close dialog if ESC is pressed + $(document).keyup(function(e) { + if (e.keyCode == 27) settings.removeClass('is-active'); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function() { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button") + sidebar_button.click(function(ev) { + ev.preventDefault(); + sidebar.toggleClass('visible'); + if (sidebar.hasClass('visible')) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind('click', function(ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + }); +}) + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function() { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css('max-width'), 10); + var L0 = e.width(); + if(L0 > L) { + var h0 = parseInt(e.css('font-size'), 10); + e.css('font-size', L * h0 / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on('orientationchange', resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function() { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if(typeof active !== 'undefined') { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +function set_theme(theme) { + var active = null; + var disabled = []; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + var themename = ss.ownerNode.getAttribute("data-theme-name"); + if(themename === null) continue; // ignore non-theme stylesheets + // Find the active theme + if(themename === theme) active = ss; + else disabled.push(ss); + } + if(active !== null) { + active.disabled = false; + if(active.ownerNode.getAttribute("data-theme-primary") === null) { + document.getElementsByTagName('html')[0].className = "theme--" + theme; + } else { + document.getElementsByTagName('html')[0].className = ""; + } + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + + // Store the theme in localStorage + if(typeof(window.localStorage) !== "undefined") { + window.localStorage.setItem("documenter-theme", theme); + } else { + console.error("Browser does not support window.localStorage"); + } +} + +// Theme picker setup +$(document).ready(function() { + // onchange callback + $('#documenter-themepicker').change(function themepick_callback(ev){ + var themename = $('#documenter-themepicker option:selected').attr('value'); + set_theme(themename); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if(typeof(window.localStorage) !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if(theme !== null) { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = (e.value === theme); + }) + } else { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = $("html").hasClass(`theme--${e.value}`); + }) + } + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function() { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function(x) { + target_href = version_selector_select.children("option:selected").get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) { + var option = $(""); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== 'undefined') { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function(i,x){return x.text}); + DOC_VERSIONS.forEach(function(each) { + var version_url = documenterBaseURL + "/../" + each; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $(""); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}) + +}) diff --git a/previews/PR326/assets/energy_budgets_Ito.svg b/previews/PR326/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..de8d0090 --- /dev/null +++ b/previews/PR326/assets/energy_budgets_Ito.svg @@ -0,0 +1,1397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR326/assets/energy_budgets_Stratonovich.svg b/previews/PR326/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..7ed887ab --- /dev/null +++ b/previews/PR326/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR326/assets/energy_comparison.svg b/previews/PR326/assets/energy_comparison.svg new file mode 100644 index 00000000..398b7df7 --- /dev/null +++ b/previews/PR326/assets/energy_comparison.svg @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/assets/search.js b/previews/PR326/assets/search.js similarity index 100% rename from dev/assets/search.js rename to previews/PR326/assets/search.js diff --git a/previews/PR326/assets/themes/documenter-dark.css b/previews/PR326/assets/themes/documenter-dark.css new file mode 100644 index 00000000..0bf1af7d --- /dev/null +++ b/previews/PR326/assets/themes/documenter-dark.css @@ -0,0 +1,7702 @@ +@charset "UTF-8"; +/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +html.theme--documenter-dark .tabs, html.theme--documenter-dark .pagination-previous, +html.theme--documenter-dark .pagination-next, +html.theme--documenter-dark .pagination-link, +html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .breadcrumb, html.theme--documenter-dark .file, html.theme--documenter-dark .button, .is-unselectable, html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after, html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +html.theme--documenter-dark .admonition:not(:last-child), html.theme--documenter-dark .tabs:not(:last-child), html.theme--documenter-dark .message:not(:last-child), html.theme--documenter-dark .list:not(:last-child), html.theme--documenter-dark .level:not(:last-child), html.theme--documenter-dark .breadcrumb:not(:last-child), html.theme--documenter-dark .highlight:not(:last-child), html.theme--documenter-dark .block:not(:last-child), html.theme--documenter-dark .title:not(:last-child), +html.theme--documenter-dark .subtitle:not(:last-child), html.theme--documenter-dark .table-container:not(:last-child), html.theme--documenter-dark .table:not(:last-child), html.theme--documenter-dark .progress:not(:last-child), html.theme--documenter-dark .notification:not(:last-child), html.theme--documenter-dark .content:not(:last-child), html.theme--documenter-dark .box:not(:last-child) { + margin-bottom: 1.5rem; } + +html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before, html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before { + height: 2px; + width: 50%; } + html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { + height: 50%; + width: 2px; } + html.theme--documenter-dark .modal-close:hover, html.theme--documenter-dark .delete:hover, html.theme--documenter-dark .modal-close:focus, html.theme--documenter-dark .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + html.theme--documenter-dark .modal-close:active, html.theme--documenter-dark .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + html.theme--documenter-dark .is-small.modal-close, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.modal-close, html.theme--documenter-dark .is-small.delete, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + html.theme--documenter-dark .is-medium.modal-close, html.theme--documenter-dark .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + html.theme--documenter-dark .is-large.modal-close, html.theme--documenter-dark .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +html.theme--documenter-dark .control.is-loading::after, html.theme--documenter-dark .select.is-loading::after, html.theme--documenter-dark .loader, html.theme--documenter-dark .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdee0; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +html.theme--documenter-dark .hero-video, html.theme--documenter-dark .modal-background, html.theme--documenter-dark .modal, html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, +html.theme--documenter-dark .image.is-square .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, +html.theme--documenter-dark .image.is-1by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, +html.theme--documenter-dark .image.is-5by4 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, +html.theme--documenter-dark .image.is-4by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, +html.theme--documenter-dark .image.is-3by2 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, +html.theme--documenter-dark .image.is-5by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, +html.theme--documenter-dark .image.is-16by9 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, +html.theme--documenter-dark .image.is-2by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, +html.theme--documenter-dark .image.is-3by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, +html.theme--documenter-dark .image.is-4by5 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, +html.theme--documenter-dark .image.is-3by4 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, +html.theme--documenter-dark .image.is-2by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, +html.theme--documenter-dark .image.is-3by5 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, +html.theme--documenter-dark .image.is-9by16 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, +html.theme--documenter-dark .image.is-1by2 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, +html.theme--documenter-dark .image.is-1by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +html.theme--documenter-dark .pagination-previous, +html.theme--documenter-dark .pagination-next, +html.theme--documenter-dark .pagination-link, +html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .file-cta, +html.theme--documenter-dark .file-name, html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 0.4em; + box-shadow: none; + display: inline-flex; + font-size: 15px; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; } + html.theme--documenter-dark .pagination-previous:focus, + html.theme--documenter-dark .pagination-next:focus, + html.theme--documenter-dark .pagination-link:focus, + html.theme--documenter-dark .pagination-ellipsis:focus, html.theme--documenter-dark .file-cta:focus, + html.theme--documenter-dark .file-name:focus, html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .button:focus, html.theme--documenter-dark .is-focused.pagination-previous, + html.theme--documenter-dark .is-focused.pagination-next, + html.theme--documenter-dark .is-focused.pagination-link, + html.theme--documenter-dark .is-focused.pagination-ellipsis, html.theme--documenter-dark .is-focused.file-cta, + html.theme--documenter-dark .is-focused.file-name, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-focused.button, html.theme--documenter-dark .pagination-previous:active, + html.theme--documenter-dark .pagination-next:active, + html.theme--documenter-dark .pagination-link:active, + html.theme--documenter-dark .pagination-ellipsis:active, html.theme--documenter-dark .file-cta:active, + html.theme--documenter-dark .file-name:active, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .button:active, html.theme--documenter-dark .is-active.pagination-previous, + html.theme--documenter-dark .is-active.pagination-next, + html.theme--documenter-dark .is-active.pagination-link, + html.theme--documenter-dark .is-active.pagination-ellipsis, html.theme--documenter-dark .is-active.file-cta, + html.theme--documenter-dark .is-active.file-name, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .is-active.button { + outline: none; } + html.theme--documenter-dark .pagination-previous[disabled], + html.theme--documenter-dark .pagination-next[disabled], + html.theme--documenter-dark .pagination-link[disabled], + html.theme--documenter-dark .pagination-ellipsis[disabled], html.theme--documenter-dark .file-cta[disabled], + html.theme--documenter-dark .file-name[disabled], html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .pagination-previous, html.theme--documenter-dark fieldset[disabled] .pagination-previous, + fieldset[disabled] html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark fieldset[disabled] .pagination-next, + fieldset[disabled] html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark fieldset[disabled] .pagination-link, + fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis, + html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis, fieldset[disabled] html.theme--documenter-dark .file-cta, html.theme--documenter-dark fieldset[disabled] .file-cta, + fieldset[disabled] html.theme--documenter-dark .file-name, + html.theme--documenter-dark fieldset[disabled] .file-name, fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark fieldset[disabled] .select select, html.theme--documenter-dark .select fieldset[disabled] select, html.theme--documenter-dark fieldset[disabled] .textarea, html.theme--documenter-dark fieldset[disabled] .input, html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] html.theme--documenter-dark .button, html.theme--documenter-dark fieldset[disabled] .button { + cursor: not-allowed; } + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; } + +audio { + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: left; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 15px !important; } + +.is-size-7, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + font-size: 0.85em !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 15px !important; } + .is-size-7-mobile { + font-size: 0.85em !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 15px !important; } + .is-size-7-tablet { + font-size: 0.85em !important; } } + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 15px !important; } + .is-size-7-touch { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 15px !important; } + .is-size-7-desktop { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 15px !important; } + .is-size-7-widescreen { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 15px !important; } + .is-size-7-fullhd { + font-size: 0.85em !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: #ecf0f1 !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #cfd9db !important; } + +.has-background-light { + background-color: #ecf0f1 !important; } + +.has-text-dark { + color: #282f2f !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #111414 !important; } + +.has-background-dark { + background-color: #282f2f !important; } + +.has-text-primary { + color: #375a7f !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #28415b !important; } + +.has-background-primary { + background-color: #375a7f !important; } + +.has-text-link { + color: #1abc9c !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #148f77 !important; } + +.has-background-link { + background-color: #1abc9c !important; } + +.has-text-info { + color: #024c7d !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #012d4b !important; } + +.has-background-info { + background-color: #024c7d !important; } + +.has-text-success { + color: #008438 !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #005122 !important; } + +.has-background-success { + background-color: #008438 !important; } + +.has-text-warning { + color: #ad8100 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #7a5b00 !important; } + +.has-background-warning { + background-color: #ad8100 !important; } + +.has-text-danger { + color: #9e1b0d !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #6f1309 !important; } + +.has-background-danger { + background-color: #9e1b0d !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #282f2f !important; } + +.has-background-grey-darker { + background-color: #282f2f !important; } + +.has-text-grey-dark { + color: #343c3d !important; } + +.has-background-grey-dark { + background-color: #343c3d !important; } + +.has-text-grey { + color: #5e6d6f !important; } + +.has-background-grey { + background-color: #5e6d6f !important; } + +.has-text-grey-light { + color: #8c9b9d !important; } + +.has-background-grey-light { + background-color: #8c9b9d !important; } + +.has-text-grey-lighter { + color: #dbdee0 !important; } + +.has-background-grey-lighter { + background-color: #dbdee0 !important; } + +.has-text-white-ter { + color: #ecf0f1 !important; } + +.has-background-white-ter { + background-color: #ecf0f1 !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-family-code { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-relative { + position: relative !important; } + +html.theme--documenter-dark { + /* This file contain the overall layout. + * + * The main container is
that is identified by id #documenter. + */ + /*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/ + /* Comment */ + /* Red */ + /* Orange */ + /* Yellow */ + /* Green */ + /* Blue */ + /* Purple */ } + html.theme--documenter-dark html { + background-color: #1f2424; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + html.theme--documenter-dark article, + html.theme--documenter-dark aside, + html.theme--documenter-dark figure, + html.theme--documenter-dark footer, + html.theme--documenter-dark header, + html.theme--documenter-dark hgroup, + html.theme--documenter-dark section { + display: block; } + html.theme--documenter-dark body, + html.theme--documenter-dark button, + html.theme--documenter-dark input, + html.theme--documenter-dark select, + html.theme--documenter-dark textarea { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + html.theme--documenter-dark code, + html.theme--documenter-dark pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } + html.theme--documenter-dark body { + color: #fff; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + html.theme--documenter-dark a { + color: #1abc9c; + cursor: pointer; + text-decoration: none; } + html.theme--documenter-dark a strong { + color: currentColor; } + html.theme--documenter-dark a:hover { + color: #1dd2af; } + html.theme--documenter-dark code { + background-color: rgba(255, 255, 255, 0.05); + color: #ececec; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; } + html.theme--documenter-dark hr { + background-color: #282f2f; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + html.theme--documenter-dark img { + height: auto; + max-width: 100%; } + html.theme--documenter-dark input[type="checkbox"], + html.theme--documenter-dark input[type="radio"] { + vertical-align: baseline; } + html.theme--documenter-dark small { + font-size: 0.875em; } + html.theme--documenter-dark span { + font-style: inherit; + font-weight: inherit; } + html.theme--documenter-dark strong { + color: #f2f2f2; + font-weight: 700; } + html.theme--documenter-dark fieldset { + border: none; } + html.theme--documenter-dark pre { + -webkit-overflow-scrolling: touch; + background-color: #282f2f; + color: #fff; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + html.theme--documenter-dark pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + html.theme--documenter-dark table td, + html.theme--documenter-dark table th { + vertical-align: top; } + html.theme--documenter-dark table td:not([align]), + html.theme--documenter-dark table th:not([align]) { + text-align: left; } + html.theme--documenter-dark table th { + color: #f2f2f2; } + html.theme--documenter-dark .box { + background-color: #343c3d; + border-radius: 8px; + box-shadow: none; + color: #fff; + display: block; + padding: 1.25rem; } + html.theme--documenter-dark a.box:hover, html.theme--documenter-dark a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #1abc9c; } + html.theme--documenter-dark a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #1abc9c; } + html.theme--documenter-dark .button { + background-color: #282f2f; + border-color: #4c5759; + border-width: 1px; + color: #375a7f; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; } + html.theme--documenter-dark .button strong { + color: inherit; } + html.theme--documenter-dark .button .icon, html.theme--documenter-dark .button .icon.is-small, html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search > input.icon, html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search > input.icon, html.theme--documenter-dark .button .icon.is-medium, html.theme--documenter-dark .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + html.theme--documenter-dark .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; } + html.theme--documenter-dark .button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); } + html.theme--documenter-dark .button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); } + html.theme--documenter-dark .button:hover, html.theme--documenter-dark .button.is-hovered { + border-color: #8c9b9d; + color: #f2f2f2; } + html.theme--documenter-dark .button:focus, html.theme--documenter-dark .button.is-focused { + border-color: #8c9b9d; + color: #17a689; } + html.theme--documenter-dark .button:focus:not(:active), html.theme--documenter-dark .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .button:active, html.theme--documenter-dark .button.is-active { + border-color: #343c3d; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text { + background-color: transparent; + border-color: transparent; + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .button.is-text:hover, html.theme--documenter-dark .button.is-text.is-hovered, html.theme--documenter-dark .button.is-text:focus, html.theme--documenter-dark .button.is-text.is-focused { + background-color: #282f2f; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text:active, html.theme--documenter-dark .button.is-text.is-active { + background-color: #1d2122; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:hover, html.theme--documenter-dark .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:focus, html.theme--documenter-dark .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:focus:not(:active), html.theme--documenter-dark .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white { + background-color: white; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-hovered { + background-color: black; } + html.theme--documenter-dark .button.is-white.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + html.theme--documenter-dark .button.is-white.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-white.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:hover, html.theme--documenter-dark .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:focus, html.theme--documenter-dark .button.is-black.is-focused { + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:focus:not(:active), html.theme--documenter-dark .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-black.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-black.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-light { + background-color: #ecf0f1; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:hover, html.theme--documenter-dark .button.is-light.is-hovered { + background-color: #e5eaec; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:focus, html.theme--documenter-dark .button.is-light.is-focused { + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:focus:not(:active), html.theme--documenter-dark .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light.is-active { + background-color: #dde4e6; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light { + background-color: #ecf0f1; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-light.is-inverted { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-hovered { + background-color: #1d2122; } + html.theme--documenter-dark .button.is-light.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted { + background-color: #282f2f; + border-color: transparent; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-loading::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-light.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-outlined.is-focused { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-light.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #282f2f; + color: #282f2f; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #282f2f; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark, html.theme--documenter-dark .content kbd.button { + background-color: #282f2f; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover, html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered { + background-color: #232829; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused { + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:focus:not(:active), html.theme--documenter-dark .content kbd.button:focus:not(:active), html.theme--documenter-dark .button.is-dark.is-focused:not(:active), html.theme--documenter-dark .content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active { + background-color: #1d2122; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark[disabled], html.theme--documenter-dark .content kbd.button[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark, fieldset[disabled] html.theme--documenter-dark .content kbd.button { + background-color: #282f2f; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-dark.is-inverted, html.theme--documenter-dark .content kbd.button.is-inverted { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted:hover, html.theme--documenter-dark .content kbd.button.is-inverted:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered { + background-color: #dde4e6; } + html.theme--documenter-dark .button.is-dark.is-inverted[disabled], html.theme--documenter-dark .content kbd.button.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted { + background-color: #ecf0f1; + border-color: transparent; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-loading::after, html.theme--documenter-dark .content kbd.button.is-loading::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-dark.is-outlined, html.theme--documenter-dark .content kbd.button.is-outlined { + background-color: transparent; + border-color: #282f2f; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-outlined.is-focused { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-dark.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined { + background-color: transparent; + border-color: #282f2f; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-primary, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { + background-color: #375a7f; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink { + background-color: #335476; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:focus:not(:active), html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus:not(:active), html.theme--documenter-dark .button.is-primary.is-focused:not(:active), html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink { + background-color: #2f4d6d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary[disabled], html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { + background-color: #375a7f; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-primary.is-inverted, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-primary.is-inverted[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-primary.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #375a7f; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #375a7f; + border-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #375a7f #375a7f !important; } + html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-primary.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #375a7f; + box-shadow: none; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #375a7f #375a7f !important; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-link { + background-color: #1abc9c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:hover, html.theme--documenter-dark .button.is-link.is-hovered { + background-color: #18b193; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:focus, html.theme--documenter-dark .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:focus:not(:active), html.theme--documenter-dark .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link.is-active { + background-color: #17a689; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link { + background-color: #1abc9c; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-link.is-inverted { + background-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-link.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-link.is-outlined { + background-color: transparent; + border-color: #1abc9c; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-outlined.is-focused { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #1abc9c #1abc9c !important; } + html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-link.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined { + background-color: transparent; + border-color: #1abc9c; + box-shadow: none; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #1abc9c #1abc9c !important; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-info { + background-color: #024c7d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:hover, html.theme--documenter-dark .button.is-info.is-hovered { + background-color: #024470; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:focus, html.theme--documenter-dark .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:focus:not(:active), html.theme--documenter-dark .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info.is-active { + background-color: #023d64; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info { + background-color: #024c7d; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-info.is-inverted { + background-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-info.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-info.is-outlined { + background-color: transparent; + border-color: #024c7d; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-outlined.is-focused { + background-color: #024c7d; + border-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #024c7d #024c7d !important; } + html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-info.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined { + background-color: transparent; + border-color: #024c7d; + box-shadow: none; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #024c7d #024c7d !important; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-success { + background-color: #008438; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:hover, html.theme--documenter-dark .button.is-success.is-hovered { + background-color: #007733; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:focus, html.theme--documenter-dark .button.is-success.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:focus:not(:active), html.theme--documenter-dark .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success.is-active { + background-color: #006b2d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success { + background-color: #008438; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-success.is-inverted { + background-color: #fff; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-success.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-success.is-outlined { + background-color: transparent; + border-color: #008438; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-outlined.is-focused { + background-color: #008438; + border-color: #008438; + color: #fff; } + html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #008438 #008438 !important; } + html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-success.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined { + background-color: transparent; + border-color: #008438; + box-shadow: none; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #008438 #008438 !important; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-warning { + background-color: #ad8100; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:hover, html.theme--documenter-dark .button.is-warning.is-hovered { + background-color: #a07700; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:focus, html.theme--documenter-dark .button.is-warning.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:focus:not(:active), html.theme--documenter-dark .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning.is-active { + background-color: #946e00; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning { + background-color: #ad8100; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-warning.is-inverted { + background-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-warning.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ad8100; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-outlined.is-focused { + background-color: #ad8100; + border-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ad8100 #ad8100 !important; } + html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-warning.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ad8100; + box-shadow: none; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ad8100 #ad8100 !important; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-danger { + background-color: #9e1b0d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:hover, html.theme--documenter-dark .button.is-danger.is-hovered { + background-color: #92190c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:focus, html.theme--documenter-dark .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:focus:not(:active), html.theme--documenter-dark .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger.is-active { + background-color: #86170b; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger { + background-color: #9e1b0d; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-danger.is-inverted { + background-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-danger.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-danger.is-outlined { + background-color: transparent; + border-color: #9e1b0d; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-outlined.is-focused { + background-color: #9e1b0d; + border-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #9e1b0d #9e1b0d !important; } + html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-danger.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined { + background-color: transparent; + border-color: #9e1b0d; + box-shadow: none; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #9e1b0d #9e1b0d !important; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .button.is-normal { + font-size: 15px; } + html.theme--documenter-dark .button.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .button.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .button { + background-color: #8c9b9d; + border-color: #dbdee0; + box-shadow: none; + opacity: 0.5; } + html.theme--documenter-dark .button.is-fullwidth { + display: flex; + width: 100%; } + html.theme--documenter-dark .button.is-loading { + color: transparent !important; + pointer-events: none; } + html.theme--documenter-dark .button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; } + html.theme--documenter-dark .button.is-static { + background-color: #282f2f; + border-color: #5e6d6f; + color: #dbdee0; + box-shadow: none; + pointer-events: none; } + html.theme--documenter-dark .button.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .buttons .button { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + html.theme--documenter-dark .buttons:last-child { + margin-bottom: -0.5rem; } + html.theme--documenter-dark .buttons:not(:last-child) { + margin-bottom: 1rem; } + html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + html.theme--documenter-dark .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + html.theme--documenter-dark .buttons.has-addons .button:last-child { + margin-right: 0; } + html.theme--documenter-dark .buttons.has-addons .button:hover, html.theme--documenter-dark .buttons.has-addons .button.is-hovered { + z-index: 2; } + html.theme--documenter-dark .buttons.has-addons .button:focus, html.theme--documenter-dark .buttons.has-addons .button.is-focused, html.theme--documenter-dark .buttons.has-addons .button:active, html.theme--documenter-dark .buttons.has-addons .button.is-active, html.theme--documenter-dark .buttons.has-addons .button.is-selected { + z-index: 3; } + html.theme--documenter-dark .buttons.has-addons .button:focus:hover, html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover, html.theme--documenter-dark .buttons.has-addons .button:active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + html.theme--documenter-dark .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .buttons.is-centered { + justify-content: center; } + html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + html.theme--documenter-dark .buttons.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + html.theme--documenter-dark .container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .container { + max-width: 992px; } + html.theme--documenter-dark .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; } } + @media screen and (max-width: 1215px) { + html.theme--documenter-dark .container.is-widescreen { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + html.theme--documenter-dark .container.is-fullhd { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .container { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .container { + max-width: 1344px; } } + html.theme--documenter-dark .content li + li { + margin-top: 0.25em; } + html.theme--documenter-dark .content p:not(:last-child), + html.theme--documenter-dark .content dl:not(:last-child), + html.theme--documenter-dark .content ol:not(:last-child), + html.theme--documenter-dark .content ul:not(:last-child), + html.theme--documenter-dark .content blockquote:not(:last-child), + html.theme--documenter-dark .content pre:not(:last-child), + html.theme--documenter-dark .content table:not(:last-child) { + margin-bottom: 1em; } + html.theme--documenter-dark .content h1, + html.theme--documenter-dark .content h2, + html.theme--documenter-dark .content h3, + html.theme--documenter-dark .content h4, + html.theme--documenter-dark .content h5, + html.theme--documenter-dark .content h6 { + color: #f2f2f2; + font-weight: 600; + line-height: 1.125; } + html.theme--documenter-dark .content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + html.theme--documenter-dark .content h1:not(:first-child) { + margin-top: 1em; } + html.theme--documenter-dark .content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + html.theme--documenter-dark .content h2:not(:first-child) { + margin-top: 1.1428em; } + html.theme--documenter-dark .content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + html.theme--documenter-dark .content h3:not(:first-child) { + margin-top: 1.3333em; } + html.theme--documenter-dark .content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + html.theme--documenter-dark .content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + html.theme--documenter-dark .content h6 { + font-size: 1em; + margin-bottom: 1em; } + html.theme--documenter-dark .content blockquote { + background-color: #282f2f; + border-left: 5px solid #5e6d6f; + padding: 1.25em 1.5em; } + html.theme--documenter-dark .content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + html.theme--documenter-dark .content ol:not([type]) { + list-style-type: decimal; } + html.theme--documenter-dark .content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; } + html.theme--documenter-dark .content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; } + html.theme--documenter-dark .content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; } + html.theme--documenter-dark .content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; } + html.theme--documenter-dark .content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + html.theme--documenter-dark .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + html.theme--documenter-dark .content ul ul ul { + list-style-type: square; } + html.theme--documenter-dark .content dd { + margin-left: 2em; } + html.theme--documenter-dark .content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + html.theme--documenter-dark .content figure:not(:first-child) { + margin-top: 2em; } + html.theme--documenter-dark .content figure:not(:last-child) { + margin-bottom: 2em; } + html.theme--documenter-dark .content figure img { + display: inline-block; } + html.theme--documenter-dark .content figure figcaption { + font-style: italic; } + html.theme--documenter-dark .content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; } + html.theme--documenter-dark .content sup, + html.theme--documenter-dark .content sub { + font-size: 75%; } + html.theme--documenter-dark .content table { + width: 100%; } + html.theme--documenter-dark .content table td, + html.theme--documenter-dark .content table th { + border: 1px solid #5e6d6f; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + html.theme--documenter-dark .content table th { + color: #f2f2f2; } + html.theme--documenter-dark .content table th:not([align]) { + text-align: left; } + html.theme--documenter-dark .content table thead td, + html.theme--documenter-dark .content table thead th { + border-width: 0 0 2px; + color: #f2f2f2; } + html.theme--documenter-dark .content table tfoot td, + html.theme--documenter-dark .content table tfoot th { + border-width: 2px 0 0; + color: #f2f2f2; } + html.theme--documenter-dark .content table tbody tr:last-child td, + html.theme--documenter-dark .content table tbody tr:last-child th { + border-bottom-width: 0; } + html.theme--documenter-dark .content .tabs li + li { + margin-top: 0; } + html.theme--documenter-dark .content.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.content { + font-size: 0.85em; } + html.theme--documenter-dark .content.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .content.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + html.theme--documenter-dark .icon.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.icon { + height: 1rem; + width: 1rem; } + html.theme--documenter-dark .icon.is-medium { + height: 2rem; + width: 2rem; } + html.theme--documenter-dark .icon.is-large { + height: 3rem; + width: 3rem; } + html.theme--documenter-dark .image, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { + display: block; + position: relative; } + html.theme--documenter-dark .image img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img { + display: block; + height: auto; + width: 100%; } + html.theme--documenter-dark .image img.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img.is-rounded { + border-radius: 290486px; } + html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, + html.theme--documenter-dark .image.is-square .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, + html.theme--documenter-dark .image.is-1by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, + html.theme--documenter-dark .image.is-5by4 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, + html.theme--documenter-dark .image.is-4by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, + html.theme--documenter-dark .image.is-3by2 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, + html.theme--documenter-dark .image.is-5by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, + html.theme--documenter-dark .image.is-16by9 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, + html.theme--documenter-dark .image.is-2by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, + html.theme--documenter-dark .image.is-3by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, + html.theme--documenter-dark .image.is-4by5 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, + html.theme--documenter-dark .image.is-3by4 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, + html.theme--documenter-dark .image.is-2by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, + html.theme--documenter-dark .image.is-3by5 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, + html.theme--documenter-dark .image.is-9by16 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, + html.theme--documenter-dark .image.is-1by2 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, + html.theme--documenter-dark .image.is-1by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + html.theme--documenter-dark .image.is-square, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square, html.theme--documenter-dark .image.is-1by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 { + padding-top: 100%; } + html.theme--documenter-dark .image.is-5by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 { + padding-top: 80%; } + html.theme--documenter-dark .image.is-4by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 { + padding-top: 75%; } + html.theme--documenter-dark .image.is-3by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 { + padding-top: 66.6666%; } + html.theme--documenter-dark .image.is-5by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 { + padding-top: 60%; } + html.theme--documenter-dark .image.is-16by9, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 { + padding-top: 56.25%; } + html.theme--documenter-dark .image.is-2by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 { + padding-top: 50%; } + html.theme--documenter-dark .image.is-3by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 { + padding-top: 33.3333%; } + html.theme--documenter-dark .image.is-4by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 { + padding-top: 125%; } + html.theme--documenter-dark .image.is-3by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 { + padding-top: 133.3333%; } + html.theme--documenter-dark .image.is-2by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 { + padding-top: 150%; } + html.theme--documenter-dark .image.is-3by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 { + padding-top: 166.6666%; } + html.theme--documenter-dark .image.is-9by16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 { + padding-top: 177.7777%; } + html.theme--documenter-dark .image.is-1by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 { + padding-top: 200%; } + html.theme--documenter-dark .image.is-1by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 { + padding-top: 300%; } + html.theme--documenter-dark .image.is-16x16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16x16 { + height: 16px; + width: 16px; } + html.theme--documenter-dark .image.is-24x24, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-24x24 { + height: 24px; + width: 24px; } + html.theme--documenter-dark .image.is-32x32, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-32x32 { + height: 32px; + width: 32px; } + html.theme--documenter-dark .image.is-48x48, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-48x48 { + height: 48px; + width: 48px; } + html.theme--documenter-dark .image.is-64x64, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-64x64 { + height: 64px; + width: 64px; } + html.theme--documenter-dark .image.is-96x96, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-96x96 { + height: 96px; + width: 96px; } + html.theme--documenter-dark .image.is-128x128, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-128x128 { + height: 128px; + width: 128px; } + html.theme--documenter-dark .notification { + background-color: #282f2f; + border-radius: 0.4em; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; } + html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + html.theme--documenter-dark .notification strong { + color: currentColor; } + html.theme--documenter-dark .notification code, + html.theme--documenter-dark .notification pre { + background: white; } + html.theme--documenter-dark .notification pre code { + background: transparent; } + html.theme--documenter-dark .notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; } + html.theme--documenter-dark .notification .title, + html.theme--documenter-dark .notification .subtitle, + html.theme--documenter-dark .notification .content { + color: currentColor; } + html.theme--documenter-dark .notification.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .notification.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .notification.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .notification.is-dark, html.theme--documenter-dark .content kbd.notification { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .notification.is-primary, html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .notification.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .notification.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .notification.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .notification.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .notification.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 15px; + overflow: hidden; + padding: 0; + width: 100%; } + html.theme--documenter-dark .progress::-webkit-progress-bar { + background-color: #5e6d6f; } + html.theme--documenter-dark .progress::-webkit-progress-value { + background-color: #dbdee0; } + html.theme--documenter-dark .progress::-moz-progress-bar { + background-color: #dbdee0; } + html.theme--documenter-dark .progress::-ms-fill { + background-color: #dbdee0; + border: none; } + html.theme--documenter-dark .progress.is-white::-webkit-progress-value { + background-color: white; } + html.theme--documenter-dark .progress.is-white::-moz-progress-bar { + background-color: white; } + html.theme--documenter-dark .progress.is-white::-ms-fill { + background-color: white; } + html.theme--documenter-dark .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-light::-webkit-progress-value { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light::-moz-progress-bar { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light::-ms-fill { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light:indeterminate { + background-image: linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-dark::-webkit-progress-value, html.theme--documenter-dark .content kbd.progress::-webkit-progress-value { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark::-moz-progress-bar, html.theme--documenter-dark .content kbd.progress::-moz-progress-bar { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark::-ms-fill, html.theme--documenter-dark .content kbd.progress::-ms-fill { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark:indeterminate, html.theme--documenter-dark .content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #282f2f 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-primary::-webkit-progress-value, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary::-moz-progress-bar, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary::-ms-fill, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-ms-fill { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary:indeterminate, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #375a7f 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-link::-webkit-progress-value { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link::-moz-progress-bar { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link::-ms-fill { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-info::-webkit-progress-value { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info::-moz-progress-bar { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info::-ms-fill { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #024c7d 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-success::-webkit-progress-value { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success::-moz-progress-bar { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success::-ms-fill { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #008438 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-warning::-webkit-progress-value { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning::-moz-progress-bar { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning::-ms-fill { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ad8100 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-danger::-webkit-progress-value { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger::-moz-progress-bar { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger::-ms-fill { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #5e6d6f; + background-image: linear-gradient(to right, #fff 30%, #5e6d6f 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + html.theme--documenter-dark .progress.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.progress { + height: 0.85em; } + html.theme--documenter-dark .progress.is-medium { + height: 1.25rem; } + html.theme--documenter-dark .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + html.theme--documenter-dark .table { + background-color: #343c3d; + color: #fff; } + html.theme--documenter-dark .table td, + html.theme--documenter-dark .table th { + border: 1px solid #5e6d6f; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + html.theme--documenter-dark .table td.is-white, + html.theme--documenter-dark .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .table td.is-black, + html.theme--documenter-dark .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .table td.is-light, + html.theme--documenter-dark .table th.is-light { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .table td.is-dark, + html.theme--documenter-dark .table th.is-dark { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .table td.is-primary, + html.theme--documenter-dark .table th.is-primary { + background-color: #375a7f; + border-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table td.is-link, + html.theme--documenter-dark .table th.is-link { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .table td.is-info, + html.theme--documenter-dark .table th.is-info { + background-color: #024c7d; + border-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .table td.is-success, + html.theme--documenter-dark .table th.is-success { + background-color: #008438; + border-color: #008438; + color: #fff; } + html.theme--documenter-dark .table td.is-warning, + html.theme--documenter-dark .table th.is-warning { + background-color: #ad8100; + border-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .table td.is-danger, + html.theme--documenter-dark .table th.is-danger { + background-color: #9e1b0d; + border-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .table td.is-narrow, + html.theme--documenter-dark .table th.is-narrow { + white-space: nowrap; + width: 1%; } + html.theme--documenter-dark .table td.is-selected, + html.theme--documenter-dark .table th.is-selected { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table td.is-selected a, + html.theme--documenter-dark .table td.is-selected strong, + html.theme--documenter-dark .table th.is-selected a, + html.theme--documenter-dark .table th.is-selected strong { + color: currentColor; } + html.theme--documenter-dark .table th { + color: #f2f2f2; } + html.theme--documenter-dark .table th:not([align]) { + text-align: left; } + html.theme--documenter-dark .table tr.is-selected { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table tr.is-selected a, + html.theme--documenter-dark .table tr.is-selected strong { + color: currentColor; } + html.theme--documenter-dark .table tr.is-selected td, + html.theme--documenter-dark .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + html.theme--documenter-dark .table thead { + background-color: transparent; } + html.theme--documenter-dark .table thead td, + html.theme--documenter-dark .table thead th { + border-width: 0 0 2px; + color: #f2f2f2; } + html.theme--documenter-dark .table tfoot { + background-color: transparent; } + html.theme--documenter-dark .table tfoot td, + html.theme--documenter-dark .table tfoot th { + border-width: 2px 0 0; + color: #f2f2f2; } + html.theme--documenter-dark .table tbody { + background-color: transparent; } + html.theme--documenter-dark .table tbody tr:last-child td, + html.theme--documenter-dark .table tbody tr:last-child th { + border-bottom-width: 0; } + html.theme--documenter-dark .table.is-bordered td, + html.theme--documenter-dark .table.is-bordered th { + border-width: 1px; } + html.theme--documenter-dark .table.is-bordered tr:last-child td, + html.theme--documenter-dark .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + html.theme--documenter-dark .table.is-fullwidth { + width: 100%; } + html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #282f2f; } + html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #282f2f; } + html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #2d3435; } + html.theme--documenter-dark .table.is-narrow td, + html.theme--documenter-dark .table.is-narrow th { + padding: 0.25em 0.5em; } + html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #282f2f; } + html.theme--documenter-dark .table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + html.theme--documenter-dark .tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .tags .tag, html.theme--documenter-dark .tags .content kbd, html.theme--documenter-dark .content .tags kbd, html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .tags .tag:not(:last-child), html.theme--documenter-dark .tags .content kbd:not(:last-child), html.theme--documenter-dark .content .tags kbd:not(:last-child), html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; } + html.theme--documenter-dark .tags:last-child { + margin-bottom: -0.5rem; } + html.theme--documenter-dark .tags:not(:last-child) { + margin-bottom: 1rem; } + html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 15px; } + html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + html.theme--documenter-dark .tags.is-centered { + justify-content: center; } + html.theme--documenter-dark .tags.is-centered .tag, html.theme--documenter-dark .tags.is-centered .content kbd, html.theme--documenter-dark .content .tags.is-centered kbd, html.theme--documenter-dark .tags.is-centered .docstring > section > a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; } + html.theme--documenter-dark .tags.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .tags.is-right .tag:not(:first-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; } + html.theme--documenter-dark .tags.is-right .tag:not(:last-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0; } + html.theme--documenter-dark .tags.has-addons .tag, html.theme--documenter-dark .tags.has-addons .content kbd, html.theme--documenter-dark .content .tags.has-addons kbd, html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink { + margin-right: 0; } + html.theme--documenter-dark .tags.has-addons .tag:not(:first-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .tags.has-addons .tag:not(:last-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .tag:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { + align-items: center; + background-color: #282f2f; + border-radius: 0.4em; + color: #fff; + display: inline-flex; + font-size: 0.85em; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + html.theme--documenter-dark .tag:not(body) .delete, html.theme--documenter-dark .content kbd:not(body) .delete, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + html.theme--documenter-dark .tag.is-white:not(body), html.theme--documenter-dark .content kbd.is-white:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-white:not(body) { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .tag.is-black:not(body), html.theme--documenter-dark .content kbd.is-black:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .tag.is-light:not(body), html.theme--documenter-dark .content kbd.is-light:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-light:not(body) { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .tag.is-dark:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-dark:not(body), html.theme--documenter-dark .content .docstring > section > kbd:not(body) { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .tag.is-primary:not(body), html.theme--documenter-dark .content kbd.is-primary:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .tag.is-link:not(body), html.theme--documenter-dark .content kbd.is-link:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-link:not(body) { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .tag.is-info:not(body), html.theme--documenter-dark .content kbd.is-info:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-info:not(body) { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .tag.is-success:not(body), html.theme--documenter-dark .content kbd.is-success:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-success:not(body) { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .tag.is-warning:not(body), html.theme--documenter-dark .content kbd.is-warning:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-warning:not(body) { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .tag.is-danger:not(body), html.theme--documenter-dark .content kbd.is-danger:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-danger:not(body) { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .tag.is-normal:not(body), html.theme--documenter-dark .content kbd.is-normal:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-normal:not(body) { + font-size: 0.85em; } + html.theme--documenter-dark .tag.is-medium:not(body), html.theme--documenter-dark .content kbd.is-medium:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-medium:not(body) { + font-size: 15px; } + html.theme--documenter-dark .tag.is-large:not(body), html.theme--documenter-dark .content kbd.is-large:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; } + html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child, html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + html.theme--documenter-dark .tag.is-delete:not(body), html.theme--documenter-dark .content kbd.is-delete:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; } + html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; } + html.theme--documenter-dark .tag.is-delete:not(body):hover, html.theme--documenter-dark .content kbd.is-delete:not(body):hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, html.theme--documenter-dark .tag.is-delete:not(body):focus, html.theme--documenter-dark .content kbd.is-delete:not(body):focus, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { + background-color: #1d2122; } + html.theme--documenter-dark .tag.is-delete:not(body):active, html.theme--documenter-dark .content kbd.is-delete:not(body):active, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):active { + background-color: #111414; } + html.theme--documenter-dark .tag.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:not(body), html.theme--documenter-dark .content kbd.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; } + html.theme--documenter-dark a.tag:hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:hover { + text-decoration: underline; } + html.theme--documenter-dark .title, + html.theme--documenter-dark .subtitle { + word-break: break-word; } + html.theme--documenter-dark .title em, + html.theme--documenter-dark .title span, + html.theme--documenter-dark .subtitle em, + html.theme--documenter-dark .subtitle span { + font-weight: inherit; } + html.theme--documenter-dark .title sub, + html.theme--documenter-dark .subtitle sub { + font-size: 0.75em; } + html.theme--documenter-dark .title sup, + html.theme--documenter-dark .subtitle sup { + font-size: 0.75em; } + html.theme--documenter-dark .title .tag, html.theme--documenter-dark .title .content kbd, html.theme--documenter-dark .content .title kbd, html.theme--documenter-dark .title .docstring > section > a.docs-sourcelink, + html.theme--documenter-dark .subtitle .tag, + html.theme--documenter-dark .subtitle .content kbd, + html.theme--documenter-dark .content .subtitle kbd, + html.theme--documenter-dark .subtitle .docstring > section > a.docs-sourcelink { + vertical-align: middle; } + html.theme--documenter-dark .title { + color: #fff; + font-size: 2rem; + font-weight: 500; + line-height: 1.125; } + html.theme--documenter-dark .title strong { + color: inherit; + font-weight: inherit; } + html.theme--documenter-dark .title + .highlight { + margin-top: -0.75rem; } + html.theme--documenter-dark .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + html.theme--documenter-dark .title.is-1 { + font-size: 3rem; } + html.theme--documenter-dark .title.is-2 { + font-size: 2.5rem; } + html.theme--documenter-dark .title.is-3 { + font-size: 2rem; } + html.theme--documenter-dark .title.is-4 { + font-size: 1.5rem; } + html.theme--documenter-dark .title.is-5 { + font-size: 1.25rem; } + html.theme--documenter-dark .title.is-6 { + font-size: 15px; } + html.theme--documenter-dark .title.is-7 { + font-size: 0.85em; } + html.theme--documenter-dark .subtitle { + color: #8c9b9d; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + html.theme--documenter-dark .subtitle strong { + color: #8c9b9d; + font-weight: 600; } + html.theme--documenter-dark .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + html.theme--documenter-dark .subtitle.is-1 { + font-size: 3rem; } + html.theme--documenter-dark .subtitle.is-2 { + font-size: 2.5rem; } + html.theme--documenter-dark .subtitle.is-3 { + font-size: 2rem; } + html.theme--documenter-dark .subtitle.is-4 { + font-size: 1.5rem; } + html.theme--documenter-dark .subtitle.is-5 { + font-size: 1.25rem; } + html.theme--documenter-dark .subtitle.is-6 { + font-size: 15px; } + html.theme--documenter-dark .subtitle.is-7 { + font-size: 0.85em; } + html.theme--documenter-dark .heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + html.theme--documenter-dark .highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; } + html.theme--documenter-dark .highlight pre { + overflow: auto; + max-width: 100%; } + html.theme--documenter-dark .number { + align-items: center; + background-color: #282f2f; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + background-color: #1f2424; + border-color: #5e6d6f; + border-radius: 0.4em; + color: #dbdee0; } + html.theme--documenter-dark .select select::-moz-placeholder, html.theme--documenter-dark .textarea::-moz-placeholder, html.theme--documenter-dark .input::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select::-webkit-input-placeholder, html.theme--documenter-dark .textarea::-webkit-input-placeholder, html.theme--documenter-dark .input::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:-moz-placeholder, html.theme--documenter-dark .textarea:-moz-placeholder, html.theme--documenter-dark .input:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:-ms-input-placeholder, html.theme--documenter-dark .textarea:-ms-input-placeholder, html.theme--documenter-dark .input:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:hover, html.theme--documenter-dark .textarea:hover, html.theme--documenter-dark .input:hover, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:hover, html.theme--documenter-dark .select select.is-hovered, html.theme--documenter-dark .is-hovered.textarea, html.theme--documenter-dark .is-hovered.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-hovered { + border-color: #8c9b9d; } + html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + border-color: #1abc9c; + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + background-color: #8c9b9d; + border-color: #282f2f; + box-shadow: none; + color: white; } + html.theme--documenter-dark .select select[disabled]::-moz-placeholder, html.theme--documenter-dark .textarea[disabled]::-moz-placeholder, html.theme--documenter-dark .input[disabled]::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]:-moz-placeholder, html.theme--documenter-dark .textarea[disabled]:-moz-placeholder, html.theme--documenter-dark .input[disabled]:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder, html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder, html.theme--documenter-dark .input[disabled]:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; } + html.theme--documenter-dark .textarea[readonly], html.theme--documenter-dark .input[readonly], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[readonly] { + box-shadow: none; } + html.theme--documenter-dark .is-white.textarea, html.theme--documenter-dark .is-white.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white { + border-color: white; } + html.theme--documenter-dark .is-white.textarea:focus, html.theme--documenter-dark .is-white.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:focus, html.theme--documenter-dark .is-white.is-focused.textarea, html.theme--documenter-dark .is-white.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-white.textarea:active, html.theme--documenter-dark .is-white.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:active, html.theme--documenter-dark .is-white.is-active.textarea, html.theme--documenter-dark .is-white.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .is-black.textarea, html.theme--documenter-dark .is-black.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black { + border-color: #0a0a0a; } + html.theme--documenter-dark .is-black.textarea:focus, html.theme--documenter-dark .is-black.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:focus, html.theme--documenter-dark .is-black.is-focused.textarea, html.theme--documenter-dark .is-black.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-black.textarea:active, html.theme--documenter-dark .is-black.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:active, html.theme--documenter-dark .is-black.is-active.textarea, html.theme--documenter-dark .is-black.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .is-light.textarea, html.theme--documenter-dark .is-light.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light { + border-color: #ecf0f1; } + html.theme--documenter-dark .is-light.textarea:focus, html.theme--documenter-dark .is-light.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:focus, html.theme--documenter-dark .is-light.is-focused.textarea, html.theme--documenter-dark .is-light.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-light.textarea:active, html.theme--documenter-dark .is-light.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:active, html.theme--documenter-dark .is-light.is-active.textarea, html.theme--documenter-dark .is-light.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .is-dark.textarea, html.theme--documenter-dark .content kbd.textarea, html.theme--documenter-dark .is-dark.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark, html.theme--documenter-dark .content kbd.input { + border-color: #282f2f; } + html.theme--documenter-dark .is-dark.textarea:focus, html.theme--documenter-dark .content kbd.textarea:focus, html.theme--documenter-dark .is-dark.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:focus, html.theme--documenter-dark .content kbd.input:focus, html.theme--documenter-dark .is-dark.is-focused.textarea, html.theme--documenter-dark .content kbd.is-focused.textarea, html.theme--documenter-dark .is-dark.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .content kbd.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-focused, html.theme--documenter-dark .is-dark.textarea:active, html.theme--documenter-dark .content kbd.textarea:active, html.theme--documenter-dark .is-dark.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:active, html.theme--documenter-dark .content kbd.input:active, html.theme--documenter-dark .is-dark.is-active.textarea, html.theme--documenter-dark .content kbd.is-active.textarea, html.theme--documenter-dark .is-dark.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .content kbd.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .is-primary.textarea, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink { + border-color: #375a7f; } + html.theme--documenter-dark .is-primary.textarea:focus, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:focus, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.is-focused.textarea, html.theme--documenter-dark .docstring > section > a.is-focused.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .docstring > section > a.is-focused.input.docs-sourcelink, html.theme--documenter-dark .is-primary.textarea:active, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:active, html.theme--documenter-dark .is-primary.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:active, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:active, html.theme--documenter-dark .is-primary.is-active.textarea, html.theme--documenter-dark .docstring > section > a.is-active.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .docstring > section > a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .is-link.textarea, html.theme--documenter-dark .is-link.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link { + border-color: #1abc9c; } + html.theme--documenter-dark .is-link.textarea:focus, html.theme--documenter-dark .is-link.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:focus, html.theme--documenter-dark .is-link.is-focused.textarea, html.theme--documenter-dark .is-link.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-link.textarea:active, html.theme--documenter-dark .is-link.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:active, html.theme--documenter-dark .is-link.is-active.textarea, html.theme--documenter-dark .is-link.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .is-info.textarea, html.theme--documenter-dark .is-info.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info { + border-color: #024c7d; } + html.theme--documenter-dark .is-info.textarea:focus, html.theme--documenter-dark .is-info.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:focus, html.theme--documenter-dark .is-info.is-focused.textarea, html.theme--documenter-dark .is-info.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-info.textarea:active, html.theme--documenter-dark .is-info.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:active, html.theme--documenter-dark .is-info.is-active.textarea, html.theme--documenter-dark .is-info.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .is-success.textarea, html.theme--documenter-dark .is-success.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success { + border-color: #008438; } + html.theme--documenter-dark .is-success.textarea:focus, html.theme--documenter-dark .is-success.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:focus, html.theme--documenter-dark .is-success.is-focused.textarea, html.theme--documenter-dark .is-success.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-success.textarea:active, html.theme--documenter-dark .is-success.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:active, html.theme--documenter-dark .is-success.is-active.textarea, html.theme--documenter-dark .is-success.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .is-warning.textarea, html.theme--documenter-dark .is-warning.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning { + border-color: #ad8100; } + html.theme--documenter-dark .is-warning.textarea:focus, html.theme--documenter-dark .is-warning.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:focus, html.theme--documenter-dark .is-warning.is-focused.textarea, html.theme--documenter-dark .is-warning.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-warning.textarea:active, html.theme--documenter-dark .is-warning.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:active, html.theme--documenter-dark .is-warning.is-active.textarea, html.theme--documenter-dark .is-warning.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .is-danger.textarea, html.theme--documenter-dark .is-danger.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger { + border-color: #9e1b0d; } + html.theme--documenter-dark .is-danger.textarea:focus, html.theme--documenter-dark .is-danger.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:focus, html.theme--documenter-dark .is-danger.is-focused.textarea, html.theme--documenter-dark .is-danger.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-danger.textarea:active, html.theme--documenter-dark .is-danger.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:active, html.theme--documenter-dark .is-danger.is-active.textarea, html.theme--documenter-dark .is-danger.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .is-small.textarea, html.theme--documenter-dark .is-small.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .is-medium.textarea, html.theme--documenter-dark .is-medium.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .is-large.textarea, html.theme--documenter-dark .is-large.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .is-fullwidth.textarea, html.theme--documenter-dark .is-fullwidth.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-fullwidth { + display: block; + width: 100%; } + html.theme--documenter-dark .is-inline.textarea, html.theme--documenter-dark .is-inline.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-inline { + display: inline; + width: auto; } + html.theme--documenter-dark .input.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .input.is-static, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + html.theme--documenter-dark .textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; } + html.theme--documenter-dark .textarea:not([rows]) { + max-height: 600px; + min-height: 120px; } + html.theme--documenter-dark .textarea[rows] { + height: initial; } + html.theme--documenter-dark .textarea.has-fixed-size { + resize: none; } + html.theme--documenter-dark .radio, html.theme--documenter-dark .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + html.theme--documenter-dark .radio input, html.theme--documenter-dark .checkbox input { + cursor: pointer; } + html.theme--documenter-dark .radio:hover, html.theme--documenter-dark .checkbox:hover { + color: #8c9b9d; } + html.theme--documenter-dark .radio[disabled], html.theme--documenter-dark .checkbox[disabled], fieldset[disabled] html.theme--documenter-dark .radio, fieldset[disabled] html.theme--documenter-dark .checkbox { + color: white; + cursor: not-allowed; } + html.theme--documenter-dark .radio + .radio { + margin-left: 0.5em; } + html.theme--documenter-dark .select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + html.theme--documenter-dark .select:not(.is-multiple) { + height: 2.25em; } + html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { + border-color: #1abc9c; + right: 1.125em; + z-index: 4; } + html.theme--documenter-dark .select.is-rounded select, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select select { + border-radius: 290486px; + padding-left: 1em; } + html.theme--documenter-dark .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + html.theme--documenter-dark .select select::-ms-expand { + display: none; } + html.theme--documenter-dark .select select[disabled]:hover, fieldset[disabled] html.theme--documenter-dark .select select:hover { + border-color: #282f2f; } + html.theme--documenter-dark .select select:not([multiple]) { + padding-right: 2.5em; } + html.theme--documenter-dark .select select[multiple] { + height: auto; + padding: 0; } + html.theme--documenter-dark .select select[multiple] option { + padding: 0.5em 1em; } + html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #8c9b9d; } + html.theme--documenter-dark .select.is-white:not(:hover)::after { + border-color: white; } + html.theme--documenter-dark .select.is-white select { + border-color: white; } + html.theme--documenter-dark .select.is-white select:hover, html.theme--documenter-dark .select.is-white select.is-hovered { + border-color: #f2f2f2; } + html.theme--documenter-dark .select.is-white select:focus, html.theme--documenter-dark .select.is-white select.is-focused, html.theme--documenter-dark .select.is-white select:active, html.theme--documenter-dark .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .select.is-black select { + border-color: #0a0a0a; } + html.theme--documenter-dark .select.is-black select:hover, html.theme--documenter-dark .select.is-black select.is-hovered { + border-color: black; } + html.theme--documenter-dark .select.is-black select:focus, html.theme--documenter-dark .select.is-black select.is-focused, html.theme--documenter-dark .select.is-black select:active, html.theme--documenter-dark .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .select.is-light:not(:hover)::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .select.is-light select { + border-color: #ecf0f1; } + html.theme--documenter-dark .select.is-light select:hover, html.theme--documenter-dark .select.is-light select.is-hovered { + border-color: #dde4e6; } + html.theme--documenter-dark .select.is-light select:focus, html.theme--documenter-dark .select.is-light select.is-focused, html.theme--documenter-dark .select.is-light select:active, html.theme--documenter-dark .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .select.is-dark:not(:hover)::after, html.theme--documenter-dark .content kbd.select:not(:hover)::after { + border-color: #282f2f; } + html.theme--documenter-dark .select.is-dark select, html.theme--documenter-dark .content kbd.select select { + border-color: #282f2f; } + html.theme--documenter-dark .select.is-dark select:hover, html.theme--documenter-dark .content kbd.select select:hover, html.theme--documenter-dark .select.is-dark select.is-hovered, html.theme--documenter-dark .content kbd.select select.is-hovered { + border-color: #1d2122; } + html.theme--documenter-dark .select.is-dark select:focus, html.theme--documenter-dark .content kbd.select select:focus, html.theme--documenter-dark .select.is-dark select.is-focused, html.theme--documenter-dark .content kbd.select select.is-focused, html.theme--documenter-dark .select.is-dark select:active, html.theme--documenter-dark .content kbd.select select:active, html.theme--documenter-dark .select.is-dark select.is-active, html.theme--documenter-dark .content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .select.is-primary:not(:hover)::after, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink:not(:hover)::after { + border-color: #375a7f; } + html.theme--documenter-dark .select.is-primary select, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select { + border-color: #375a7f; } + html.theme--documenter-dark .select.is-primary select:hover, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:hover, html.theme--documenter-dark .select.is-primary select.is-hovered, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-hovered { + border-color: #2f4d6d; } + html.theme--documenter-dark .select.is-primary select:focus, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:focus, html.theme--documenter-dark .select.is-primary select.is-focused, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-focused, html.theme--documenter-dark .select.is-primary select:active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:active, html.theme--documenter-dark .select.is-primary select.is-active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .select.is-link:not(:hover)::after { + border-color: #1abc9c; } + html.theme--documenter-dark .select.is-link select { + border-color: #1abc9c; } + html.theme--documenter-dark .select.is-link select:hover, html.theme--documenter-dark .select.is-link select.is-hovered { + border-color: #17a689; } + html.theme--documenter-dark .select.is-link select:focus, html.theme--documenter-dark .select.is-link select.is-focused, html.theme--documenter-dark .select.is-link select:active, html.theme--documenter-dark .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .select.is-info:not(:hover)::after { + border-color: #024c7d; } + html.theme--documenter-dark .select.is-info select { + border-color: #024c7d; } + html.theme--documenter-dark .select.is-info select:hover, html.theme--documenter-dark .select.is-info select.is-hovered { + border-color: #023d64; } + html.theme--documenter-dark .select.is-info select:focus, html.theme--documenter-dark .select.is-info select.is-focused, html.theme--documenter-dark .select.is-info select:active, html.theme--documenter-dark .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .select.is-success:not(:hover)::after { + border-color: #008438; } + html.theme--documenter-dark .select.is-success select { + border-color: #008438; } + html.theme--documenter-dark .select.is-success select:hover, html.theme--documenter-dark .select.is-success select.is-hovered { + border-color: #006b2d; } + html.theme--documenter-dark .select.is-success select:focus, html.theme--documenter-dark .select.is-success select.is-focused, html.theme--documenter-dark .select.is-success select:active, html.theme--documenter-dark .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .select.is-warning:not(:hover)::after { + border-color: #ad8100; } + html.theme--documenter-dark .select.is-warning select { + border-color: #ad8100; } + html.theme--documenter-dark .select.is-warning select:hover, html.theme--documenter-dark .select.is-warning select.is-hovered { + border-color: #946e00; } + html.theme--documenter-dark .select.is-warning select:focus, html.theme--documenter-dark .select.is-warning select.is-focused, html.theme--documenter-dark .select.is-warning select:active, html.theme--documenter-dark .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .select.is-danger:not(:hover)::after { + border-color: #9e1b0d; } + html.theme--documenter-dark .select.is-danger select { + border-color: #9e1b0d; } + html.theme--documenter-dark .select.is-danger select:hover, html.theme--documenter-dark .select.is-danger select.is-hovered { + border-color: #86170b; } + html.theme--documenter-dark .select.is-danger select:focus, html.theme--documenter-dark .select.is-danger select.is-focused, html.theme--documenter-dark .select.is-danger select:active, html.theme--documenter-dark .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .select.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .select.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .select.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .select.is-disabled::after { + border-color: white; } + html.theme--documenter-dark .select.is-fullwidth { + width: 100%; } + html.theme--documenter-dark .select.is-fullwidth select { + width: 100%; } + html.theme--documenter-dark .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + html.theme--documenter-dark .select.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.85em; } + html.theme--documenter-dark .select.is-loading.is-medium:after { + font-size: 1.25rem; } + html.theme--documenter-dark .select.is-loading.is-large:after { + font-size: 1.5rem; } + html.theme--documenter-dark .file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + html.theme--documenter-dark .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:hover .file-cta, html.theme--documenter-dark .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:focus .file-cta, html.theme--documenter-dark .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:active .file-cta, html.theme--documenter-dark .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-black:hover .file-cta, html.theme--documenter-dark .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-black:focus .file-cta, html.theme--documenter-dark .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + html.theme--documenter-dark .file.is-black:active .file-cta, html.theme--documenter-dark .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-light .file-cta { + background-color: #ecf0f1; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-light:hover .file-cta, html.theme--documenter-dark .file.is-light.is-hovered .file-cta { + background-color: #e5eaec; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-light:focus .file-cta, html.theme--documenter-dark .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(236, 240, 241, 0.25); + color: #282f2f; } + html.theme--documenter-dark .file.is-light:active .file-cta, html.theme--documenter-dark .file.is-light.is-active .file-cta { + background-color: #dde4e6; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-dark .file-cta, html.theme--documenter-dark .content kbd.file .file-cta { + background-color: #282f2f; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:hover .file-cta, html.theme--documenter-dark .content kbd.file:hover .file-cta, html.theme--documenter-dark .file.is-dark.is-hovered .file-cta, html.theme--documenter-dark .content kbd.file.is-hovered .file-cta { + background-color: #232829; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:focus .file-cta, html.theme--documenter-dark .content kbd.file:focus .file-cta, html.theme--documenter-dark .file.is-dark.is-focused .file-cta, html.theme--documenter-dark .content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(40, 47, 47, 0.25); + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:active .file-cta, html.theme--documenter-dark .content kbd.file:active .file-cta, html.theme--documenter-dark .file.is-dark.is-active .file-cta, html.theme--documenter-dark .content kbd.file.is-active .file-cta { + background-color: #1d2122; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-primary .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink .file-cta { + background-color: #375a7f; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-primary:hover .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:hover .file-cta, html.theme--documenter-dark .file.is-primary.is-hovered .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #335476; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-primary:focus .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:focus .file-cta, html.theme--documenter-dark .file.is-primary.is-focused .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(55, 90, 127, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-primary:active .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:active .file-cta, html.theme--documenter-dark .file.is-primary.is-active .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-active.docs-sourcelink .file-cta { + background-color: #2f4d6d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link .file-cta { + background-color: #1abc9c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link:hover .file-cta, html.theme--documenter-dark .file.is-link.is-hovered .file-cta { + background-color: #18b193; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link:focus .file-cta, html.theme--documenter-dark .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(26, 188, 156, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-link:active .file-cta, html.theme--documenter-dark .file.is-link.is-active .file-cta { + background-color: #17a689; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info .file-cta { + background-color: #024c7d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info:hover .file-cta, html.theme--documenter-dark .file.is-info.is-hovered .file-cta { + background-color: #024470; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info:focus .file-cta, html.theme--documenter-dark .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(2, 76, 125, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-info:active .file-cta, html.theme--documenter-dark .file.is-info.is-active .file-cta { + background-color: #023d64; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success .file-cta { + background-color: #008438; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success:hover .file-cta, html.theme--documenter-dark .file.is-success.is-hovered .file-cta { + background-color: #007733; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success:focus .file-cta, html.theme--documenter-dark .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0, 132, 56, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-success:active .file-cta, html.theme--documenter-dark .file.is-success.is-active .file-cta { + background-color: #006b2d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning .file-cta { + background-color: #ad8100; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning:hover .file-cta, html.theme--documenter-dark .file.is-warning.is-hovered .file-cta { + background-color: #a07700; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning:focus .file-cta, html.theme--documenter-dark .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(173, 129, 0, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-warning:active .file-cta, html.theme--documenter-dark .file.is-warning.is-active .file-cta { + background-color: #946e00; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger .file-cta { + background-color: #9e1b0d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger:hover .file-cta, html.theme--documenter-dark .file.is-danger.is-hovered .file-cta { + background-color: #92190c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger:focus .file-cta, html.theme--documenter-dark .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(158, 27, 13, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-danger:active .file-cta, html.theme--documenter-dark .file.is-danger.is-active .file-cta { + background-color: #86170b; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.file { + font-size: 0.85em; } + html.theme--documenter-dark .file.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .file.is-medium .file-icon .fa { + font-size: 21px; } + html.theme--documenter-dark .file.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .file.is-large .file-icon .fa { + font-size: 28px; } + html.theme--documenter-dark .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .file.has-name.is-empty .file-cta { + border-radius: 0.4em; } + html.theme--documenter-dark .file.has-name.is-empty .file-name { + display: none; } + html.theme--documenter-dark .file.is-boxed .file-label { + flex-direction: column; } + html.theme--documenter-dark .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + html.theme--documenter-dark .file.is-boxed .file-name { + border-width: 0 1px 1px; } + html.theme--documenter-dark .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + html.theme--documenter-dark .file.is-boxed .file-icon .fa { + font-size: 21px; } + html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { + font-size: 14px; } + html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + html.theme--documenter-dark .file.is-boxed.has-name .file-cta { + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .file.is-boxed.has-name .file-name { + border-radius: 0 0 0.4em 0.4em; + border-width: 0 1px 1px; } + html.theme--documenter-dark .file.is-centered { + justify-content: center; } + html.theme--documenter-dark .file.is-fullwidth .file-label { + width: 100%; } + html.theme--documenter-dark .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + html.theme--documenter-dark .file.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .file.is-right .file-cta { + border-radius: 0 0.4em 0.4em 0; } + html.theme--documenter-dark .file.is-right .file-name { + border-radius: 0.4em 0 0 0.4em; + border-width: 1px 0 1px 1px; + order: -1; } + html.theme--documenter-dark .file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + html.theme--documenter-dark .file-label:hover .file-cta { + background-color: #e5eaec; + color: #282f2f; } + html.theme--documenter-dark .file-label:hover .file-name { + border-color: #596668; } + html.theme--documenter-dark .file-label:active .file-cta { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .file-label:active .file-name { + border-color: #535f61; } + html.theme--documenter-dark .file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + html.theme--documenter-dark .file-cta, + html.theme--documenter-dark .file-name { + border-color: #5e6d6f; + border-radius: 0.4em; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + html.theme--documenter-dark .file-cta { + background-color: #ecf0f1; + color: #343c3d; } + html.theme--documenter-dark .file-name { + border-color: #5e6d6f; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; } + html.theme--documenter-dark .file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + html.theme--documenter-dark .file-icon .fa { + font-size: 14px; } + html.theme--documenter-dark .label { + color: #282f2f; + display: block; + font-size: 15px; + font-weight: 700; } + html.theme--documenter-dark .label:not(:last-child) { + margin-bottom: 0.5em; } + html.theme--documenter-dark .label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.label { + font-size: 0.85em; } + html.theme--documenter-dark .label.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .label.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .help { + display: block; + font-size: 0.85em; + margin-top: 0.25rem; } + html.theme--documenter-dark .help.is-white { + color: white; } + html.theme--documenter-dark .help.is-black { + color: #0a0a0a; } + html.theme--documenter-dark .help.is-light { + color: #ecf0f1; } + html.theme--documenter-dark .help.is-dark, html.theme--documenter-dark .content kbd.help { + color: #282f2f; } + html.theme--documenter-dark .help.is-primary, html.theme--documenter-dark .docstring > section > a.help.docs-sourcelink { + color: #375a7f; } + html.theme--documenter-dark .help.is-link { + color: #1abc9c; } + html.theme--documenter-dark .help.is-info { + color: #024c7d; } + html.theme--documenter-dark .help.is-success { + color: #008438; } + html.theme--documenter-dark .help.is-warning { + color: #ad8100; } + html.theme--documenter-dark .help.is-danger { + color: #9e1b0d; } + html.theme--documenter-dark .field:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .field.has-addons { + display: flex; + justify-content: flex-start; } + html.theme--documenter-dark .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]), html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; } + html.theme--documenter-dark .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .field.has-addons.has-addons-centered { + justify-content: center; } + html.theme--documenter-dark .field.has-addons.has-addons-right { + justify-content: flex-end; } + html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .field.is-grouped { + display: flex; + justify-content: flex-start; } + html.theme--documenter-dark .field.is-grouped > .control { + flex-shrink: 0; } + html.theme--documenter-dark .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + html.theme--documenter-dark .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .field.is-grouped.is-grouped-centered { + justify-content: center; } + html.theme--documenter-dark .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:last-child, html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field.is-horizontal { + display: flex; } } + html.theme--documenter-dark .field-label .label { + font-size: inherit; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .field-label { + margin-bottom: 0.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + html.theme--documenter-dark .field-label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.field-label { + font-size: 0.85em; + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-normal { + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + html.theme--documenter-dark .field-body .field .field { + margin-bottom: 0; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + html.theme--documenter-dark .field-body .field { + margin-bottom: 0; } + html.theme--documenter-dark .field-body > .field { + flex-shrink: 1; } + html.theme--documenter-dark .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + html.theme--documenter-dark .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + html.theme--documenter-dark .control { + box-sizing: border-box; + clear: both; + font-size: 15px; + position: relative; + text-align: left; } + html.theme--documenter-dark .control.has-icons-left .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select:focus ~ .icon { + color: #5e6d6f; } + html.theme--documenter-dark .control.has-icons-left .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.85em; } + html.theme--documenter-dark .control.has-icons-left .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + html.theme--documenter-dark .control.has-icons-left .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + html.theme--documenter-dark .control.has-icons-left .icon, html.theme--documenter-dark .control.has-icons-right .icon { + color: #dbdee0; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; } + html.theme--documenter-dark .control.has-icons-left .input, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, + html.theme--documenter-dark .control.has-icons-left .select select { + padding-left: 2.25em; } + html.theme--documenter-dark .control.has-icons-left .icon.is-left { + left: 0; } + html.theme--documenter-dark .control.has-icons-right .input, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, + html.theme--documenter-dark .control.has-icons-right .select select { + padding-right: 2.25em; } + html.theme--documenter-dark .control.has-icons-right .icon.is-right { + right: 0; } + html.theme--documenter-dark .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + html.theme--documenter-dark .control.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.85em; } + html.theme--documenter-dark .control.is-loading.is-medium:after { + font-size: 1.25rem; } + html.theme--documenter-dark .control.is-loading.is-large:after { + font-size: 1.5rem; } + html.theme--documenter-dark .breadcrumb { + font-size: 15px; + white-space: nowrap; } + html.theme--documenter-dark .breadcrumb a { + align-items: center; + color: #1abc9c; + display: flex; + justify-content: center; + padding: 0 0.75em; } + html.theme--documenter-dark .breadcrumb a:hover { + color: #1dd2af; } + html.theme--documenter-dark .breadcrumb li { + align-items: center; + display: flex; } + html.theme--documenter-dark .breadcrumb li:first-child a { + padding-left: 0; } + html.theme--documenter-dark .breadcrumb li.is-active a { + color: #f2f2f2; + cursor: default; + pointer-events: none; } + html.theme--documenter-dark .breadcrumb li + li::before { + color: #8c9b9d; + content: "\0002f"; } + html.theme--documenter-dark .breadcrumb ul, + html.theme--documenter-dark .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .breadcrumb .icon:first-child { + margin-right: 0.5em; } + html.theme--documenter-dark .breadcrumb .icon:last-child { + margin-left: 0.5em; } + html.theme--documenter-dark .breadcrumb.is-centered ol, + html.theme--documenter-dark .breadcrumb.is-centered ul { + justify-content: center; } + html.theme--documenter-dark .breadcrumb.is-right ol, + html.theme--documenter-dark .breadcrumb.is-right ul { + justify-content: flex-end; } + html.theme--documenter-dark .breadcrumb.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.breadcrumb { + font-size: 0.85em; } + html.theme--documenter-dark .breadcrumb.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .breadcrumb.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + html.theme--documenter-dark .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + html.theme--documenter-dark .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + html.theme--documenter-dark .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + html.theme--documenter-dark .card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #fff; + max-width: 100%; + position: relative; } + html.theme--documenter-dark .card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; } + html.theme--documenter-dark .card-header-title { + align-items: center; + color: #f2f2f2; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; } + html.theme--documenter-dark .card-header-title.is-centered { + justify-content: center; } + html.theme--documenter-dark .card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; } + html.theme--documenter-dark .card-image { + display: block; + position: relative; } + html.theme--documenter-dark .card-content { + background-color: transparent; + padding: 1.5rem; } + html.theme--documenter-dark .card-footer { + background-color: transparent; + border-top: 1px solid #5e6d6f; + align-items: stretch; + display: flex; } + html.theme--documenter-dark .card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + html.theme--documenter-dark .card-footer-item:not(:last-child) { + border-right: 1px solid #5e6d6f; } + html.theme--documenter-dark .card .media:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + html.theme--documenter-dark .dropdown.is-active .dropdown-menu, html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + html.theme--documenter-dark .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + html.theme--documenter-dark .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + html.theme--documenter-dark .dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + html.theme--documenter-dark .dropdown-content { + background-color: #282f2f; + border-radius: 0.4em; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + html.theme--documenter-dark .dropdown-item { + color: #fff; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + html.theme--documenter-dark a.dropdown-item, + html.theme--documenter-dark button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; } + html.theme--documenter-dark a.dropdown-item:hover, + html.theme--documenter-dark button.dropdown-item:hover { + background-color: #282f2f; + color: #0a0a0a; } + html.theme--documenter-dark a.dropdown-item.is-active, + html.theme--documenter-dark button.dropdown-item.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .dropdown-divider { + background-color: #5e6d6f; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + html.theme--documenter-dark .level { + align-items: center; + justify-content: space-between; } + html.theme--documenter-dark .level code { + border-radius: 0.4em; } + html.theme--documenter-dark .level img { + display: inline-block; + vertical-align: top; } + html.theme--documenter-dark .level.is-mobile { + display: flex; } + html.theme--documenter-dark .level.is-mobile .level-left, + html.theme--documenter-dark .level.is-mobile .level-right { + display: flex; } + html.theme--documenter-dark .level.is-mobile .level-left + .level-right { + margin-top: 0; } + html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level { + display: flex; } + html.theme--documenter-dark .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } + html.theme--documenter-dark .level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + html.theme--documenter-dark .level-item .title, + html.theme--documenter-dark .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } + html.theme--documenter-dark .level-left, + html.theme--documenter-dark .level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .level-left .level-item.is-flexible, + html.theme--documenter-dark .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-left .level-item:not(:last-child), + html.theme--documenter-dark .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } + html.theme--documenter-dark .level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-left { + display: flex; } } + html.theme--documenter-dark .level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-right { + display: flex; } } + html.theme--documenter-dark .list { + background-color: white; + border-radius: 0.4em; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .list-item { + display: block; + padding: 0.5em 1em; } + html.theme--documenter-dark .list-item:not(a) { + color: #fff; } + html.theme--documenter-dark .list-item:first-child { + border-top-left-radius: 0.4em; + border-top-right-radius: 0.4em; } + html.theme--documenter-dark .list-item:last-child { + border-bottom-left-radius: 0.4em; + border-bottom-right-radius: 0.4em; } + html.theme--documenter-dark .list-item:not(:last-child) { + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .list-item.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark a.list-item { + background-color: #282f2f; + cursor: pointer; } + html.theme--documenter-dark .media { + align-items: flex-start; + display: flex; + text-align: left; } + html.theme--documenter-dark .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .media .media { + border-top: 1px solid rgba(94, 109, 111, 0.5); + display: flex; + padding-top: 0.75rem; } + html.theme--documenter-dark .media .media .content:not(:last-child), + html.theme--documenter-dark .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .media .media .media { + padding-top: 0.5rem; } + html.theme--documenter-dark .media .media .media + .media { + margin-top: 0.5rem; } + html.theme--documenter-dark .media + .media { + border-top: 1px solid rgba(94, 109, 111, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + html.theme--documenter-dark .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + html.theme--documenter-dark .media-left, + html.theme--documenter-dark .media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .media-left { + margin-right: 1rem; } + html.theme--documenter-dark .media-right { + margin-left: 1rem; } + html.theme--documenter-dark .media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .media-content { + overflow-x: auto; } } + html.theme--documenter-dark .menu { + font-size: 15px; } + html.theme--documenter-dark .menu.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.menu { + font-size: 0.85em; } + html.theme--documenter-dark .menu.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .menu.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .menu-list { + line-height: 1.25; } + html.theme--documenter-dark .menu-list a { + border-radius: 3px; + color: #fff; + display: block; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .menu-list a:hover { + background-color: #282f2f; + color: #f2f2f2; } + html.theme--documenter-dark .menu-list a.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .menu-list li ul { + border-left: 1px solid #5e6d6f; + margin: 0.75em; + padding-left: 0.75em; } + html.theme--documenter-dark .menu-label { + color: white; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + html.theme--documenter-dark .menu-label:not(:first-child) { + margin-top: 1em; } + html.theme--documenter-dark .menu-label:not(:last-child) { + margin-bottom: 1em; } + html.theme--documenter-dark .message { + background-color: #282f2f; + border-radius: 0.4em; + font-size: 15px; } + html.theme--documenter-dark .message strong { + color: currentColor; } + html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + html.theme--documenter-dark .message.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.message { + font-size: 0.85em; } + html.theme--documenter-dark .message.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .message.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .message.is-white { + background-color: white; } + html.theme--documenter-dark .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .message.is-white .message-body { + border-color: white; + color: #4d4d4d; } + html.theme--documenter-dark .message.is-black { + background-color: #fafafa; } + html.theme--documenter-dark .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; } + html.theme--documenter-dark .message.is-light { + background-color: #f9fafb; } + html.theme--documenter-dark .message.is-light .message-header { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .message.is-light .message-body { + border-color: #ecf0f1; + color: #505050; } + html.theme--documenter-dark .message.is-dark, html.theme--documenter-dark .content kbd.message { + background-color: #f9fafa; } + html.theme--documenter-dark .message.is-dark .message-header, html.theme--documenter-dark .content kbd.message .message-header { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .message.is-dark .message-body, html.theme--documenter-dark .content kbd.message .message-body { + border-color: #282f2f; + color: #212526; } + html.theme--documenter-dark .message.is-primary, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink { + background-color: #f8fafc; } + html.theme--documenter-dark .message.is-primary .message-header, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-header { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .message.is-primary .message-body, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-body { + border-color: #375a7f; + color: #2b4159; } + html.theme--documenter-dark .message.is-link { + background-color: #f6fefc; } + html.theme--documenter-dark .message.is-link .message-header { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .message.is-link .message-body { + border-color: #1abc9c; + color: #0b2f28; } + html.theme--documenter-dark .message.is-info { + background-color: #f5fbff; } + html.theme--documenter-dark .message.is-info .message-header { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .message.is-info .message-body { + border-color: #024c7d; + color: #033659; } + html.theme--documenter-dark .message.is-success { + background-color: #f5fff9; } + html.theme--documenter-dark .message.is-success .message-header { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .message.is-success .message-body { + border-color: #008438; + color: #023518; } + html.theme--documenter-dark .message.is-warning { + background-color: #fffcf5; } + html.theme--documenter-dark .message.is-warning .message-header { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .message.is-warning .message-body { + border-color: #ad8100; + color: #3d2e03; } + html.theme--documenter-dark .message.is-danger { + background-color: #fef6f6; } + html.theme--documenter-dark .message.is-danger .message-header { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .message.is-danger .message-body { + border-color: #9e1b0d; + color: #7a170c; } + html.theme--documenter-dark .message-header { + align-items: center; + background-color: #fff; + border-radius: 0.4em 0.4em 0 0; + color: rgba(0, 0, 0, 0.7); + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + html.theme--documenter-dark .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + html.theme--documenter-dark .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .message-body { + border-color: #5e6d6f; + border-radius: 0.4em; + border-style: solid; + border-width: 0 0 0 4px; + color: #fff; + padding: 1.25em 1.5em; } + html.theme--documenter-dark .message-body code, + html.theme--documenter-dark .message-body pre { + background-color: white; } + html.theme--documenter-dark .message-body pre code { + background-color: transparent; } + html.theme--documenter-dark .modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + html.theme--documenter-dark .modal.is-active { + display: flex; } + html.theme--documenter-dark .modal-background { + background-color: rgba(10, 10, 10, 0.86); } + html.theme--documenter-dark .modal-content, + html.theme--documenter-dark .modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .modal-content, + html.theme--documenter-dark .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } + html.theme--documenter-dark .modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + html.theme--documenter-dark .modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + html.theme--documenter-dark .modal-card-head, + html.theme--documenter-dark .modal-card-foot { + align-items: center; + background-color: #282f2f; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + html.theme--documenter-dark .modal-card-head { + border-bottom: 1px solid #5e6d6f; + border-top-left-radius: 8px; + border-top-right-radius: 8px; } + html.theme--documenter-dark .modal-card-title { + color: #f2f2f2; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + html.theme--documenter-dark .modal-card-foot { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + html.theme--documenter-dark .modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + html.theme--documenter-dark .navbar { + background-color: #375a7f; + min-height: 4rem; + position: relative; + z-index: 30; } + html.theme--documenter-dark .navbar.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-white .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + html.theme--documenter-dark .navbar.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link { + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-black .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link { + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + html.theme--documenter-dark .navbar.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link { + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after { + border-color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-burger { + color: #282f2f; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-light .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link { + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after { + border-color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #ecf0f1; + color: #282f2f; } } + html.theme--documenter-dark .navbar.is-dark, html.theme--documenter-dark .content kbd.navbar { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link { + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-burger, html.theme--documenter-dark .content kbd.navbar .navbar-burger { + color: #ecf0f1; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-dark .navbar-start > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-end > .navbar-item, + html.theme--documenter-dark .content kbd.navbar .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link { + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #282f2f; + color: #ecf0f1; } } + html.theme--documenter-dark .navbar.is-primary, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-burger, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-primary .navbar-start > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-end > .navbar-item, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #375a7f; + color: #fff; } } + html.theme--documenter-dark .navbar.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-link .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #1abc9c; + color: #fff; } } + html.theme--documenter-dark .navbar.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-info .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #024c7d; + color: #fff; } } + html.theme--documenter-dark .navbar.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-success .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #008438; + color: #fff; } } + html.theme--documenter-dark .navbar.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-warning .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ad8100; + color: #fff; } } + html.theme--documenter-dark .navbar.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-danger .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #9e1b0d; + color: #fff; } } + html.theme--documenter-dark .navbar > .container { + align-items: stretch; + display: flex; + min-height: 4rem; + width: 100%; } + html.theme--documenter-dark .navbar.has-shadow { + box-shadow: 0 2px 0 0 #282f2f; } + html.theme--documenter-dark .navbar.is-fixed-bottom, html.theme--documenter-dark .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #282f2f; } + html.theme--documenter-dark .navbar.is-fixed-top { + top: 0; } + html.theme--documenter-dark html.has-navbar-fixed-top, + html.theme--documenter-dark body.has-navbar-fixed-top { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom, + html.theme--documenter-dark body.has-navbar-fixed-bottom { + padding-bottom: 4rem; } + html.theme--documenter-dark .navbar-brand, + html.theme--documenter-dark .navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 4rem; } + html.theme--documenter-dark .navbar-brand a.navbar-item:focus, html.theme--documenter-dark .navbar-brand a.navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + html.theme--documenter-dark .navbar-burger { + color: #fff; + cursor: pointer; + display: block; + height: 4rem; + position: relative; + width: 4rem; + margin-left: auto; } + html.theme--documenter-dark .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + html.theme--documenter-dark .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + html.theme--documenter-dark .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + html.theme--documenter-dark .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + html.theme--documenter-dark .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + html.theme--documenter-dark .navbar-menu { + display: none; } + html.theme--documenter-dark .navbar-item, + html.theme--documenter-dark .navbar-link { + color: #fff; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + html.theme--documenter-dark .navbar-item .icon:only-child, + html.theme--documenter-dark .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + html.theme--documenter-dark a.navbar-item, + html.theme--documenter-dark .navbar-link { + cursor: pointer; } + html.theme--documenter-dark a.navbar-item:focus, html.theme--documenter-dark a.navbar-item:focus-within, html.theme--documenter-dark a.navbar-item:hover, html.theme--documenter-dark a.navbar-item.is-active, + html.theme--documenter-dark .navbar-link:focus, + html.theme--documenter-dark .navbar-link:focus-within, + html.theme--documenter-dark .navbar-link:hover, + html.theme--documenter-dark .navbar-link.is-active { + background-color: transparent; + color: #1abc9c; } + html.theme--documenter-dark .navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .navbar-item img { + max-height: 1.75rem; } + html.theme--documenter-dark .navbar-item.has-dropdown { + padding: 0; } + html.theme--documenter-dark .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 4rem; + padding-bottom: calc(0.5rem - 1px); } + html.theme--documenter-dark .navbar-item.is-tab:focus, html.theme--documenter-dark .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #1abc9c; } + html.theme--documenter-dark .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #1abc9c; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #1abc9c; + padding-bottom: calc(0.5rem - 3px); } + html.theme--documenter-dark .navbar-content { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after { + border-color: #fff; + margin-top: -0.375em; + right: 1.125em; } + html.theme--documenter-dark .navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + html.theme--documenter-dark .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + html.theme--documenter-dark .navbar-divider { + background-color: rgba(0, 0, 0, 0.2); + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .navbar > .container { + display: block; } + html.theme--documenter-dark .navbar-brand .navbar-item, + html.theme--documenter-dark .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + html.theme--documenter-dark .navbar-link::after { + display: none; } + html.theme--documenter-dark .navbar-menu { + background-color: #375a7f; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + html.theme--documenter-dark .navbar-menu.is-active { + display: block; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch, html.theme--documenter-dark .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .navbar.is-fixed-top-touch { + top: 0; } + html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu, html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 4rem); + overflow: auto; } + html.theme--documenter-dark html.has-navbar-fixed-top-touch, + html.theme--documenter-dark body.has-navbar-fixed-top-touch { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom-touch, + html.theme--documenter-dark body.has-navbar-fixed-bottom-touch { + padding-bottom: 4rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar, + html.theme--documenter-dark .navbar-menu, + html.theme--documenter-dark .navbar-start, + html.theme--documenter-dark .navbar-end { + align-items: stretch; + display: flex; } + html.theme--documenter-dark .navbar { + min-height: 4rem; } + html.theme--documenter-dark .navbar.is-spaced { + padding: 1rem 2rem; } + html.theme--documenter-dark .navbar.is-spaced .navbar-start, + html.theme--documenter-dark .navbar.is-spaced .navbar-end { + align-items: center; } + html.theme--documenter-dark .navbar.is-spaced a.navbar-item, + html.theme--documenter-dark .navbar.is-spaced .navbar-link { + border-radius: 0.4em; } + html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover, html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus, + html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover, + html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: transparent; + color: #dbdee0; } + html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: transparent; + color: #1abc9c; } + html.theme--documenter-dark .navbar-burger { + display: none; } + html.theme--documenter-dark .navbar-item, + html.theme--documenter-dark .navbar-link { + align-items: center; + display: flex; } + html.theme--documenter-dark .navbar-item { + display: flex; } + html.theme--documenter-dark .navbar-item.has-dropdown { + align-items: stretch; } + html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 8px 8px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + html.theme--documenter-dark .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .navbar-start { + justify-content: flex-start; + margin-right: auto; } + html.theme--documenter-dark .navbar-end { + justify-content: flex-end; + margin-left: auto; } + html.theme--documenter-dark .navbar-dropdown { + background-color: #375a7f; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + border-top: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + html.theme--documenter-dark .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover { + background-color: transparent; + color: #dbdee0; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active { + background-color: transparent; + color: #1abc9c; } + .navbar.is-spaced html.theme--documenter-dark .navbar-dropdown, html.theme--documenter-dark .navbar-dropdown.is-boxed { + border-radius: 8px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + html.theme--documenter-dark .navbar-dropdown.is-right { + left: auto; + right: 0; } + html.theme--documenter-dark .navbar-divider { + display: block; } + html.theme--documenter-dark .navbar > .container .navbar-brand, + html.theme--documenter-dark .container > .navbar .navbar-brand { + margin-left: -.75rem; } + html.theme--documenter-dark .navbar > .container .navbar-menu, + html.theme--documenter-dark .container > .navbar .navbar-menu { + margin-right: -.75rem; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop, html.theme--documenter-dark .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .navbar.is-fixed-top-desktop { + top: 0; } + html.theme--documenter-dark html.has-navbar-fixed-top-desktop, + html.theme--documenter-dark body.has-navbar-fixed-top-desktop { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop, + html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop { + padding-bottom: 4rem; } + html.theme--documenter-dark html.has-spaced-navbar-fixed-top, + html.theme--documenter-dark body.has-spaced-navbar-fixed-top { + padding-top: 6rem; } + html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom, + html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom { + padding-bottom: 6rem; } + html.theme--documenter-dark a.navbar-item.is-active, + html.theme--documenter-dark .navbar-link.is-active { + color: #1abc9c; } + html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover), + html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: transparent; } } + html.theme--documenter-dark .hero.is-fullheight-with-navbar { + min-height: calc(100vh - 4rem); } + html.theme--documenter-dark .pagination { + font-size: 15px; + margin: -0.25rem; } + html.theme--documenter-dark .pagination.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination { + font-size: 0.85em; } + html.theme--documenter-dark .pagination.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .pagination.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .pagination.is-rounded .pagination-previous, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, + html.theme--documenter-dark .pagination.is-rounded .pagination-next, + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; } + html.theme--documenter-dark .pagination.is-rounded .pagination-link, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { + border-radius: 290486px; } + html.theme--documenter-dark .pagination, + html.theme--documenter-dark .pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-link { + border-color: #5e6d6f; + color: #1abc9c; + min-width: 2.25em; } + html.theme--documenter-dark .pagination-previous:hover, + html.theme--documenter-dark .pagination-next:hover, + html.theme--documenter-dark .pagination-link:hover { + border-color: #8c9b9d; + color: #1dd2af; } + html.theme--documenter-dark .pagination-previous:focus, + html.theme--documenter-dark .pagination-next:focus, + html.theme--documenter-dark .pagination-link:focus { + border-color: #8c9b9d; } + html.theme--documenter-dark .pagination-previous:active, + html.theme--documenter-dark .pagination-next:active, + html.theme--documenter-dark .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + html.theme--documenter-dark .pagination-previous[disabled], + html.theme--documenter-dark .pagination-next[disabled], + html.theme--documenter-dark .pagination-link[disabled] { + background-color: #dbdee0; + border-color: #dbdee0; + box-shadow: none; + color: #5e6d6f; + opacity: 0.5; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + html.theme--documenter-dark .pagination-link.is-current { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .pagination-ellipsis { + color: #8c9b9d; + pointer-events: none; } + html.theme--documenter-dark .pagination-list { + flex-wrap: wrap; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .pagination { + flex-wrap: wrap; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + html.theme--documenter-dark .pagination-previous { + order: 2; } + html.theme--documenter-dark .pagination-next { + order: 3; } + html.theme--documenter-dark .pagination { + justify-content: space-between; } + html.theme--documenter-dark .pagination.is-centered .pagination-previous { + order: 1; } + html.theme--documenter-dark .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + html.theme--documenter-dark .pagination.is-centered .pagination-next { + order: 3; } + html.theme--documenter-dark .pagination.is-right .pagination-previous { + order: 1; } + html.theme--documenter-dark .pagination.is-right .pagination-next { + order: 2; } + html.theme--documenter-dark .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + html.theme--documenter-dark .panel { + font-size: 15px; } + html.theme--documenter-dark .panel:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .panel-heading, + html.theme--documenter-dark .panel-tabs, + html.theme--documenter-dark .panel-block { + border-bottom: 1px solid #5e6d6f; + border-left: 1px solid #5e6d6f; + border-right: 1px solid #5e6d6f; } + html.theme--documenter-dark .panel-heading:first-child, + html.theme--documenter-dark .panel-tabs:first-child, + html.theme--documenter-dark .panel-block:first-child { + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark .panel-heading { + background-color: #282f2f; + border-radius: 0.4em 0.4em 0 0; + color: #f2f2f2; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + html.theme--documenter-dark .panel-tabs a { + border-bottom: 1px solid #5e6d6f; + margin-bottom: -1px; + padding: 0.5em; } + html.theme--documenter-dark .panel-tabs a.is-active { + border-bottom-color: #343c3d; + color: #17a689; } + html.theme--documenter-dark .panel-list a { + color: #fff; } + html.theme--documenter-dark .panel-list a:hover { + color: #1abc9c; } + html.theme--documenter-dark .panel-block { + align-items: center; + color: #f2f2f2; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + html.theme--documenter-dark .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + html.theme--documenter-dark .panel-block.is-wrapped { + flex-wrap: wrap; } + html.theme--documenter-dark .panel-block.is-active { + border-left-color: #1abc9c; + color: #17a689; } + html.theme--documenter-dark .panel-block.is-active .panel-icon { + color: #1abc9c; } + html.theme--documenter-dark a.panel-block, + html.theme--documenter-dark label.panel-block { + cursor: pointer; } + html.theme--documenter-dark a.panel-block:hover, + html.theme--documenter-dark label.panel-block:hover { + background-color: #282f2f; } + html.theme--documenter-dark .panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: white; + margin-right: 0.75em; } + html.theme--documenter-dark .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + html.theme--documenter-dark .tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 15px; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + html.theme--documenter-dark .tabs a { + align-items: center; + border-bottom-color: #5e6d6f; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #fff; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + html.theme--documenter-dark .tabs a:hover { + border-bottom-color: #f2f2f2; + color: #f2f2f2; } + html.theme--documenter-dark .tabs li { + display: block; } + html.theme--documenter-dark .tabs li.is-active a { + border-bottom-color: #1abc9c; + color: #1abc9c; } + html.theme--documenter-dark .tabs ul { + align-items: center; + border-bottom-color: #5e6d6f; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + html.theme--documenter-dark .tabs ul.is-left { + padding-right: 0.75em; } + html.theme--documenter-dark .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + html.theme--documenter-dark .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + html.theme--documenter-dark .tabs .icon:first-child { + margin-right: 0.5em; } + html.theme--documenter-dark .tabs .icon:last-child { + margin-left: 0.5em; } + html.theme--documenter-dark .tabs.is-centered ul { + justify-content: center; } + html.theme--documenter-dark .tabs.is-right ul { + justify-content: flex-end; } + html.theme--documenter-dark .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .tabs.is-boxed a:hover { + background-color: #282f2f; + border-bottom-color: #5e6d6f; } + html.theme--documenter-dark .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #5e6d6f; + border-bottom-color: transparent !important; } + html.theme--documenter-dark .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .tabs.is-toggle a { + border-color: #5e6d6f; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + html.theme--documenter-dark .tabs.is-toggle a:hover { + background-color: #282f2f; + border-color: #8c9b9d; + z-index: 2; } + html.theme--documenter-dark .tabs.is-toggle li + li { + margin-left: -1px; } + html.theme--documenter-dark .tabs.is-toggle li:first-child a { + border-radius: 0.4em 0 0 0.4em; } + html.theme--documenter-dark .tabs.is-toggle li:last-child a { + border-radius: 0 0.4em 0.4em 0; } + html.theme--documenter-dark .tabs.is-toggle li.is-active a { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; + z-index: 1; } + html.theme--documenter-dark .tabs.is-toggle ul { + border-bottom: none; } + html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; } + html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; } + html.theme--documenter-dark .tabs.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.tabs { + font-size: 0.85em; } + html.theme--documenter-dark .tabs.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .tabs.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > html.theme--documenter-dark .column.is-narrow { + flex: none; } + .columns.is-mobile > html.theme--documenter-dark .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-1 { + flex: none; + width: 8.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-1 { + margin-left: 8.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-2 { + flex: none; + width: 16.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-2 { + margin-left: 16.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-4 { + flex: none; + width: 33.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-4 { + margin-left: 33.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-5 { + flex: none; + width: 41.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-5 { + margin-left: 41.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-7 { + flex: none; + width: 58.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-7 { + margin-left: 58.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-8 { + flex: none; + width: 66.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-8 { + margin-left: 66.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-10 { + flex: none; + width: 83.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-10 { + margin-left: 83.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-11 { + flex: none; + width: 91.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-11 { + margin-left: 91.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .column.is-narrow-mobile { + flex: none; } + html.theme--documenter-dark .column.is-full-mobile { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-mobile { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-mobile { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-mobile { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-mobile { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-mobile { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-mobile { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-mobile { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-mobile { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-mobile { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-mobile { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-mobile { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-mobile { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-mobile { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-mobile { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-mobile { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-mobile { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-mobile { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-mobile { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-mobile { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-mobile { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-mobile { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-mobile { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-mobile { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-mobile { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-mobile { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-mobile { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-mobile { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .column.is-narrow, html.theme--documenter-dark .column.is-narrow-tablet { + flex: none; } + html.theme--documenter-dark .column.is-full, html.theme--documenter-dark .column.is-full-tablet { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters, html.theme--documenter-dark .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds, html.theme--documenter-dark .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half, html.theme--documenter-dark .column.is-half-tablet { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third, html.theme--documenter-dark .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter, html.theme--documenter-dark .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth, html.theme--documenter-dark .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths, html.theme--documenter-dark .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths, html.theme--documenter-dark .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths, html.theme--documenter-dark .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters, html.theme--documenter-dark .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds, html.theme--documenter-dark .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half, html.theme--documenter-dark .column.is-offset-half-tablet { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third, html.theme--documenter-dark .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter, html.theme--documenter-dark .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth, html.theme--documenter-dark .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths, html.theme--documenter-dark .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths, html.theme--documenter-dark .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths, html.theme--documenter-dark .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0, html.theme--documenter-dark .column.is-0-tablet { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0, html.theme--documenter-dark .column.is-offset-0-tablet { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1, html.theme--documenter-dark .column.is-1-tablet { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1, html.theme--documenter-dark .column.is-offset-1-tablet { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2, html.theme--documenter-dark .column.is-2-tablet { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2, html.theme--documenter-dark .column.is-offset-2-tablet { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3, html.theme--documenter-dark .column.is-3-tablet { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3, html.theme--documenter-dark .column.is-offset-3-tablet { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4, html.theme--documenter-dark .column.is-4-tablet { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4, html.theme--documenter-dark .column.is-offset-4-tablet { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5, html.theme--documenter-dark .column.is-5-tablet { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5, html.theme--documenter-dark .column.is-offset-5-tablet { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6, html.theme--documenter-dark .column.is-6-tablet { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6, html.theme--documenter-dark .column.is-offset-6-tablet { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7, html.theme--documenter-dark .column.is-7-tablet { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7, html.theme--documenter-dark .column.is-offset-7-tablet { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8, html.theme--documenter-dark .column.is-8-tablet { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8, html.theme--documenter-dark .column.is-offset-8-tablet { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9, html.theme--documenter-dark .column.is-9-tablet { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9, html.theme--documenter-dark .column.is-offset-9-tablet { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10, html.theme--documenter-dark .column.is-10-tablet { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10, html.theme--documenter-dark .column.is-offset-10-tablet { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11, html.theme--documenter-dark .column.is-11-tablet { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11, html.theme--documenter-dark .column.is-offset-11-tablet { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12, html.theme--documenter-dark .column.is-12-tablet { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12, html.theme--documenter-dark .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .column.is-narrow-touch { + flex: none; } + html.theme--documenter-dark .column.is-full-touch { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-touch { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-touch { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-touch { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-touch { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-touch { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-touch { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-touch { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-touch { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-touch { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-touch { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-touch { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-touch { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-touch { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-touch { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-touch { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-touch { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-touch { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-touch { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-touch { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-touch { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-touch { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-touch { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-touch { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-touch { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-touch { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-touch { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-touch { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-touch { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-touch { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-touch { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-touch { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-touch { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-touch { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-touch { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-touch { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-touch { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-touch { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-touch { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-touch { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .column.is-narrow-desktop { + flex: none; } + html.theme--documenter-dark .column.is-full-desktop { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-desktop { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-desktop { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-desktop { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-desktop { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-desktop { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-desktop { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-desktop { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-desktop { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-desktop { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-desktop { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-desktop { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-desktop { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-desktop { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-desktop { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-desktop { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-desktop { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-desktop { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-desktop { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-desktop { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-desktop { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-desktop { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-desktop { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-desktop { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-desktop { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-desktop { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-desktop { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-desktop { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .column.is-narrow-widescreen { + flex: none; } + html.theme--documenter-dark .column.is-full-widescreen { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-widescreen { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-widescreen { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-widescreen { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-widescreen { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-widescreen { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-widescreen { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-widescreen { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-widescreen { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-widescreen { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-widescreen { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-widescreen { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .column.is-narrow-fullhd { + flex: none; } + html.theme--documenter-dark .column.is-full-fullhd { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-fullhd { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-fullhd { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-fullhd { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-fullhd { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-fullhd { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-fullhd { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-fullhd { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-fullhd { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-fullhd { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-fullhd { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-fullhd { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-fullhd { + margin-left: 100%; } } + html.theme--documenter-dark .columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + html.theme--documenter-dark .columns:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + html.theme--documenter-dark .columns.is-centered { + justify-content: center; } + html.theme--documenter-dark .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + html.theme--documenter-dark .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + html.theme--documenter-dark .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .columns.is-gapless:last-child { + margin-bottom: 0; } + html.theme--documenter-dark .columns.is-mobile { + display: flex; } + html.theme--documenter-dark .columns.is-multiline { + flex-wrap: wrap; } + html.theme--documenter-dark .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-desktop { + display: flex; } } + html.theme--documenter-dark .columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + html.theme--documenter-dark .columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + html.theme--documenter-dark .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + html.theme--documenter-dark .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + html.theme--documenter-dark .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + html.theme--documenter-dark .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + html.theme--documenter-dark .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + html.theme--documenter-dark .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + html.theme--documenter-dark .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + html.theme--documenter-dark .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + html.theme--documenter-dark .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } + html.theme--documenter-dark .tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + html.theme--documenter-dark .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + html.theme--documenter-dark .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .tile.is-child { + margin: 0 !important; } + html.theme--documenter-dark .tile.is-parent { + padding: 0.75rem; } + html.theme--documenter-dark .tile.is-vertical { + flex-direction: column; } + html.theme--documenter-dark .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .tile:not(.is-child) { + display: flex; } + html.theme--documenter-dark .tile.is-1 { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .tile.is-2 { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .tile.is-3 { + flex: none; + width: 25%; } + html.theme--documenter-dark .tile.is-4 { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .tile.is-5 { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .tile.is-6 { + flex: none; + width: 50%; } + html.theme--documenter-dark .tile.is-7 { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .tile.is-8 { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .tile.is-9 { + flex: none; + width: 75%; } + html.theme--documenter-dark .tile.is-10 { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .tile.is-11 { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .tile.is-12 { + flex: none; + width: 100%; } } + html.theme--documenter-dark .hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + html.theme--documenter-dark .hero .navbar { + background: none; } + html.theme--documenter-dark .hero .tabs ul { + border-bottom: none; } + html.theme--documenter-dark .hero.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-white strong { + color: inherit; } + html.theme--documenter-dark .hero.is-white .title { + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + html.theme--documenter-dark .hero.is-white .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-white .navbar-menu { + background-color: white; } } + html.theme--documenter-dark .hero.is-white .navbar-item, + html.theme--documenter-dark .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + html.theme--documenter-dark .hero.is-white a.navbar-item:hover, html.theme--documenter-dark .hero.is-white a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-white .navbar-link:hover, + html.theme--documenter-dark .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-white .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-white .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + html.theme--documenter-dark .hero.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-black strong { + color: inherit; } + html.theme--documenter-dark .hero.is-black .title { + color: white; } + html.theme--documenter-dark .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-black .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + html.theme--documenter-dark .hero.is-black .navbar-item, + html.theme--documenter-dark .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-black a.navbar-item:hover, html.theme--documenter-dark .hero.is-black a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-black .navbar-link:hover, + html.theme--documenter-dark .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-black .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-black .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a { + color: white; } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + html.theme--documenter-dark .hero.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-light strong { + color: inherit; } + html.theme--documenter-dark .hero.is-light .title { + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .subtitle { + color: rgba(40, 47, 47, 0.9); } + html.theme--documenter-dark .hero.is-light .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-light .subtitle strong { + color: #282f2f; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-light .navbar-menu { + background-color: #ecf0f1; } } + html.theme--documenter-dark .hero.is-light .navbar-item, + html.theme--documenter-dark .hero.is-light .navbar-link { + color: rgba(40, 47, 47, 0.7); } + html.theme--documenter-dark .hero.is-light a.navbar-item:hover, html.theme--documenter-dark .hero.is-light a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-light .navbar-link:hover, + html.theme--documenter-dark .hero.is-light .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .tabs a { + color: #282f2f; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-light .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-light .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a { + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } } + html.theme--documenter-dark .hero.is-dark, html.theme--documenter-dark .content kbd.hero { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-dark strong, + html.theme--documenter-dark .content kbd.hero strong { + color: inherit; } + html.theme--documenter-dark .hero.is-dark .title, html.theme--documenter-dark .content kbd.hero .title { + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .subtitle, html.theme--documenter-dark .content kbd.hero .subtitle { + color: rgba(236, 240, 241, 0.9); } + html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button), html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-dark .subtitle strong, + html.theme--documenter-dark .content kbd.hero .subtitle strong { + color: #ecf0f1; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-dark .navbar-menu, html.theme--documenter-dark .content kbd.hero .navbar-menu { + background-color: #282f2f; } } + html.theme--documenter-dark .hero.is-dark .navbar-item, html.theme--documenter-dark .content kbd.hero .navbar-item, + html.theme--documenter-dark .hero.is-dark .navbar-link, + html.theme--documenter-dark .content kbd.hero .navbar-link { + color: rgba(236, 240, 241, 0.7); } + html.theme--documenter-dark .hero.is-dark a.navbar-item:hover, html.theme--documenter-dark .content kbd.hero a.navbar-item:hover, html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active, html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-dark .navbar-link:hover, + html.theme--documenter-dark .content kbd.hero .navbar-link:hover, + html.theme--documenter-dark .hero.is-dark .navbar-link.is-active, + html.theme--documenter-dark .content kbd.hero .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .tabs a, html.theme--documenter-dark .content kbd.hero .tabs a { + color: #ecf0f1; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-dark .tabs a:hover, html.theme--documenter-dark .content kbd.hero .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-dark .tabs li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a { + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .hero.is-dark.is-bold, html.theme--documenter-dark .content kbd.hero.is-bold { + background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu, html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } } + html.theme--documenter-dark .hero.is-primary, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-primary strong, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink strong { + color: inherit; } + html.theme--documenter-dark .hero.is-primary .title, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .title { + color: #fff; } + html.theme--documenter-dark .hero.is-primary .subtitle, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-primary .subtitle strong, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-primary .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-menu { + background-color: #375a7f; } } + html.theme--documenter-dark .hero.is-primary .navbar-item, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-item, + html.theme--documenter-dark .hero.is-primary .navbar-link, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-primary a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-primary .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, + html.theme--documenter-dark .hero.is-primary .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .hero.is-primary .tabs a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-primary .tabs a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-primary .tabs li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .hero.is-primary.is-bold, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } } + html.theme--documenter-dark .hero.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-link strong { + color: inherit; } + html.theme--documenter-dark .hero.is-link .title { + color: #fff; } + html.theme--documenter-dark .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-link .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-link .navbar-menu { + background-color: #1abc9c; } } + html.theme--documenter-dark .hero.is-link .navbar-item, + html.theme--documenter-dark .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-link a.navbar-item:hover, html.theme--documenter-dark .hero.is-link a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-link .navbar-link:hover, + html.theme--documenter-dark .hero.is-link .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-link .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-link .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } } + html.theme--documenter-dark .hero.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-info strong { + color: inherit; } + html.theme--documenter-dark .hero.is-info .title { + color: #fff; } + html.theme--documenter-dark .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-info .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-info .navbar-menu { + background-color: #024c7d; } } + html.theme--documenter-dark .hero.is-info .navbar-item, + html.theme--documenter-dark .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-info a.navbar-item:hover, html.theme--documenter-dark .hero.is-info a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-info .navbar-link:hover, + html.theme--documenter-dark .hero.is-info .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-info .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-info .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } } + html.theme--documenter-dark .hero.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-success strong { + color: inherit; } + html.theme--documenter-dark .hero.is-success .title { + color: #fff; } + html.theme--documenter-dark .hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-success .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-success .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-success .navbar-menu { + background-color: #008438; } } + html.theme--documenter-dark .hero.is-success .navbar-item, + html.theme--documenter-dark .hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-success a.navbar-item:hover, html.theme--documenter-dark .hero.is-success a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-success .navbar-link:hover, + html.theme--documenter-dark .hero.is-success .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .hero.is-success .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-success .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-success .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #008438; } + html.theme--documenter-dark .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } } + html.theme--documenter-dark .hero.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-warning strong { + color: inherit; } + html.theme--documenter-dark .hero.is-warning .title { + color: #fff; } + html.theme--documenter-dark .hero.is-warning .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-warning .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-warning .navbar-menu { + background-color: #ad8100; } } + html.theme--documenter-dark .hero.is-warning .navbar-item, + html.theme--documenter-dark .hero.is-warning .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-warning a.navbar-item:hover, html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-warning .navbar-link:hover, + html.theme--documenter-dark .hero.is-warning .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .hero.is-warning .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-warning .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-warning .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } } + html.theme--documenter-dark .hero.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-danger strong { + color: inherit; } + html.theme--documenter-dark .hero.is-danger .title { + color: #fff; } + html.theme--documenter-dark .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-danger .navbar-menu { + background-color: #9e1b0d; } } + html.theme--documenter-dark .hero.is-danger .navbar-item, + html.theme--documenter-dark .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-danger a.navbar-item:hover, html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-danger .navbar-link:hover, + html.theme--documenter-dark .hero.is-danger .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-danger .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-danger .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } } + html.theme--documenter-dark .hero.is-small .hero-body, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; } } + html.theme--documenter-dark .hero.is-halfheight .hero-body, html.theme--documenter-dark .hero.is-fullheight .hero-body, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + html.theme--documenter-dark .hero.is-halfheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .hero.is-halfheight { + min-height: 50vh; } + html.theme--documenter-dark .hero.is-fullheight { + min-height: 100vh; } + html.theme--documenter-dark .hero-video { + overflow: hidden; } + html.theme--documenter-dark .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + html.theme--documenter-dark .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero-video { + display: none; } } + html.theme--documenter-dark .hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero-buttons .button { + display: flex; } + html.theme--documenter-dark .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero-buttons { + display: flex; + justify-content: center; } + html.theme--documenter-dark .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } + html.theme--documenter-dark .hero-head, + html.theme--documenter-dark .hero-foot { + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + html.theme--documenter-dark .section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .section.is-medium { + padding: 9rem 1.5rem; } + html.theme--documenter-dark .section.is-large { + padding: 18rem 1.5rem; } } + html.theme--documenter-dark .footer { + background-color: #282f2f; + padding: 3rem 1.5rem 6rem; } + html.theme--documenter-dark hr { + height: 1px; } + html.theme--documenter-dark h6 { + text-transform: uppercase; + letter-spacing: 0.5px; } + html.theme--documenter-dark .hero { + background-color: #343c3d; } + html.theme--documenter-dark a { + transition: all 200ms ease; } + html.theme--documenter-dark .button { + transition: all 200ms ease; + border-width: 1px; + color: white; } + html.theme--documenter-dark .button.is-active, html.theme--documenter-dark .button.is-focused, html.theme--documenter-dark .button:active, html.theme--documenter-dark .button:focus { + box-shadow: 0 0 0 2px rgba(140, 155, 157, 0.5); } + html.theme--documenter-dark .button.is-white.is-hovered, html.theme--documenter-dark .button.is-white:hover { + background-color: white; } + html.theme--documenter-dark .button.is-white.is-active, html.theme--documenter-dark .button.is-white.is-focused, html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white:focus { + border-color: white; + box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); } + html.theme--documenter-dark .button.is-black.is-hovered, html.theme--documenter-dark .button.is-black:hover { + background-color: #1d1d1d; } + html.theme--documenter-dark .button.is-black.is-active, html.theme--documenter-dark .button.is-black.is-focused, html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black:focus { + border-color: #0a0a0a; + box-shadow: 0 0 0 2px rgba(10, 10, 10, 0.5); } + html.theme--documenter-dark .button.is-light.is-hovered, html.theme--documenter-dark .button.is-light:hover { + background-color: white; } + html.theme--documenter-dark .button.is-light.is-active, html.theme--documenter-dark .button.is-light.is-focused, html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light:focus { + border-color: #ecf0f1; + box-shadow: 0 0 0 2px rgba(236, 240, 241, 0.5); } + html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered, html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover { + background-color: #3a4344; } + html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused, html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus { + border-color: #282f2f; + box-shadow: 0 0 0 2px rgba(40, 47, 47, 0.5); } + html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover { + background-color: #436d9a; } + html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink, html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus { + border-color: #375a7f; + box-shadow: 0 0 0 2px rgba(55, 90, 127, 0.5); } + html.theme--documenter-dark .button.is-link.is-hovered, html.theme--documenter-dark .button.is-link:hover { + background-color: #1fdeb8; } + html.theme--documenter-dark .button.is-link.is-active, html.theme--documenter-dark .button.is-link.is-focused, html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link:focus { + border-color: #1abc9c; + box-shadow: 0 0 0 2px rgba(26, 188, 156, 0.5); } + html.theme--documenter-dark .button.is-info.is-hovered, html.theme--documenter-dark .button.is-info:hover { + background-color: #0363a3; } + html.theme--documenter-dark .button.is-info.is-active, html.theme--documenter-dark .button.is-info.is-focused, html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info:focus { + border-color: #024c7d; + box-shadow: 0 0 0 2px rgba(2, 76, 125, 0.5); } + html.theme--documenter-dark .button.is-success.is-hovered, html.theme--documenter-dark .button.is-success:hover { + background-color: #00aa48; } + html.theme--documenter-dark .button.is-success.is-active, html.theme--documenter-dark .button.is-success.is-focused, html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success:focus { + border-color: #008438; + box-shadow: 0 0 0 2px rgba(0, 132, 56, 0.5); } + html.theme--documenter-dark .button.is-warning.is-hovered, html.theme--documenter-dark .button.is-warning:hover { + background-color: #d39e00; } + html.theme--documenter-dark .button.is-warning.is-active, html.theme--documenter-dark .button.is-warning.is-focused, html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning:focus { + border-color: #ad8100; + box-shadow: 0 0 0 2px rgba(173, 129, 0, 0.5); } + html.theme--documenter-dark .button.is-danger.is-hovered, html.theme--documenter-dark .button.is-danger:hover { + background-color: #c12110; } + html.theme--documenter-dark .button.is-danger.is-active, html.theme--documenter-dark .button.is-danger.is-focused, html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger:focus { + border-color: #9e1b0d; + box-shadow: 0 0 0 2px rgba(158, 27, 13, 0.5); } + html.theme--documenter-dark .label { + color: #dbdee0; } + html.theme--documenter-dark .button, + html.theme--documenter-dark .control.has-icons-left .icon, + html.theme--documenter-dark .control.has-icons-right .icon, + html.theme--documenter-dark .input, + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark .pagination-ellipsis, + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .select, + html.theme--documenter-dark .select select, + html.theme--documenter-dark .textarea { + height: 2.5em; } + html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark .textarea { + transition: all 200ms ease; + box-shadow: none; + border-width: 1px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .select:after, + html.theme--documenter-dark .select select { + border-width: 1px; } + html.theme--documenter-dark .control.has-addons .button, + html.theme--documenter-dark .control.has-addons .input, + html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search > input, + html.theme--documenter-dark .control.has-addons .select { + margin-right: -1px; } + html.theme--documenter-dark .notification { + background-color: #343c3d; } + html.theme--documenter-dark .card { + box-shadow: none; + border: 1px solid #343c3d; + background-color: #282f2f; + border-radius: 0.4em; } + html.theme--documenter-dark .card .card-image img { + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .card .card-header { + box-shadow: none; + background-color: rgba(18, 18, 18, 0.2); + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .card .card-footer { + background-color: rgba(18, 18, 18, 0.2); } + html.theme--documenter-dark .card .card-footer, + html.theme--documenter-dark .card .card-footer-item { + border-width: 1px; + border-color: #343c3d; } + html.theme--documenter-dark .notification.is-white a:not(.button) { + color: #0a0a0a; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-black a:not(.button) { + color: white; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-light a:not(.button) { + color: #282f2f; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-dark a:not(.button), html.theme--documenter-dark .content kbd.notification a:not(.button) { + color: #ecf0f1; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-primary a:not(.button), html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-link a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-info a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-success a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-warning a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-danger a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .tag, html.theme--documenter-dark .content kbd, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + border-radius: 0.4em; } + html.theme--documenter-dark .menu-list a { + transition: all 300ms ease; } + html.theme--documenter-dark .modal-card-body { + background-color: #282f2f; } + html.theme--documenter-dark .modal-card-foot, + html.theme--documenter-dark .modal-card-head { + border-color: #343c3d; } + html.theme--documenter-dark .message-header { + font-weight: 700; + background-color: #343c3d; + color: white; } + html.theme--documenter-dark .message-body { + border-width: 1px; + border-color: #343c3d; } + html.theme--documenter-dark .navbar { + border-radius: 0.4em; } + html.theme--documenter-dark .navbar.is-transparent { + background: none; } + html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #1abc9c; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .navbar .navbar-menu { + background-color: #375a7f; + border-radius: 0 0 0.4em 0.4em; } } + html.theme--documenter-dark .hero .navbar, + html.theme--documenter-dark body > .navbar { + border-radius: 0; } + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-previous { + border-width: 1px; } + html.theme--documenter-dark .panel-block, + html.theme--documenter-dark .panel-heading, + html.theme--documenter-dark .panel-tabs { + border-width: 1px; } + html.theme--documenter-dark .panel-block:first-child, + html.theme--documenter-dark .panel-heading:first-child, + html.theme--documenter-dark .panel-tabs:first-child { + border-top-width: 1px; } + html.theme--documenter-dark .panel-heading { + font-weight: 700; } + html.theme--documenter-dark .panel-tabs a { + border-width: 1px; + margin-bottom: -1px; } + html.theme--documenter-dark .panel-tabs a.is-active { + border-bottom-color: #17a689; } + html.theme--documenter-dark .panel-block:hover { + color: #1dd2af; } + html.theme--documenter-dark .panel-block:hover .panel-icon { + color: #1dd2af; } + html.theme--documenter-dark .panel-block.is-active .panel-icon { + color: #17a689; } + html.theme--documenter-dark .tabs a { + border-bottom-width: 1px; + margin-bottom: -1px; } + html.theme--documenter-dark .tabs ul { + border-bottom-width: 1px; } + html.theme--documenter-dark .tabs.is-boxed a { + border-width: 1px; } + html.theme--documenter-dark .tabs.is-boxed li.is-active a { + background-color: #1f2424; } + html.theme--documenter-dark .tabs.is-toggle li a { + border-width: 1px; + margin-bottom: 0; } + html.theme--documenter-dark .tabs.is-toggle li + li { + margin-left: -1px; } + html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark h1 .docs-heading-anchor, html.theme--documenter-dark h1 .docs-heading-anchor:hover, html.theme--documenter-dark h1 .docs-heading-anchor:visited, html.theme--documenter-dark h2 .docs-heading-anchor, html.theme--documenter-dark h2 .docs-heading-anchor:hover, html.theme--documenter-dark h2 .docs-heading-anchor:visited, html.theme--documenter-dark h3 .docs-heading-anchor, html.theme--documenter-dark h3 .docs-heading-anchor:hover, html.theme--documenter-dark h3 .docs-heading-anchor:visited, html.theme--documenter-dark h4 .docs-heading-anchor, html.theme--documenter-dark h4 .docs-heading-anchor:hover, html.theme--documenter-dark h4 .docs-heading-anchor:visited, html.theme--documenter-dark h5 .docs-heading-anchor, html.theme--documenter-dark h5 .docs-heading-anchor:hover, html.theme--documenter-dark h5 .docs-heading-anchor:visited, html.theme--documenter-dark h6 .docs-heading-anchor, html.theme--documenter-dark h6 .docs-heading-anchor:hover, html.theme--documenter-dark h6 .docs-heading-anchor:visited { + color: #f2f2f2; } + html.theme--documenter-dark h1 .docs-heading-anchor-permalink, html.theme--documenter-dark h2 .docs-heading-anchor-permalink, html.theme--documenter-dark h3 .docs-heading-anchor-permalink, html.theme--documenter-dark h4 .docs-heading-anchor-permalink, html.theme--documenter-dark h5 .docs-heading-anchor-permalink, html.theme--documenter-dark h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; } + html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; } + html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink { + visibility: visible; } + html.theme--documenter-dark .docs-light-only { + display: none !important; } + html.theme--documenter-dark pre { + position: relative; + overflow: hidden; } + html.theme--documenter-dark pre code, html.theme--documenter-dark pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; } + html.theme--documenter-dark pre code:first-of-type, html.theme--documenter-dark pre code.hljs:first-of-type { + padding-top: 0.5rem !important; } + html.theme--documenter-dark pre code:last-of-type, html.theme--documenter-dark pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; } + html.theme--documenter-dark pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #fff; + cursor: pointer; + text-align: center; } + html.theme--documenter-dark pre .copy-button:focus, html.theme--documenter-dark pre .copy-button:hover { + opacity: 1; + background: rgba(255, 255, 255, 0.1); + color: #1abc9c; } + html.theme--documenter-dark pre .copy-button.success { + color: #259a12; + opacity: 1; } + html.theme--documenter-dark pre .copy-button.error { + color: #cb3c33; + opacity: 1; } + html.theme--documenter-dark pre:hover .copy-button { + opacity: 1; } + html.theme--documenter-dark .admonition { + background-color: #282f2f; + border-style: solid; + border-width: 1px; + border-color: #5e6d6f; + border-radius: 0.4em; + font-size: 15px; } + html.theme--documenter-dark .admonition strong { + color: currentColor; } + html.theme--documenter-dark .admonition.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.admonition { + font-size: 0.85em; } + html.theme--documenter-dark .admonition.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .admonition.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .admonition.is-default { + background-color: #282f2f; + border-color: #5e6d6f; } + html.theme--documenter-dark .admonition.is-default > .admonition-header { + background-color: #5e6d6f; } + html.theme--documenter-dark .admonition.is-info { + background-color: #282f2f; + border-color: #024c7d; } + html.theme--documenter-dark .admonition.is-info > .admonition-header { + background-color: #024c7d; } + html.theme--documenter-dark .admonition.is-success { + background-color: #282f2f; + border-color: #008438; } + html.theme--documenter-dark .admonition.is-success > .admonition-header { + background-color: #008438; } + html.theme--documenter-dark .admonition.is-warning { + background-color: #282f2f; + border-color: #ad8100; } + html.theme--documenter-dark .admonition.is-warning > .admonition-header { + background-color: #ad8100; } + html.theme--documenter-dark .admonition.is-danger { + background-color: #282f2f; + border-color: #9e1b0d; } + html.theme--documenter-dark .admonition.is-danger > .admonition-header { + background-color: #9e1b0d; } + html.theme--documenter-dark .admonition.is-compat { + background-color: #282f2f; + border-color: #137886; } + html.theme--documenter-dark .admonition.is-compat > .admonition-header { + background-color: #137886; } + html.theme--documenter-dark .admonition-header { + background-color: #5e6d6f; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; } + html.theme--documenter-dark .admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; } + html.theme--documenter-dark .admonition-body { + color: #fff; + padding: 0.5rem 0.75rem; } + html.theme--documenter-dark .admonition-body pre { + background-color: #282f2f; } + html.theme--documenter-dark .admonition-body code { + background-color: rgba(255, 255, 255, 0.05); } + html.theme--documenter-dark .docstring { + margin-bottom: 1em; + background-color: transparent; + border: 1px solid #5e6d6f; + box-shadow: none; + max-width: 100%; } + html.theme--documenter-dark .docstring > header { + display: flex; + flex-grow: 1; + align-items: stretch; + padding: 0.5rem 0.75rem; + background-color: #282f2f; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .docstring > header code { + background-color: transparent; } + html.theme--documenter-dark .docstring > header .docstring-binding { + margin-right: 0.3em; } + html.theme--documenter-dark .docstring > header .docstring-category { + margin-left: 0.3em; } + html.theme--documenter-dark .docstring > section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .docstring > section:last-child { + border-bottom: none; } + html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; } + html.theme--documenter-dark .docstring > section > a.docs-sourcelink:focus { + opacity: 1 !important; } + html.theme--documenter-dark .docstring:hover > section > a.docs-sourcelink { + opacity: 0.2; } + html.theme--documenter-dark .docstring:focus-within > section > a.docs-sourcelink { + opacity: 0.2; } + html.theme--documenter-dark .docstring > section:hover a.docs-sourcelink { + opacity: 1; } + html.theme--documenter-dark .documenter-example-output { + background-color: #1f2424; } + html.theme--documenter-dark .outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #282f2f; + border-bottom: 3px solid #9e1b0d; + padding: 10px 35px; + text-align: center; + font-size: 15px; } + html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; } + html.theme--documenter-dark .outdated-warning-overlay a { + color: #1abc9c; } + html.theme--documenter-dark .outdated-warning-overlay a:hover { + color: #1dd2af; } + html.theme--documenter-dark .content pre { + border: 1px solid #5e6d6f; } + html.theme--documenter-dark .content code { + font-weight: inherit; } + html.theme--documenter-dark .content a code { + color: #1abc9c; } + html.theme--documenter-dark .content h1 code, html.theme--documenter-dark .content h2 code, html.theme--documenter-dark .content h3 code, html.theme--documenter-dark .content h4 code, html.theme--documenter-dark .content h5 code, html.theme--documenter-dark .content h6 code { + color: #f2f2f2; } + html.theme--documenter-dark .content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; } + html.theme--documenter-dark .content blockquote > ul:first-child, html.theme--documenter-dark .content blockquote > ol:first-child, html.theme--documenter-dark .content .admonition-body > ul:first-child, html.theme--documenter-dark .content .admonition-body > ol:first-child { + margin-top: 0; } + html.theme--documenter-dark pre, html.theme--documenter-dark code { + font-variant-ligatures: no-contextual; } + html.theme--documenter-dark .breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; } + html.theme--documenter-dark .breadcrumb a.is-disabled, html.theme--documenter-dark .breadcrumb a.is-disabled:hover { + color: #f2f2f2; } + html.theme--documenter-dark .hljs { + background: initial !important; } + html.theme--documenter-dark .katex .katex-mathml { + top: 0; + right: 0; } + html.theme--documenter-dark .katex-display, html.theme--documenter-dark mjx-container, html.theme--documenter-dark .MathJax_Display { + margin: 0.5em 0 !important; } + html.theme--documenter-dark html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; } + html.theme--documenter-dark li.no-marker { + list-style: none; } + html.theme--documenter-dark #documenter .docs-main > article { + overflow-wrap: break-word; } + html.theme--documenter-dark #documenter .docs-main > article .math-container { + overflow-x: auto; + overflow-y: hidden; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-main { + max-width: 52rem; + margin-left: 20rem; + padding-right: 1rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main { + width: 100%; } + html.theme--documenter-dark #documenter .docs-main > article { + max-width: 52rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; } + html.theme--documenter-dark #documenter .docs-main > header, html.theme--documenter-dark #documenter .docs-main > nav { + max-width: 100%; + width: 100%; + margin: 0; } } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar { + background-color: #1f2424; + border-bottom: 1px solid #5e6d6f; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar > * { + margin: auto 0; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + /* For Headroom.js */ + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + /* Safari */ + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + /* Safari */ } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #171717; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } } + html.theme--documenter-dark #documenter .docs-main section.footnotes { + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child, html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; } + html.theme--documenter-dark #documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #5e6d6f; + padding-top: 1rem; + padding-bottom: 1rem; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; } } + html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage, html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; } + html.theme--documenter-dark #documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #fff; + background-color: #282f2f; + border-right: 1px solid #5e6d6f; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 15px; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; + /* Setting up a nicer theme style for the scrollbar */ } + html.theme--documenter-dark #documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #171717; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar.visible { + box-shadow: none; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar { + left: 0; + top: 0; } } + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { + max-height: 6rem; + margin: auto; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a, html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover { + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #5e6d6f; + display: none; + padding: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible { + display: flex; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #5e6d6f; + padding-bottom: 1.5rem; + /* Managing collapsible submenus */ } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li > .tocitem { + font-weight: bold; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li li { + font-size: 14.25px; + margin-left: 1em; + border-left: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { + display: block; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 11.25px; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { + content: "\f078"; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #fff; + background: #282f2f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #fff; + background-color: #32393a; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #5e6d6f; + border-bottom: 1px solid #5e6d6f; + background-color: #1f2424; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: #1f2424; + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #32393a; + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { + border-top: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 12.75px; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; } + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + width: 14.4rem; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: .3rem; + background: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #3b4445; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #4e5a5c; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar { + width: .3rem; + background: none; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #3b4445; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #4e5a5c; } } + html.theme--documenter-dark #documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results li { + margin-left: 2rem; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; } + html.theme--documenter-dark { + background-color: #1f2424; + font-size: 16px; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + html.theme--documenter-dark .ansi span.sgr1 { + font-weight: bolder; } + html.theme--documenter-dark .ansi span.sgr2 { + font-weight: lighter; } + html.theme--documenter-dark .ansi span.sgr3 { + font-style: italic; } + html.theme--documenter-dark .ansi span.sgr4 { + text-decoration: underline; } + html.theme--documenter-dark .ansi span.sgr7 { + color: #1f2424; + background-color: #fff; } + html.theme--documenter-dark .ansi span.sgr8 { + color: transparent; } + html.theme--documenter-dark .ansi span.sgr8 span { + color: transparent; } + html.theme--documenter-dark .ansi span.sgr9 { + text-decoration: line-through; } + html.theme--documenter-dark .ansi span.sgr30 { + color: #242424; } + html.theme--documenter-dark .ansi span.sgr31 { + color: #f6705f; } + html.theme--documenter-dark .ansi span.sgr32 { + color: #4fb43a; } + html.theme--documenter-dark .ansi span.sgr33 { + color: #f4c72f; } + html.theme--documenter-dark .ansi span.sgr34 { + color: #7587f0; } + html.theme--documenter-dark .ansi span.sgr35 { + color: #bc89d3; } + html.theme--documenter-dark .ansi span.sgr36 { + color: #49b6ca; } + html.theme--documenter-dark .ansi span.sgr37 { + color: #b3bdbe; } + html.theme--documenter-dark .ansi span.sgr40 { + background-color: #242424; } + html.theme--documenter-dark .ansi span.sgr41 { + background-color: #f6705f; } + html.theme--documenter-dark .ansi span.sgr42 { + background-color: #4fb43a; } + html.theme--documenter-dark .ansi span.sgr43 { + background-color: #f4c72f; } + html.theme--documenter-dark .ansi span.sgr44 { + background-color: #7587f0; } + html.theme--documenter-dark .ansi span.sgr45 { + background-color: #bc89d3; } + html.theme--documenter-dark .ansi span.sgr46 { + background-color: #49b6ca; } + html.theme--documenter-dark .ansi span.sgr47 { + background-color: #b3bdbe; } + html.theme--documenter-dark .ansi span.sgr90 { + color: #92a0a2; } + html.theme--documenter-dark .ansi span.sgr91 { + color: #ff8674; } + html.theme--documenter-dark .ansi span.sgr92 { + color: #79d462; } + html.theme--documenter-dark .ansi span.sgr93 { + color: #ffe76b; } + html.theme--documenter-dark .ansi span.sgr94 { + color: #8a98ff; } + html.theme--documenter-dark .ansi span.sgr95 { + color: #d2a4e6; } + html.theme--documenter-dark .ansi span.sgr96 { + color: #6bc8db; } + html.theme--documenter-dark .ansi span.sgr97 { + color: #ecf0f1; } + html.theme--documenter-dark .ansi span.sgr100 { + background-color: #92a0a2; } + html.theme--documenter-dark .ansi span.sgr101 { + background-color: #ff8674; } + html.theme--documenter-dark .ansi span.sgr102 { + background-color: #79d462; } + html.theme--documenter-dark .ansi span.sgr103 { + background-color: #ffe76b; } + html.theme--documenter-dark .ansi span.sgr104 { + background-color: #8a98ff; } + html.theme--documenter-dark .ansi span.sgr105 { + background-color: #d2a4e6; } + html.theme--documenter-dark .ansi span.sgr106 { + background-color: #6bc8db; } + html.theme--documenter-dark .ansi span.sgr107 { + background-color: #ecf0f1; } + html.theme--documenter-dark code.language-julia-repl > span.hljs-meta { + color: #4fb43a; + font-weight: bolder; } + html.theme--documenter-dark .hljs { + background: #2b2b2b; + color: #f8f8f2; } + html.theme--documenter-dark .hljs-comment, + html.theme--documenter-dark .hljs-quote { + color: #d4d0ab; } + html.theme--documenter-dark .hljs-variable, + html.theme--documenter-dark .hljs-template-variable, + html.theme--documenter-dark .hljs-tag, + html.theme--documenter-dark .hljs-name, + html.theme--documenter-dark .hljs-selector-id, + html.theme--documenter-dark .hljs-selector-class, + html.theme--documenter-dark .hljs-regexp, + html.theme--documenter-dark .hljs-deletion { + color: #ffa07a; } + html.theme--documenter-dark .hljs-number, + html.theme--documenter-dark .hljs-built_in, + html.theme--documenter-dark .hljs-literal, + html.theme--documenter-dark .hljs-type, + html.theme--documenter-dark .hljs-params, + html.theme--documenter-dark .hljs-meta, + html.theme--documenter-dark .hljs-link { + color: #f5ab35; } + html.theme--documenter-dark .hljs-attribute { + color: #ffd700; } + html.theme--documenter-dark .hljs-string, + html.theme--documenter-dark .hljs-symbol, + html.theme--documenter-dark .hljs-bullet, + html.theme--documenter-dark .hljs-addition { + color: #abe338; } + html.theme--documenter-dark .hljs-title, + html.theme--documenter-dark .hljs-section { + color: #00e0e0; } + html.theme--documenter-dark .hljs-keyword, + html.theme--documenter-dark .hljs-selector-tag { + color: #dcc6e0; } + html.theme--documenter-dark .hljs-emphasis { + font-style: italic; } + html.theme--documenter-dark .hljs-strong { + font-weight: bold; } + @media screen and (-ms-high-contrast: active) { + html.theme--documenter-dark .hljs-addition, + html.theme--documenter-dark .hljs-attribute, + html.theme--documenter-dark .hljs-built_in, + html.theme--documenter-dark .hljs-bullet, + html.theme--documenter-dark .hljs-comment, + html.theme--documenter-dark .hljs-link, + html.theme--documenter-dark .hljs-literal, + html.theme--documenter-dark .hljs-meta, + html.theme--documenter-dark .hljs-number, + html.theme--documenter-dark .hljs-params, + html.theme--documenter-dark .hljs-string, + html.theme--documenter-dark .hljs-symbol, + html.theme--documenter-dark .hljs-type, + html.theme--documenter-dark .hljs-quote { + color: highlight; } + html.theme--documenter-dark .hljs-keyword, + html.theme--documenter-dark .hljs-selector-tag { + font-weight: bold; } } + html.theme--documenter-dark .hljs-subst { + color: #f8f8f2; } diff --git a/previews/PR326/assets/themes/documenter-light.css b/previews/PR326/assets/themes/documenter-light.css new file mode 100644 index 00000000..9595d5b8 --- /dev/null +++ b/previews/PR326/assets/themes/documenter-light.css @@ -0,0 +1,7738 @@ +@charset "UTF-8"; +/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +.tabs, .pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .breadcrumb, .file, .button, .is-unselectable, .modal-close, .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +.admonition:not(:last-child), .tabs:not(:last-child), .message:not(:last-child), .list:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .highlight:not(:last-child), .block:not(:last-child), .title:not(:last-child), +.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { + margin-bottom: 1.5rem; } + +.modal-close, .delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + .modal-close::before, .delete::before, .modal-close::after, .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .modal-close::before, .delete::before { + height: 2px; + width: 50%; } + .modal-close::after, .delete::after { + height: 50%; + width: 2px; } + .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + .modal-close:active, .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + .is-small.modal-close, #documenter .docs-sidebar form.docs-search > input.modal-close, .is-small.delete, #documenter .docs-sidebar form.docs-search > input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + .is-medium.modal-close, .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + .is-large.modal-close, .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +.hero-video, .modal-background, .modal, .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, +.image.is-square .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, +.image.is-1by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, +.image.is-5by4 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, +.image.is-4by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, +.image.is-3by2 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, +.image.is-5by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, +.image.is-16by9 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, +.image.is-2by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, +.image.is-3by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, +.image.is-4by5 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, +.image.is-3by4 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, +.image.is-2by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, +.image.is-3by5 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, +.image.is-9by16 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, +.image.is-1by2 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, +.image.is-1by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .file-cta, +.file-name, .select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input, .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus, + .pagination-ellipsis:focus, .file-cta:focus, + .file-name:focus, .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .button:focus, .is-focused.pagination-previous, + .is-focused.pagination-next, + .is-focused.pagination-link, + .is-focused.pagination-ellipsis, .is-focused.file-cta, + .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-focused.button, .pagination-previous:active, + .pagination-next:active, + .pagination-link:active, + .pagination-ellipsis:active, .file-cta:active, + .file-name:active, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .button:active, .is-active.pagination-previous, + .is-active.pagination-next, + .is-active.pagination-link, + .is-active.pagination-ellipsis, .is-active.file-cta, + .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .is-active.button { + outline: none; } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled], + .pagination-ellipsis[disabled], .file-cta[disabled], + .file-name[disabled], .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], .button[disabled], fieldset[disabled] .pagination-previous, + fieldset[disabled] .pagination-next, + fieldset[disabled] .pagination-link, + fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, + fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] .button { + cursor: not-allowed; } + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; } + +audio { + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: left; } + +html { + background-color: white; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; } + +body, +button, +input, +select, +textarea { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } + +body { + color: #222222; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + +a { + color: #2e63b8; + cursor: pointer; + text-decoration: none; } + a strong { + color: currentColor; } + a:hover { + color: #363636; } + +code { + background-color: rgba(0, 0, 0, 0.05); + color: #000000; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; } + +hr { + background-color: whitesmoke; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + +img { + height: auto; + max-width: 100%; } + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; } + +small { + font-size: 0.875em; } + +span { + font-style: inherit; + font-weight: inherit; } + +strong { + color: #222222; + font-weight: 700; } + +fieldset { + border: none; } + +pre { + -webkit-overflow-scrolling: touch; + background-color: whitesmoke; + color: #222222; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + +table td, +table th { + vertical-align: top; } + table td:not([align]), + table th:not([align]) { + text-align: left; } + +table th { + color: #222222; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 1rem !important; } + +.is-size-7, .docstring > section > a.docs-sourcelink { + font-size: 0.75rem !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 1rem !important; } + .is-size-7-mobile { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 1rem !important; } + .is-size-7-tablet { + font-size: 0.75rem !important; } } + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 1rem !important; } + .is-size-7-touch { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 1rem !important; } + .is-size-7-desktop { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 1rem !important; } + .is-size-7-widescreen { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 1rem !important; } + .is-size-7-fullhd { + font-size: 0.75rem !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: whitesmoke !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #dbdbdb !important; } + +.has-background-light { + background-color: whitesmoke !important; } + +.has-text-dark { + color: #363636 !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #1c1c1c !important; } + +.has-background-dark { + background-color: #363636 !important; } + +.has-text-primary { + color: #4eb5de !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #27a1d2 !important; } + +.has-background-primary { + background-color: #4eb5de !important; } + +.has-text-link { + color: #2e63b8 !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #244d8f !important; } + +.has-background-link { + background-color: #2e63b8 !important; } + +.has-text-info { + color: #209cee !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #1081cb !important; } + +.has-background-info { + background-color: #209cee !important; } + +.has-text-success { + color: #22c35b !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #1a9847 !important; } + +.has-background-success { + background-color: #22c35b !important; } + +.has-text-warning { + color: #ffdd57 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #ffd324 !important; } + +.has-background-warning { + background-color: #ffdd57 !important; } + +.has-text-danger { + color: #da0b00 !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #a70800 !important; } + +.has-background-danger { + background-color: #da0b00 !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #363636 !important; } + +.has-background-grey-darker { + background-color: #363636 !important; } + +.has-text-grey-dark { + color: #4a4a4a !important; } + +.has-background-grey-dark { + background-color: #4a4a4a !important; } + +.has-text-grey { + color: #6b6b6b !important; } + +.has-background-grey { + background-color: #6b6b6b !important; } + +.has-text-grey-light { + color: #b5b5b5 !important; } + +.has-background-grey-light { + background-color: #b5b5b5 !important; } + +.has-text-grey-lighter { + color: #dbdbdb !important; } + +.has-background-grey-lighter { + background-color: #dbdbdb !important; } + +.has-text-white-ter { + color: whitesmoke !important; } + +.has-background-white-ter { + background-color: whitesmoke !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-family-code { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-relative { + position: relative !important; } + +.box { + background-color: white; + border-radius: 6px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222222; + display: block; + padding: 1.25rem; } + +a.box:hover, a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; } + +a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; } + +.button { + background-color: white; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; } + .button strong { + color: inherit; } + .button .icon, .button .icon.is-small, .button #documenter .docs-sidebar form.docs-search > input.icon, #documenter .docs-sidebar .button form.docs-search > input.icon, .button .icon.is-medium, .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; } + .button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); } + .button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); } + .button:hover, .button.is-hovered { + border-color: #b5b5b5; + color: #363636; } + .button:focus, .button.is-focused { + border-color: #3c5dcd; + color: #363636; } + .button:focus:not(:active), .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .button:active, .button.is-active { + border-color: #4a4a4a; + color: #363636; } + .button.is-text { + background-color: transparent; + border-color: transparent; + color: #222222; + text-decoration: underline; } + .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { + background-color: whitesmoke; + color: #222222; } + .button.is-text:active, .button.is-text.is-active { + background-color: #e8e8e8; + color: #222222; } + .button.is-text[disabled], fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:hover, .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .button.is-white:active, .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .button.is-white[disabled], fieldset[disabled] .button.is-white { + background-color: white; + border-color: transparent; + box-shadow: none; } + .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { + background-color: black; } + .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .button.is-black:hover, .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + .button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + color: white; } + .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black[disabled], fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-light { + background-color: whitesmoke; + border-color: transparent; + color: #363636; } + .button.is-light:hover, .button.is-light.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: #363636; } + .button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + color: #363636; } + .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .button.is-light:active, .button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; } + .button.is-light[disabled], fieldset[disabled] .button.is-light { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; } + .button.is-light.is-inverted { + background-color: #363636; + color: whitesmoke; } + .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { + background-color: #292929; } + .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark, .content kbd.button { + background-color: #363636; + border-color: transparent; + color: whitesmoke; } + .button.is-dark:hover, .content kbd.button:hover, .button.is-dark.is-hovered, .content kbd.button.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; } + .button.is-dark:focus, .content kbd.button:focus, .button.is-dark.is-focused, .content kbd.button.is-focused { + border-color: transparent; + color: whitesmoke; } + .button.is-dark:focus:not(:active), .content kbd.button:focus:not(:active), .button.is-dark.is-focused:not(:active), .content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .button.is-dark:active, .content kbd.button:active, .button.is-dark.is-active, .content kbd.button.is-active { + background-color: #292929; + border-color: transparent; + color: whitesmoke; } + .button.is-dark[disabled], .content kbd.button[disabled], fieldset[disabled] .button.is-dark, fieldset[disabled] .content kbd.button, .content fieldset[disabled] kbd.button { + background-color: #363636; + border-color: transparent; + box-shadow: none; } + .button.is-dark.is-inverted, .content kbd.button.is-inverted { + background-color: whitesmoke; + color: #363636; } + .button.is-dark.is-inverted:hover, .content kbd.button.is-inverted:hover, .button.is-dark.is-inverted.is-hovered, .content kbd.button.is-inverted.is-hovered { + background-color: #e8e8e8; } + .button.is-dark.is-inverted[disabled], .content kbd.button.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted, fieldset[disabled] .content kbd.button.is-inverted, .content fieldset[disabled] kbd.button.is-inverted { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; + color: #363636; } + .button.is-dark.is-loading::after, .content kbd.button.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-dark.is-outlined, .content kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-dark.is-outlined:hover, .content kbd.button.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .content kbd.button.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .content kbd.button.is-outlined:focus, .button.is-dark.is-outlined.is-focused, .content kbd.button.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .button.is-dark.is-outlined.is-loading::after, .content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-outlined.is-loading:hover::after, .content kbd.button.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .content kbd.button.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after, .content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-dark.is-outlined[disabled], .content kbd.button.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined, fieldset[disabled] .content kbd.button.is-outlined, .content fieldset[disabled] kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark.is-inverted.is-outlined, .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-dark.is-inverted.is-outlined:hover, .content kbd.button.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .content kbd.button.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .content kbd.button.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused, .content kbd.button.is-inverted.is-outlined.is-focused { + background-color: whitesmoke; + color: #363636; } + .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-inverted.is-outlined[disabled], .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined, fieldset[disabled] .content kbd.button.is-inverted.is-outlined, .content fieldset[disabled] kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-primary, .docstring > section > a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + color: #fff; } + .button.is-primary:hover, .docstring > section > a.button.docs-sourcelink:hover, .button.is-primary.is-hovered, .docstring > section > a.button.is-hovered.docs-sourcelink { + background-color: #43b1dc; + border-color: transparent; + color: #fff; } + .button.is-primary:focus, .docstring > section > a.button.docs-sourcelink:focus, .button.is-primary.is-focused, .docstring > section > a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; } + .button.is-primary:focus:not(:active), .docstring > section > a.button.docs-sourcelink:focus:not(:active), .button.is-primary.is-focused:not(:active), .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .button.is-primary:active, .docstring > section > a.button.docs-sourcelink:active, .button.is-primary.is-active, .docstring > section > a.button.is-active.docs-sourcelink { + background-color: #39acda; + border-color: transparent; + color: #fff; } + .button.is-primary[disabled], .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary, fieldset[disabled] .docstring > section > a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + box-shadow: none; } + .button.is-primary.is-inverted, .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #4eb5de; } + .button.is-primary.is-inverted:hover, .docstring > section > a.button.is-inverted.docs-sourcelink:hover, .button.is-primary.is-inverted.is-hovered, .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; } + .button.is-primary.is-inverted[disabled], .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted, fieldset[disabled] .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #4eb5de; } + .button.is-primary.is-loading::after, .docstring > section > a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined, .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + color: #4eb5de; } + .button.is-primary.is-outlined:hover, .docstring > section > a.button.is-outlined.docs-sourcelink:hover, .button.is-primary.is-outlined.is-hovered, .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-outlined:focus, .docstring > section > a.button.is-outlined.docs-sourcelink:focus, .button.is-primary.is-outlined.is-focused, .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; } + .button.is-primary.is-outlined.is-loading::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; } + .button.is-primary.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined[disabled], .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-outlined, fieldset[disabled] .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + box-shadow: none; + color: #4eb5de; } + .button.is-primary.is-inverted.is-outlined, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-primary.is-inverted.is-outlined:hover, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-inverted.is-outlined:focus, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, .button.is-primary.is-inverted.is-outlined.is-focused, .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #4eb5de; } + .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; } + .button.is-primary.is-inverted.is-outlined[disabled], .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined, fieldset[disabled] .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-link { + background-color: #2e63b8; + border-color: transparent; + color: #fff; } + .button.is-link:hover, .button.is-link.is-hovered { + background-color: #2b5eae; + border-color: transparent; + color: #fff; } + .button.is-link:focus, .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .button.is-link:active, .button.is-link.is-active { + background-color: #2958a4; + border-color: transparent; + color: #fff; } + .button.is-link[disabled], fieldset[disabled] .button.is-link { + background-color: #2e63b8; + border-color: transparent; + box-shadow: none; } + .button.is-link.is-inverted { + background-color: #fff; + color: #2e63b8; } + .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #2e63b8; } + .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + color: #2e63b8; } + .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; } + .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + box-shadow: none; + color: #2e63b8; } + .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #2e63b8; } + .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; } + .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-info { + background-color: #209cee; + border-color: transparent; + color: #fff; } + .button.is-info:hover, .button.is-info.is-hovered { + background-color: #1497ed; + border-color: transparent; + color: #fff; } + .button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .button.is-info:active, .button.is-info.is-active { + background-color: #1190e3; + border-color: transparent; + color: #fff; } + .button.is-info[disabled], fieldset[disabled] .button.is-info { + background-color: #209cee; + border-color: transparent; + box-shadow: none; } + .button.is-info.is-inverted { + background-color: #fff; + color: #209cee; } + .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #209cee; } + .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + color: #209cee; } + .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { + background-color: #209cee; + border-color: #209cee; + color: #fff; } + .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #209cee #209cee !important; } + .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + box-shadow: none; + color: #209cee; } + .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #209cee; } + .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #209cee #209cee !important; } + .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-success { + background-color: #22c35b; + border-color: transparent; + color: #fff; } + .button.is-success:hover, .button.is-success.is-hovered { + background-color: #20b856; + border-color: transparent; + color: #fff; } + .button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + color: #fff; } + .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .button.is-success:active, .button.is-success.is-active { + background-color: #1ead51; + border-color: transparent; + color: #fff; } + .button.is-success[disabled], fieldset[disabled] .button.is-success { + background-color: #22c35b; + border-color: transparent; + box-shadow: none; } + .button.is-success.is-inverted { + background-color: #fff; + color: #22c35b; } + .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #22c35b; } + .button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + color: #22c35b; } + .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; } + .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #22c35b #22c35b !important; } + .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + box-shadow: none; + color: #22c35b; } + .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #22c35b; } + .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #22c35b #22c35b !important; } + .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .button.is-warning:active, .button.is-warning.is-active { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning[disabled], fieldset[disabled] .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; } + .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; } + .button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; } + .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; } + .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; } + .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; } + .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-danger { + background-color: #da0b00; + border-color: transparent; + color: #fff; } + .button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #cd0a00; + border-color: transparent; + color: #fff; } + .button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .button.is-danger:active, .button.is-danger.is-active { + background-color: #c10a00; + border-color: transparent; + color: #fff; } + .button.is-danger[disabled], fieldset[disabled] .button.is-danger { + background-color: #da0b00; + border-color: transparent; + box-shadow: none; } + .button.is-danger.is-inverted { + background-color: #fff; + color: #da0b00; } + .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #da0b00; } + .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + color: #da0b00; } + .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; } + .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #da0b00 #da0b00 !important; } + .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + box-shadow: none; + color: #da0b00; } + .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #da0b00; } + .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #da0b00 #da0b00 !important; } + .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-small, #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 2px; + font-size: 0.75rem; } + .button.is-normal { + font-size: 1rem; } + .button.is-medium { + font-size: 1.25rem; } + .button.is-large { + font-size: 1.5rem; } + .button[disabled], fieldset[disabled] .button { + background-color: white; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; } + .button.is-fullwidth { + display: flex; + width: 100%; } + .button.is-loading { + color: transparent !important; + pointer-events: none; } + .button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; } + .button.is-static { + background-color: whitesmoke; + border-color: #dbdbdb; + color: #6b6b6b; + box-shadow: none; + pointer-events: none; } + .button.is-rounded, #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .buttons .button { + margin-bottom: 0.5rem; } + .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + .buttons:last-child { + margin-bottom: -0.5rem; } + .buttons:not(:last-child) { + margin-bottom: 1rem; } + .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 2px; + font-size: 0.75rem; } + .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + .buttons.has-addons .button:last-child { + margin-right: 0; } + .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { + z-index: 2; } + .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { + z-index: 3; } + .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .buttons.is-centered { + justify-content: center; } + .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + .buttons.is-right { + justify-content: flex-end; } + .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + @media screen and (min-width: 1056px) { + .container { + max-width: 992px; } + .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; } } + @media screen and (max-width: 1215px) { + .container.is-widescreen { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + .container.is-fullhd { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + .container { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + .container { + max-width: 1344px; } } +.content li + li { + margin-top: 0.25em; } + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; } + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #222222; + font-weight: 600; + line-height: 1.125; } + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + .content h1:not(:first-child) { + margin-top: 1em; } + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + .content h2:not(:first-child) { + margin-top: 1.1428em; } + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + .content h3:not(:first-child) { + margin-top: 1.3333em; } + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + +.content h6 { + font-size: 1em; + margin-bottom: 1em; } + +.content blockquote { + background-color: whitesmoke; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; } + +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + .content ol:not([type]) { + list-style-type: decimal; } + .content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; } + .content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; } + .content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; } + .content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; } + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + .content ul ul ul { + list-style-type: square; } + +.content dd { + margin-left: 2em; } + +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + .content figure:not(:first-child) { + margin-top: 2em; } + .content figure:not(:last-child) { + margin-bottom: 2em; } + .content figure img { + display: inline-block; } + .content figure figcaption { + font-style: italic; } + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; } + +.content sup, +.content sub { + font-size: 75%; } + +.content table { + width: 100%; } + .content table td, + .content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .content table th { + color: #222222; } + .content table th:not([align]) { + text-align: left; } + .content table thead td, + .content table thead th { + border-width: 0 0 2px; + color: #222222; } + .content table tfoot td, + .content table tfoot th { + border-width: 2px 0 0; + color: #222222; } + .content table tbody tr:last-child td, + .content table tbody tr:last-child th { + border-bottom-width: 0; } + +.content .tabs li + li { + margin-top: 0; } + +.content.is-small, #documenter .docs-sidebar form.docs-search > input.content { + font-size: 0.75rem; } + +.content.is-medium { + font-size: 1.25rem; } + +.content.is-large { + font-size: 1.5rem; } + +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + .icon.is-small, #documenter .docs-sidebar form.docs-search > input.icon { + height: 1rem; + width: 1rem; } + .icon.is-medium { + height: 2rem; + width: 2rem; } + .icon.is-large { + height: 3rem; + width: 3rem; } + +.image, #documenter .docs-sidebar .docs-logo > img { + display: block; + position: relative; } + .image img, #documenter .docs-sidebar .docs-logo > img img { + display: block; + height: auto; + width: 100%; } + .image img.is-rounded, #documenter .docs-sidebar .docs-logo > img img.is-rounded { + border-radius: 290486px; } + .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, + .image.is-square .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, + .image.is-1by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, + .image.is-5by4 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, + .image.is-4by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, + .image.is-3by2 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, + .image.is-5by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, + .image.is-16by9 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, + .image.is-2by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, + .image.is-3by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, + .image.is-4by5 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, + .image.is-3by4 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, + .image.is-2by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, + .image.is-3by5 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, + .image.is-9by16 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, + .image.is-1by2 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, + .image.is-1by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + .image.is-square, #documenter .docs-sidebar .docs-logo > img.is-square, .image.is-1by1, #documenter .docs-sidebar .docs-logo > img.is-1by1 { + padding-top: 100%; } + .image.is-5by4, #documenter .docs-sidebar .docs-logo > img.is-5by4 { + padding-top: 80%; } + .image.is-4by3, #documenter .docs-sidebar .docs-logo > img.is-4by3 { + padding-top: 75%; } + .image.is-3by2, #documenter .docs-sidebar .docs-logo > img.is-3by2 { + padding-top: 66.6666%; } + .image.is-5by3, #documenter .docs-sidebar .docs-logo > img.is-5by3 { + padding-top: 60%; } + .image.is-16by9, #documenter .docs-sidebar .docs-logo > img.is-16by9 { + padding-top: 56.25%; } + .image.is-2by1, #documenter .docs-sidebar .docs-logo > img.is-2by1 { + padding-top: 50%; } + .image.is-3by1, #documenter .docs-sidebar .docs-logo > img.is-3by1 { + padding-top: 33.3333%; } + .image.is-4by5, #documenter .docs-sidebar .docs-logo > img.is-4by5 { + padding-top: 125%; } + .image.is-3by4, #documenter .docs-sidebar .docs-logo > img.is-3by4 { + padding-top: 133.3333%; } + .image.is-2by3, #documenter .docs-sidebar .docs-logo > img.is-2by3 { + padding-top: 150%; } + .image.is-3by5, #documenter .docs-sidebar .docs-logo > img.is-3by5 { + padding-top: 166.6666%; } + .image.is-9by16, #documenter .docs-sidebar .docs-logo > img.is-9by16 { + padding-top: 177.7777%; } + .image.is-1by2, #documenter .docs-sidebar .docs-logo > img.is-1by2 { + padding-top: 200%; } + .image.is-1by3, #documenter .docs-sidebar .docs-logo > img.is-1by3 { + padding-top: 300%; } + .image.is-16x16, #documenter .docs-sidebar .docs-logo > img.is-16x16 { + height: 16px; + width: 16px; } + .image.is-24x24, #documenter .docs-sidebar .docs-logo > img.is-24x24 { + height: 24px; + width: 24px; } + .image.is-32x32, #documenter .docs-sidebar .docs-logo > img.is-32x32 { + height: 32px; + width: 32px; } + .image.is-48x48, #documenter .docs-sidebar .docs-logo > img.is-48x48 { + height: 48px; + width: 48px; } + .image.is-64x64, #documenter .docs-sidebar .docs-logo > img.is-64x64 { + height: 64px; + width: 64px; } + .image.is-96x96, #documenter .docs-sidebar .docs-logo > img.is-96x96 { + height: 96px; + width: 96px; } + .image.is-128x128, #documenter .docs-sidebar .docs-logo > img.is-128x128 { + height: 128px; + width: 128px; } + +.notification { + background-color: whitesmoke; + border-radius: 4px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; } + .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .notification strong { + color: currentColor; } + .notification code, + .notification pre { + background: white; } + .notification pre code { + background: transparent; } + .notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; } + .notification .title, + .notification .subtitle, + .notification .content { + color: currentColor; } + .notification.is-white { + background-color: white; + color: #0a0a0a; } + .notification.is-black { + background-color: #0a0a0a; + color: white; } + .notification.is-light { + background-color: whitesmoke; + color: #363636; } + .notification.is-dark, .content kbd.notification { + background-color: #363636; + color: whitesmoke; } + .notification.is-primary, .docstring > section > a.notification.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .notification.is-link { + background-color: #2e63b8; + color: #fff; } + .notification.is-info { + background-color: #209cee; + color: #fff; } + .notification.is-success { + background-color: #22c35b; + color: #fff; } + .notification.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .notification.is-danger { + background-color: #da0b00; + color: #fff; } + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; } + .progress::-webkit-progress-bar { + background-color: #dbdbdb; } + .progress::-webkit-progress-value { + background-color: #222222; } + .progress::-moz-progress-bar { + background-color: #222222; } + .progress::-ms-fill { + background-color: #222222; + border: none; } + .progress.is-white::-webkit-progress-value { + background-color: white; } + .progress.is-white::-moz-progress-bar { + background-color: white; } + .progress.is-white::-ms-fill { + background-color: white; } + .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); } + .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); } + .progress.is-light::-webkit-progress-value { + background-color: whitesmoke; } + .progress.is-light::-moz-progress-bar { + background-color: whitesmoke; } + .progress.is-light::-ms-fill { + background-color: whitesmoke; } + .progress.is-light:indeterminate { + background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); } + .progress.is-dark::-webkit-progress-value, .content kbd.progress::-webkit-progress-value { + background-color: #363636; } + .progress.is-dark::-moz-progress-bar, .content kbd.progress::-moz-progress-bar { + background-color: #363636; } + .progress.is-dark::-ms-fill, .content kbd.progress::-ms-fill { + background-color: #363636; } + .progress.is-dark:indeterminate, .content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); } + .progress.is-primary::-webkit-progress-value, .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #4eb5de; } + .progress.is-primary::-moz-progress-bar, .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #4eb5de; } + .progress.is-primary::-ms-fill, .docstring > section > a.progress.docs-sourcelink::-ms-fill { + background-color: #4eb5de; } + .progress.is-primary:indeterminate, .docstring > section > a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); } + .progress.is-link::-webkit-progress-value { + background-color: #2e63b8; } + .progress.is-link::-moz-progress-bar { + background-color: #2e63b8; } + .progress.is-link::-ms-fill { + background-color: #2e63b8; } + .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); } + .progress.is-info::-webkit-progress-value { + background-color: #209cee; } + .progress.is-info::-moz-progress-bar { + background-color: #209cee; } + .progress.is-info::-ms-fill { + background-color: #209cee; } + .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); } + .progress.is-success::-webkit-progress-value { + background-color: #22c35b; } + .progress.is-success::-moz-progress-bar { + background-color: #22c35b; } + .progress.is-success::-ms-fill { + background-color: #22c35b; } + .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); } + .progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; } + .progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; } + .progress.is-warning::-ms-fill { + background-color: #ffdd57; } + .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); } + .progress.is-danger::-webkit-progress-value { + background-color: #da0b00; } + .progress.is-danger::-moz-progress-bar { + background-color: #da0b00; } + .progress.is-danger::-ms-fill { + background-color: #da0b00; } + .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); } + .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #dbdbdb; + background-image: linear-gradient(to right, #222222 30%, #dbdbdb 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + .progress.is-small, #documenter .docs-sidebar form.docs-search > input.progress { + height: 0.75rem; } + .progress.is-medium { + height: 1.25rem; } + .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + +.table { + background-color: white; + color: #363636; } + .table td, + .table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .table td.is-white, + .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + .table td.is-black, + .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .table td.is-light, + .table th.is-light { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .table td.is-dark, + .table th.is-dark { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .table td.is-primary, + .table th.is-primary { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; } + .table td.is-link, + .table th.is-link { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + .table td.is-info, + .table th.is-info { + background-color: #209cee; + border-color: #209cee; + color: #fff; } + .table td.is-success, + .table th.is-success { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; } + .table td.is-warning, + .table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .table td.is-danger, + .table th.is-danger { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; } + .table td.is-narrow, + .table th.is-narrow { + white-space: nowrap; + width: 1%; } + .table td.is-selected, + .table th.is-selected { + background-color: #4eb5de; + color: #fff; } + .table td.is-selected a, + .table td.is-selected strong, + .table th.is-selected a, + .table th.is-selected strong { + color: currentColor; } + .table th { + color: #222222; } + .table th:not([align]) { + text-align: left; } + .table tr.is-selected { + background-color: #4eb5de; + color: #fff; } + .table tr.is-selected a, + .table tr.is-selected strong { + color: currentColor; } + .table tr.is-selected td, + .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + .table thead { + background-color: transparent; } + .table thead td, + .table thead th { + border-width: 0 0 2px; + color: #222222; } + .table tfoot { + background-color: transparent; } + .table tfoot td, + .table tfoot th { + border-width: 2px 0 0; + color: #222222; } + .table tbody { + background-color: transparent; } + .table tbody tr:last-child td, + .table tbody tr:last-child th { + border-bottom-width: 0; } + .table.is-bordered td, + .table.is-bordered th { + border-width: 1px; } + .table.is-bordered tr:last-child td, + .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + .table.is-fullwidth { + width: 100%; } + .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: whitesmoke; } + .table.is-narrow td, + .table.is-narrow th { + padding: 0.25em 0.5em; } + .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; } + +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .tags .tag, .tags .content kbd, .content .tags kbd, .tags .docstring > section > a.docs-sourcelink { + margin-bottom: 0.5rem; } + .tags .tag:not(:last-child), .tags .content kbd:not(:last-child), .content .tags kbd:not(:last-child), .tags .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; } + .tags:last-child { + margin-bottom: -0.5rem; } + .tags:not(:last-child) { + margin-bottom: 1rem; } + .tags.are-medium .tag:not(.is-normal):not(.is-large), .tags.are-medium .content kbd:not(.is-normal):not(.is-large), .content .tags.are-medium kbd:not(.is-normal):not(.is-large), .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 1rem; } + .tags.are-large .tag:not(.is-normal):not(.is-medium), .tags.are-large .content kbd:not(.is-normal):not(.is-medium), .content .tags.are-large kbd:not(.is-normal):not(.is-medium), .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + .tags.is-centered { + justify-content: center; } + .tags.is-centered .tag, .tags.is-centered .content kbd, .content .tags.is-centered kbd, .tags.is-centered .docstring > section > a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; } + .tags.is-right { + justify-content: flex-end; } + .tags.is-right .tag:not(:first-child), .tags.is-right .content kbd:not(:first-child), .content .tags.is-right kbd:not(:first-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; } + .tags.is-right .tag:not(:last-child), .tags.is-right .content kbd:not(:last-child), .content .tags.is-right kbd:not(:last-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0; } + .tags.has-addons .tag, .tags.has-addons .content kbd, .content .tags.has-addons kbd, .tags.has-addons .docstring > section > a.docs-sourcelink { + margin-right: 0; } + .tags.has-addons .tag:not(:first-child), .tags.has-addons .content kbd:not(:first-child), .content .tags.has-addons kbd:not(:first-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .tags.has-addons .tag:not(:last-child), .tags.has-addons .content kbd:not(:last-child), .content .tags.has-addons kbd:not(:last-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.tag:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink:not(body) { + align-items: center; + background-color: whitesmoke; + border-radius: 4px; + color: #222222; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + .tag:not(body) .delete, .content kbd:not(body) .delete, .docstring > section > a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + .tag.is-white:not(body), .content kbd.is-white:not(body), .docstring > section > a.docs-sourcelink.is-white:not(body) { + background-color: white; + color: #0a0a0a; } + .tag.is-black:not(body), .content kbd.is-black:not(body), .docstring > section > a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: white; } + .tag.is-light:not(body), .content kbd.is-light:not(body), .docstring > section > a.docs-sourcelink.is-light:not(body) { + background-color: whitesmoke; + color: #363636; } + .tag.is-dark:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink.is-dark:not(body), .content .docstring > section > kbd:not(body) { + background-color: #363636; + color: whitesmoke; } + .tag.is-primary:not(body), .content kbd.is-primary:not(body), .docstring > section > a.docs-sourcelink:not(body) { + background-color: #4eb5de; + color: #fff; } + .tag.is-link:not(body), .content kbd.is-link:not(body), .docstring > section > a.docs-sourcelink.is-link:not(body) { + background-color: #2e63b8; + color: #fff; } + .tag.is-info:not(body), .content kbd.is-info:not(body), .docstring > section > a.docs-sourcelink.is-info:not(body) { + background-color: #209cee; + color: #fff; } + .tag.is-success:not(body), .content kbd.is-success:not(body), .docstring > section > a.docs-sourcelink.is-success:not(body) { + background-color: #22c35b; + color: #fff; } + .tag.is-warning:not(body), .content kbd.is-warning:not(body), .docstring > section > a.docs-sourcelink.is-warning:not(body) { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .tag.is-danger:not(body), .content kbd.is-danger:not(body), .docstring > section > a.docs-sourcelink.is-danger:not(body) { + background-color: #da0b00; + color: #fff; } + .tag.is-normal:not(body), .content kbd.is-normal:not(body), .docstring > section > a.docs-sourcelink.is-normal:not(body) { + font-size: 0.75rem; } + .tag.is-medium:not(body), .content kbd.is-medium:not(body), .docstring > section > a.docs-sourcelink.is-medium:not(body) { + font-size: 1rem; } + .tag.is-large:not(body), .content kbd.is-large:not(body), .docstring > section > a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; } + .tag:not(body) .icon:first-child:not(:last-child), .content kbd:not(body) .icon:first-child:not(:last-child), .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + .tag:not(body) .icon:last-child:not(:first-child), .content kbd:not(body) .icon:last-child:not(:first-child), .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + .tag:not(body) .icon:first-child:last-child, .content kbd:not(body) .icon:first-child:last-child, .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + .tag.is-delete:not(body), .content kbd.is-delete:not(body), .docstring > section > a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; } + .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; } + .tag.is-delete:not(body):hover, .content kbd.is-delete:not(body):hover, .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, .tag.is-delete:not(body):focus, .content kbd.is-delete:not(body):focus, .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { + background-color: #e8e8e8; } + .tag.is-delete:not(body):active, .content kbd.is-delete:not(body):active, .docstring > section > a.docs-sourcelink.is-delete:not(body):active { + background-color: #dbdbdb; } + .tag.is-rounded:not(body), #documenter .docs-sidebar form.docs-search > input:not(body), .content kbd.is-rounded:not(body), #documenter .docs-sidebar .content form.docs-search > input:not(body), .docstring > section > a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; } + +a.tag:hover, .docstring > section > a.docs-sourcelink:hover { + text-decoration: underline; } + +.title, +.subtitle { + word-break: break-word; } + .title em, + .title span, + .subtitle em, + .subtitle span { + font-weight: inherit; } + .title sub, + .subtitle sub { + font-size: 0.75em; } + .title sup, + .subtitle sup { + font-size: 0.75em; } + .title .tag, .title .content kbd, .content .title kbd, .title .docstring > section > a.docs-sourcelink, + .subtitle .tag, + .subtitle .content kbd, + .content .subtitle kbd, + .subtitle .docstring > section > a.docs-sourcelink { + vertical-align: middle; } + +.title { + color: #363636; + font-size: 2rem; + font-weight: 600; + line-height: 1.125; } + .title strong { + color: inherit; + font-weight: inherit; } + .title + .highlight { + margin-top: -0.75rem; } + .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + .title.is-1 { + font-size: 3rem; } + .title.is-2 { + font-size: 2.5rem; } + .title.is-3 { + font-size: 2rem; } + .title.is-4 { + font-size: 1.5rem; } + .title.is-5 { + font-size: 1.25rem; } + .title.is-6 { + font-size: 1rem; } + .title.is-7 { + font-size: 0.75rem; } + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + .subtitle strong { + color: #363636; + font-weight: 600; } + .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + .subtitle.is-1 { + font-size: 3rem; } + .subtitle.is-2 { + font-size: 2.5rem; } + .subtitle.is-3 { + font-size: 2rem; } + .subtitle.is-4 { + font-size: 1.5rem; } + .subtitle.is-5 { + font-size: 1.25rem; } + .subtitle.is-6 { + font-size: 1rem; } + .subtitle.is-7 { + font-size: 0.75rem; } + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; } + .highlight pre { + overflow: auto; + max-width: 100%; } + +.number { + align-items: center; + background-color: whitesmoke; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + +.select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input { + background-color: white; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; } + .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:hover, .textarea:hover, .input:hover, #documenter .docs-sidebar form.docs-search > input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input, #documenter .docs-sidebar form.docs-search > input.is-hovered { + border-color: #b5b5b5; } + .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + border-color: #2e63b8; + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; + color: #6b6b6b; } + .select select[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .input[disabled]::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-moz-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .input[disabled]::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-webkit-input-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .input[disabled]:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-moz-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .input[disabled]:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-ms-input-placeholder { + color: rgba(107, 107, 107, 0.3); } + +.textarea, .input, #documenter .docs-sidebar form.docs-search > input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; } + .textarea[readonly], .input[readonly], #documenter .docs-sidebar form.docs-search > input[readonly] { + box-shadow: none; } + .is-white.textarea, .is-white.input, #documenter .docs-sidebar form.docs-search > input.is-white { + border-color: white; } + .is-white.textarea:focus, .is-white.input:focus, #documenter .docs-sidebar form.docs-search > input.is-white:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-white.textarea:active, .is-white.input:active, #documenter .docs-sidebar form.docs-search > input.is-white:active, .is-white.is-active.textarea, .is-white.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .is-black.textarea, .is-black.input, #documenter .docs-sidebar form.docs-search > input.is-black { + border-color: #0a0a0a; } + .is-black.textarea:focus, .is-black.input:focus, #documenter .docs-sidebar form.docs-search > input.is-black:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-black.textarea:active, .is-black.input:active, #documenter .docs-sidebar form.docs-search > input.is-black:active, .is-black.is-active.textarea, .is-black.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .is-light.textarea, .is-light.input, #documenter .docs-sidebar form.docs-search > input.is-light { + border-color: whitesmoke; } + .is-light.textarea:focus, .is-light.input:focus, #documenter .docs-sidebar form.docs-search > input.is-light:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-light.textarea:active, .is-light.input:active, #documenter .docs-sidebar form.docs-search > input.is-light:active, .is-light.is-active.textarea, .is-light.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .is-dark.textarea, .content kbd.textarea, .is-dark.input, #documenter .docs-sidebar form.docs-search > input.is-dark, .content kbd.input { + border-color: #363636; } + .is-dark.textarea:focus, .content kbd.textarea:focus, .is-dark.input:focus, #documenter .docs-sidebar form.docs-search > input.is-dark:focus, .content kbd.input:focus, .is-dark.is-focused.textarea, .content kbd.is-focused.textarea, .is-dark.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .content kbd.is-focused.input, #documenter .docs-sidebar .content form.docs-search > input.is-focused, .is-dark.textarea:active, .content kbd.textarea:active, .is-dark.input:active, #documenter .docs-sidebar form.docs-search > input.is-dark:active, .content kbd.input:active, .is-dark.is-active.textarea, .content kbd.is-active.textarea, .is-dark.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .content kbd.is-active.input, #documenter .docs-sidebar .content form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .is-primary.textarea, .docstring > section > a.textarea.docs-sourcelink, .is-primary.input, #documenter .docs-sidebar form.docs-search > input.is-primary, .docstring > section > a.input.docs-sourcelink { + border-color: #4eb5de; } + .is-primary.textarea:focus, .docstring > section > a.textarea.docs-sourcelink:focus, .is-primary.input:focus, #documenter .docs-sidebar form.docs-search > input.is-primary:focus, .docstring > section > a.input.docs-sourcelink:focus, .is-primary.is-focused.textarea, .docstring > section > a.is-focused.textarea.docs-sourcelink, .is-primary.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .docstring > section > a.is-focused.input.docs-sourcelink, .is-primary.textarea:active, .docstring > section > a.textarea.docs-sourcelink:active, .is-primary.input:active, #documenter .docs-sidebar form.docs-search > input.is-primary:active, .docstring > section > a.input.docs-sourcelink:active, .is-primary.is-active.textarea, .docstring > section > a.is-active.textarea.docs-sourcelink, .is-primary.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .docstring > section > a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .is-link.textarea, .is-link.input, #documenter .docs-sidebar form.docs-search > input.is-link { + border-color: #2e63b8; } + .is-link.textarea:focus, .is-link.input:focus, #documenter .docs-sidebar form.docs-search > input.is-link:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-link.textarea:active, .is-link.input:active, #documenter .docs-sidebar form.docs-search > input.is-link:active, .is-link.is-active.textarea, .is-link.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .is-info.textarea, .is-info.input, #documenter .docs-sidebar form.docs-search > input.is-info { + border-color: #209cee; } + .is-info.textarea:focus, .is-info.input:focus, #documenter .docs-sidebar form.docs-search > input.is-info:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-info.textarea:active, .is-info.input:active, #documenter .docs-sidebar form.docs-search > input.is-info:active, .is-info.is-active.textarea, .is-info.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .is-success.textarea, .is-success.input, #documenter .docs-sidebar form.docs-search > input.is-success { + border-color: #22c35b; } + .is-success.textarea:focus, .is-success.input:focus, #documenter .docs-sidebar form.docs-search > input.is-success:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-success.textarea:active, .is-success.input:active, #documenter .docs-sidebar form.docs-search > input.is-success:active, .is-success.is-active.textarea, .is-success.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .is-warning.textarea, .is-warning.input, #documenter .docs-sidebar form.docs-search > input.is-warning { + border-color: #ffdd57; } + .is-warning.textarea:focus, .is-warning.input:focus, #documenter .docs-sidebar form.docs-search > input.is-warning:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-warning.textarea:active, .is-warning.input:active, #documenter .docs-sidebar form.docs-search > input.is-warning:active, .is-warning.is-active.textarea, .is-warning.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .is-danger.textarea, .is-danger.input, #documenter .docs-sidebar form.docs-search > input.is-danger { + border-color: #da0b00; } + .is-danger.textarea:focus, .is-danger.input:focus, #documenter .docs-sidebar form.docs-search > input.is-danger:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-danger.textarea:active, .is-danger.input:active, #documenter .docs-sidebar form.docs-search > input.is-danger:active, .is-danger.is-active.textarea, .is-danger.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .is-small.textarea, .is-small.input, #documenter .docs-sidebar form.docs-search > input { + border-radius: 2px; + font-size: 0.75rem; } + .is-medium.textarea, .is-medium.input, #documenter .docs-sidebar form.docs-search > input.is-medium { + font-size: 1.25rem; } + .is-large.textarea, .is-large.input, #documenter .docs-sidebar form.docs-search > input.is-large { + font-size: 1.5rem; } + .is-fullwidth.textarea, .is-fullwidth.input, #documenter .docs-sidebar form.docs-search > input.is-fullwidth { + display: block; + width: 100%; } + .is-inline.textarea, .is-inline.input, #documenter .docs-sidebar form.docs-search > input.is-inline { + display: inline; + width: auto; } + +.input.is-rounded, #documenter .docs-sidebar form.docs-search > input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + +.input.is-static, #documenter .docs-sidebar form.docs-search > input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; } + .textarea:not([rows]) { + max-height: 600px; + min-height: 120px; } + .textarea[rows] { + height: initial; } + .textarea.has-fixed-size { + resize: none; } + +.radio, .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + .radio input, .checkbox input { + cursor: pointer; } + .radio:hover, .checkbox:hover { + color: #363636; } + .radio[disabled], .checkbox[disabled], fieldset[disabled] .radio, fieldset[disabled] .checkbox { + color: #6b6b6b; + cursor: not-allowed; } + +.radio + .radio { + margin-left: 0.5em; } + +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + .select:not(.is-multiple) { + height: 2.25em; } + .select:not(.is-multiple):not(.is-loading)::after { + border-color: #2e63b8; + right: 1.125em; + z-index: 4; } + .select.is-rounded select, #documenter .docs-sidebar form.docs-search > input.select select { + border-radius: 290486px; + padding-left: 1em; } + .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + .select select::-ms-expand { + display: none; } + .select select[disabled]:hover, fieldset[disabled] .select select:hover { + border-color: whitesmoke; } + .select select:not([multiple]) { + padding-right: 2.5em; } + .select select[multiple] { + height: auto; + padding: 0; } + .select select[multiple] option { + padding: 0.5em 1em; } + .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; } + .select.is-white:not(:hover)::after { + border-color: white; } + .select.is-white select { + border-color: white; } + .select.is-white select:hover, .select.is-white select.is-hovered { + border-color: #f2f2f2; } + .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + .select.is-black select { + border-color: #0a0a0a; } + .select.is-black select:hover, .select.is-black select.is-hovered { + border-color: black; } + .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .select.is-light:not(:hover)::after { + border-color: whitesmoke; } + .select.is-light select { + border-color: whitesmoke; } + .select.is-light select:hover, .select.is-light select.is-hovered { + border-color: #e8e8e8; } + .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .select.is-dark:not(:hover)::after, .content kbd.select:not(:hover)::after { + border-color: #363636; } + .select.is-dark select, .content kbd.select select { + border-color: #363636; } + .select.is-dark select:hover, .content kbd.select select:hover, .select.is-dark select.is-hovered, .content kbd.select select.is-hovered { + border-color: #292929; } + .select.is-dark select:focus, .content kbd.select select:focus, .select.is-dark select.is-focused, .content kbd.select select.is-focused, .select.is-dark select:active, .content kbd.select select:active, .select.is-dark select.is-active, .content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .select.is-primary:not(:hover)::after, .docstring > section > a.select.docs-sourcelink:not(:hover)::after { + border-color: #4eb5de; } + .select.is-primary select, .docstring > section > a.select.docs-sourcelink select { + border-color: #4eb5de; } + .select.is-primary select:hover, .docstring > section > a.select.docs-sourcelink select:hover, .select.is-primary select.is-hovered, .docstring > section > a.select.docs-sourcelink select.is-hovered { + border-color: #39acda; } + .select.is-primary select:focus, .docstring > section > a.select.docs-sourcelink select:focus, .select.is-primary select.is-focused, .docstring > section > a.select.docs-sourcelink select.is-focused, .select.is-primary select:active, .docstring > section > a.select.docs-sourcelink select:active, .select.is-primary select.is-active, .docstring > section > a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .select.is-link:not(:hover)::after { + border-color: #2e63b8; } + .select.is-link select { + border-color: #2e63b8; } + .select.is-link select:hover, .select.is-link select.is-hovered { + border-color: #2958a4; } + .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .select.is-info:not(:hover)::after { + border-color: #209cee; } + .select.is-info select { + border-color: #209cee; } + .select.is-info select:hover, .select.is-info select.is-hovered { + border-color: #1190e3; } + .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .select.is-success:not(:hover)::after { + border-color: #22c35b; } + .select.is-success select { + border-color: #22c35b; } + .select.is-success select:hover, .select.is-success select.is-hovered { + border-color: #1ead51; } + .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .select.is-warning:not(:hover)::after { + border-color: #ffdd57; } + .select.is-warning select { + border-color: #ffdd57; } + .select.is-warning select:hover, .select.is-warning select.is-hovered { + border-color: #ffd83e; } + .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .select.is-danger:not(:hover)::after { + border-color: #da0b00; } + .select.is-danger select { + border-color: #da0b00; } + .select.is-danger select:hover, .select.is-danger select.is-hovered { + border-color: #c10a00; } + .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .select.is-small, #documenter .docs-sidebar form.docs-search > input.select { + border-radius: 2px; + font-size: 0.75rem; } + .select.is-medium { + font-size: 1.25rem; } + .select.is-large { + font-size: 1.5rem; } + .select.is-disabled::after { + border-color: #6b6b6b; } + .select.is-fullwidth { + width: 100%; } + .select.is-fullwidth select { + width: 100%; } + .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + .select.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.75rem; } + .select.is-loading.is-medium:after { + font-size: 1.25rem; } + .select.is-loading.is-large:after { + font-size: 1.5rem; } + +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + .file.is-light .file-cta { + background-color: whitesmoke; + border-color: transparent; + color: #363636; } + .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { + background-color: #eeeeee; + border-color: transparent; + color: #363636; } + .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: #363636; } + .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; } + .file.is-dark .file-cta, .content kbd.file .file-cta { + background-color: #363636; + border-color: transparent; + color: whitesmoke; } + .file.is-dark:hover .file-cta, .content kbd.file:hover .file-cta, .file.is-dark.is-hovered .file-cta, .content kbd.file.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; } + .file.is-dark:focus .file-cta, .content kbd.file:focus .file-cta, .file.is-dark.is-focused .file-cta, .content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: whitesmoke; } + .file.is-dark:active .file-cta, .content kbd.file:active .file-cta, .file.is-dark.is-active .file-cta, .content kbd.file.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: whitesmoke; } + .file.is-primary .file-cta, .docstring > section > a.file.docs-sourcelink .file-cta { + background-color: #4eb5de; + border-color: transparent; + color: #fff; } + .file.is-primary:hover .file-cta, .docstring > section > a.file.docs-sourcelink:hover .file-cta, .file.is-primary.is-hovered .file-cta, .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #43b1dc; + border-color: transparent; + color: #fff; } + .file.is-primary:focus .file-cta, .docstring > section > a.file.docs-sourcelink:focus .file-cta, .file.is-primary.is-focused .file-cta, .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); + color: #fff; } + .file.is-primary:active .file-cta, .docstring > section > a.file.docs-sourcelink:active .file-cta, .file.is-primary.is-active .file-cta, .docstring > section > a.file.is-active.docs-sourcelink .file-cta { + background-color: #39acda; + border-color: transparent; + color: #fff; } + .file.is-link .file-cta { + background-color: #2e63b8; + border-color: transparent; + color: #fff; } + .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { + background-color: #2b5eae; + border-color: transparent; + color: #fff; } + .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); + color: #fff; } + .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { + background-color: #2958a4; + border-color: transparent; + color: #fff; } + .file.is-info .file-cta { + background-color: #209cee; + border-color: transparent; + color: #fff; } + .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { + background-color: #1497ed; + border-color: transparent; + color: #fff; } + .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); + color: #fff; } + .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { + background-color: #1190e3; + border-color: transparent; + color: #fff; } + .file.is-success .file-cta { + background-color: #22c35b; + border-color: transparent; + color: #fff; } + .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { + background-color: #20b856; + border-color: transparent; + color: #fff; } + .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); + color: #fff; } + .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { + background-color: #1ead51; + border-color: transparent; + color: #fff; } + .file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-danger .file-cta { + background-color: #da0b00; + border-color: transparent; + color: #fff; } + .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { + background-color: #cd0a00; + border-color: transparent; + color: #fff; } + .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); + color: #fff; } + .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { + background-color: #c10a00; + border-color: transparent; + color: #fff; } + .file.is-small, #documenter .docs-sidebar form.docs-search > input.file { + font-size: 0.75rem; } + .file.is-medium { + font-size: 1.25rem; } + .file.is-medium .file-icon .fa { + font-size: 21px; } + .file.is-large { + font-size: 1.5rem; } + .file.is-large .file-icon .fa { + font-size: 28px; } + .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .file.has-name.is-empty .file-cta { + border-radius: 4px; } + .file.has-name.is-empty .file-name { + display: none; } + .file.is-boxed .file-label { + flex-direction: column; } + .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + .file.is-boxed .file-name { + border-width: 0 1px 1px; } + .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + .file.is-boxed .file-icon .fa { + font-size: 21px; } + .file.is-boxed.is-small .file-icon .fa, #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { + font-size: 14px; } + .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + .file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; } + .file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; } + .file.is-centered { + justify-content: center; } + .file.is-fullwidth .file-label { + width: 100%; } + .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + .file.is-right { + justify-content: flex-end; } + .file.is-right .file-cta { + border-radius: 0 4px 4px 0; } + .file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; } + +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + .file-label:hover .file-cta { + background-color: #eeeeee; + color: #363636; } + .file-label:hover .file-name { + border-color: #d5d5d5; } + .file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; } + .file-label:active .file-name { + border-color: #cfcfcf; } + +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + +.file-cta { + background-color: whitesmoke; + color: #4a4a4a; } + +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; } + +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + .file-icon .fa { + font-size: 14px; } + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; } + .label:not(:last-child) { + margin-bottom: 0.5em; } + .label.is-small, #documenter .docs-sidebar form.docs-search > input.label { + font-size: 0.75rem; } + .label.is-medium { + font-size: 1.25rem; } + .label.is-large { + font-size: 1.5rem; } + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; } + .help.is-white { + color: white; } + .help.is-black { + color: #0a0a0a; } + .help.is-light { + color: whitesmoke; } + .help.is-dark, .content kbd.help { + color: #363636; } + .help.is-primary, .docstring > section > a.help.docs-sourcelink { + color: #4eb5de; } + .help.is-link { + color: #2e63b8; } + .help.is-info { + color: #209cee; } + .help.is-success { + color: #22c35b; } + .help.is-warning { + color: #ffdd57; } + .help.is-danger { + color: #da0b00; } + +.field:not(:last-child) { + margin-bottom: 0.75rem; } + +.field.has-addons { + display: flex; + justify-content: flex-start; } + .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + .field.has-addons .control:not(:first-child):not(:last-child) .button, + .field.has-addons .control:not(:first-child):not(:last-child) .input, + .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, + .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + .field.has-addons .control:first-child:not(:only-child) .button, + .field.has-addons .control:first-child:not(:only-child) .input, + .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, + .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .field.has-addons .control:last-child:not(:only-child) .button, + .field.has-addons .control:last-child:not(:only-child) .input, + .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, + .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button.is-hovered:not([disabled]), + .field.has-addons .control .input:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, + .field.has-addons .control .input.is-hovered:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), + .field.has-addons .control .select select:not([disabled]):hover, + .field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; } + .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button.is-focused:not([disabled]), .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button.is-active:not([disabled]), + .field.has-addons .control .input:not([disabled]):focus, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, + .field.has-addons .control .input.is-focused:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), + .field.has-addons .control .input:not([disabled]):active, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, + .field.has-addons .control .input.is-active:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), + .field.has-addons .control .select select:not([disabled]):focus, + .field.has-addons .control .select select.is-focused:not([disabled]), + .field.has-addons .control .select select:not([disabled]):active, + .field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; } + .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button.is-focused:not([disabled]):hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button.is-active:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]):focus:hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, + .field.has-addons .control .input.is-focused:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]):active:hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, + .field.has-addons .control .input.is-active:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]):focus:hover, + .field.has-addons .control .select select.is-focused:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]):active:hover, + .field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; } + .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.has-addons.has-addons-centered { + justify-content: center; } + .field.has-addons.has-addons-right { + justify-content: flex-end; } + .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + +.field.is-grouped { + display: flex; + justify-content: flex-start; } + .field.is-grouped > .control { + flex-shrink: 0; } + .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.is-grouped.is-grouped-centered { + justify-content: center; } + .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; } } + +.field-label .label { + font-size: inherit; } + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; } } + +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + .field-label.is-small, #documenter .docs-sidebar form.docs-search > input.field-label { + font-size: 0.75rem; + padding-top: 0.375em; } + .field-label.is-normal { + padding-top: 0.375em; } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + +.field-body .field .field { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + .field-body .field { + margin-bottom: 0; } + .field-body > .field { + flex-shrink: 1; } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; } + .control.has-icons-left .input:focus ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, + .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, + .control.has-icons-right .select:focus ~ .icon { + color: #6b6b6b; } + .control.has-icons-left .input.is-small ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, + .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, + .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; } + .control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, + .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, + .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + .control.has-icons-left .input.is-large ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, + .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, + .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + .control.has-icons-left .icon, .control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; } + .control.has-icons-left .input, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, + .control.has-icons-left .select select { + padding-left: 2.25em; } + .control.has-icons-left .icon.is-left { + left: 0; } + .control.has-icons-right .input, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, + .control.has-icons-right .select select { + padding-right: 2.25em; } + .control.has-icons-right .icon.is-right { + right: 0; } + .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + .control.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.75rem; } + .control.is-loading.is-medium:after { + font-size: 1.25rem; } + .control.is-loading.is-large:after { + font-size: 1.5rem; } + +.breadcrumb { + font-size: 1rem; + white-space: nowrap; } + .breadcrumb a { + align-items: center; + color: #2e63b8; + display: flex; + justify-content: center; + padding: 0 0.75em; } + .breadcrumb a:hover { + color: #363636; } + .breadcrumb li { + align-items: center; + display: flex; } + .breadcrumb li:first-child a { + padding-left: 0; } + .breadcrumb li.is-active a { + color: #222222; + cursor: default; + pointer-events: none; } + .breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; } + .breadcrumb ul, + .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .breadcrumb .icon:first-child { + margin-right: 0.5em; } + .breadcrumb .icon:last-child { + margin-left: 0.5em; } + .breadcrumb.is-centered ol, + .breadcrumb.is-centered ul { + justify-content: center; } + .breadcrumb.is-right ol, + .breadcrumb.is-right ul { + justify-content: flex-end; } + .breadcrumb.is-small, #documenter .docs-sidebar form.docs-search > input.breadcrumb { + font-size: 0.75rem; } + .breadcrumb.is-medium { + font-size: 1.25rem; } + .breadcrumb.is-large { + font-size: 1.5rem; } + .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + +.card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222222; + max-width: 100%; + position: relative; } + +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; } + +.card-header-title { + align-items: center; + color: #222222; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; } + .card-header-title.is-centered { + justify-content: center; } + +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; } + +.card-image { + display: block; + position: relative; } + +.card-content { + background-color: transparent; + padding: 1.5rem; } + +.card-footer { + background-color: transparent; + border-top: 1px solid #dbdbdb; + align-items: stretch; + display: flex; } + +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + .card-footer-item:not(:last-child) { + border-right: 1px solid #dbdbdb; } + +.card .media:not(:last-child) { + margin-bottom: 1.5rem; } + +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + +.dropdown-content { + background-color: white; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; } + a.dropdown-item:hover, + button.dropdown-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + a.dropdown-item.is-active, + button.dropdown-item.is-active { + background-color: #2e63b8; + color: #fff; } + +.dropdown-divider { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + +.level { + align-items: center; + justify-content: space-between; } + .level code { + border-radius: 4px; } + .level img { + display: inline-block; + vertical-align: top; } + .level.is-mobile { + display: flex; } + .level.is-mobile .level-left, + .level.is-mobile .level-right { + display: flex; } + .level.is-mobile .level-left + .level-right { + margin-top: 0; } + .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level { + display: flex; } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + .level-item .title, + .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + .level-left .level-item.is-flexible, + .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } +.level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + .level-left { + display: flex; } } +.level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + .level-right { + display: flex; } } +.list { + background-color: white; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + +.list-item { + display: block; + padding: 0.5em 1em; } + .list-item:not(a) { + color: #222222; } + .list-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + .list-item:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + .list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; } + .list-item.is-active { + background-color: #2e63b8; + color: #fff; } + +a.list-item { + background-color: whitesmoke; + cursor: pointer; } + +.media { + align-items: flex-start; + display: flex; + text-align: left; } + .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + .media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: flex; + padding-top: 0.75rem; } + .media .media .content:not(:last-child), + .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + .media .media .media { + padding-top: 0.5rem; } + .media .media .media + .media { + margin-top: 0.5rem; } + .media + .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + +.media-left { + margin-right: 1rem; } + +.media-right { + margin-left: 1rem; } + +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; } + +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; } } + +.menu { + font-size: 1rem; } + .menu.is-small, #documenter .docs-sidebar form.docs-search > input.menu { + font-size: 0.75rem; } + .menu.is-medium { + font-size: 1.25rem; } + .menu.is-large { + font-size: 1.5rem; } + +.menu-list { + line-height: 1.25; } + .menu-list a { + border-radius: 2px; + color: #222222; + display: block; + padding: 0.5em 0.75em; } + .menu-list a:hover { + background-color: whitesmoke; + color: #222222; } + .menu-list a.is-active { + background-color: #2e63b8; + color: #fff; } + .menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; } + +.menu-label { + color: #6b6b6b; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + .menu-label:not(:first-child) { + margin-top: 1em; } + .menu-label:not(:last-child) { + margin-bottom: 1em; } + +.message { + background-color: whitesmoke; + border-radius: 4px; + font-size: 1rem; } + .message strong { + color: currentColor; } + .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .message.is-small, #documenter .docs-sidebar form.docs-search > input.message { + font-size: 0.75rem; } + .message.is-medium { + font-size: 1.25rem; } + .message.is-large { + font-size: 1.5rem; } + .message.is-white { + background-color: white; } + .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + .message.is-white .message-body { + border-color: white; + color: #4d4d4d; } + .message.is-black { + background-color: #fafafa; } + .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + .message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; } + .message.is-light { + background-color: #fafafa; } + .message.is-light .message-header { + background-color: whitesmoke; + color: #363636; } + .message.is-light .message-body { + border-color: whitesmoke; + color: #505050; } + .message.is-dark, .content kbd.message { + background-color: #fafafa; } + .message.is-dark .message-header, .content kbd.message .message-header { + background-color: #363636; + color: whitesmoke; } + .message.is-dark .message-body, .content kbd.message .message-body { + border-color: #363636; + color: #2a2a2a; } + .message.is-primary, .docstring > section > a.message.docs-sourcelink { + background-color: #f6fbfd; } + .message.is-primary .message-header, .docstring > section > a.message.docs-sourcelink .message-header { + background-color: #4eb5de; + color: #fff; } + .message.is-primary .message-body, .docstring > section > a.message.docs-sourcelink .message-body { + border-color: #4eb5de; + color: #1f556a; } + .message.is-link { + background-color: #f7f9fd; } + .message.is-link .message-header { + background-color: #2e63b8; + color: #fff; } + .message.is-link .message-body { + border-color: #2e63b8; + color: #264981; } + .message.is-info { + background-color: #f6fbfe; } + .message.is-info .message-header { + background-color: #209cee; + color: #fff; } + .message.is-info .message-body { + border-color: #209cee; + color: #12537d; } + .message.is-success { + background-color: #f6fdf9; } + .message.is-success .message-header { + background-color: #22c35b; + color: #fff; } + .message.is-success .message-body { + border-color: #22c35b; + color: #0f361d; } + .message.is-warning { + background-color: #fffdf5; } + .message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .message.is-warning .message-body { + border-color: #ffdd57; + color: #3c3108; } + .message.is-danger { + background-color: #fff5f5; } + .message.is-danger .message-header { + background-color: #da0b00; + color: #fff; } + .message.is-danger .message-body { + border-color: #da0b00; + color: #9b0c04; } + +.message-header { + align-items: center; + background-color: #222222; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #222222; + padding: 1.25em 1.5em; } + .message-body code, + .message-body pre { + background-color: white; } + .message-body pre code { + background-color: transparent; } + +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + .modal.is-active { + display: flex; } + +.modal-background { + background-color: rgba(10, 10, 10, 0.86); } + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: whitesmoke; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; } + +.modal-card-title { + color: #222222; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; } + .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + +.navbar { + background-color: white; + min-height: 3.25rem; + position: relative; + z-index: 30; } + .navbar.is-white { + background-color: white; + color: #0a0a0a; } + .navbar.is-white .navbar-brand > .navbar-item, + .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, + .navbar.is-white .navbar-brand .navbar-link:focus, + .navbar.is-white .navbar-brand .navbar-link:hover, + .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1056px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + .navbar.is-black { + background-color: #0a0a0a; + color: white; } + .navbar.is-black .navbar-brand > .navbar-item, + .navbar.is-black .navbar-brand .navbar-link { + color: white; } + .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, + .navbar.is-black .navbar-brand .navbar-link:focus, + .navbar.is-black .navbar-brand .navbar-link:hover, + .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1056px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: white; } + .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + .navbar.is-light { + background-color: whitesmoke; + color: #363636; } + .navbar.is-light .navbar-brand > .navbar-item, + .navbar.is-light .navbar-brand .navbar-link { + color: #363636; } + .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, + .navbar.is-light .navbar-brand .navbar-link:focus, + .navbar.is-light .navbar-brand .navbar-link:hover, + .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-brand .navbar-link::after { + border-color: #363636; } + .navbar.is-light .navbar-burger { + color: #363636; } + @media screen and (min-width: 1056px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: #363636; } + .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: #363636; } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #363636; } } + .navbar.is-dark, .content kbd.navbar { + background-color: #363636; + color: whitesmoke; } + .navbar.is-dark .navbar-brand > .navbar-item, .content kbd.navbar .navbar-brand > .navbar-item, + .navbar.is-dark .navbar-brand .navbar-link, + .content kbd.navbar .navbar-brand .navbar-link { + color: whitesmoke; } + .navbar.is-dark .navbar-brand > a.navbar-item:focus, .content kbd.navbar .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .content kbd.navbar .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, .content kbd.navbar .navbar-brand > a.navbar-item.is-active, + .navbar.is-dark .navbar-brand .navbar-link:focus, + .content kbd.navbar .navbar-brand .navbar-link:focus, + .navbar.is-dark .navbar-brand .navbar-link:hover, + .content kbd.navbar .navbar-brand .navbar-link:hover, + .navbar.is-dark .navbar-brand .navbar-link.is-active, + .content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-brand .navbar-link::after, .content kbd.navbar .navbar-brand .navbar-link::after { + border-color: whitesmoke; } + .navbar.is-dark .navbar-burger, .content kbd.navbar .navbar-burger { + color: whitesmoke; } + @media screen and (min-width: 1056px) { + .navbar.is-dark .navbar-start > .navbar-item, .content kbd.navbar .navbar-start > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .content kbd.navbar .navbar-start .navbar-link, + .navbar.is-dark .navbar-end > .navbar-item, + .content kbd.navbar .navbar-end > .navbar-item, + .navbar.is-dark .navbar-end .navbar-link, + .content kbd.navbar .navbar-end .navbar-link { + color: whitesmoke; } + .navbar.is-dark .navbar-start > a.navbar-item:focus, .content kbd.navbar .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .content kbd.navbar .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, .content kbd.navbar .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:focus, + .content kbd.navbar .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-start .navbar-link:hover, + .content kbd.navbar .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .content kbd.navbar .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .content kbd.navbar .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .content kbd.navbar .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .content kbd.navbar .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:focus, + .content kbd.navbar .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:hover, + .content kbd.navbar .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active, + .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-start .navbar-link::after, .content kbd.navbar .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after, + .content kbd.navbar .navbar-end .navbar-link::after { + border-color: whitesmoke; } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: whitesmoke; } } + .navbar.is-primary, .docstring > section > a.navbar.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .navbar.is-primary .navbar-brand > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, + .navbar.is-primary .navbar-brand .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-brand > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, + .navbar.is-primary .navbar-brand .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, + .navbar.is-primary .navbar-brand .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, + .navbar.is-primary .navbar-brand .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-brand .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-burger, .docstring > section > a.navbar.docs-sourcelink .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-primary .navbar-start > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, + .navbar.is-primary .navbar-end > .navbar-item, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, + .navbar.is-primary .navbar-end .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-start > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-start .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-start .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #4eb5de; + color: #fff; } } + .navbar.is-link { + background-color: #2e63b8; + color: #fff; } + .navbar.is-link .navbar-brand > .navbar-item, + .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, + .navbar.is-link .navbar-brand .navbar-link:focus, + .navbar.is-link .navbar-brand .navbar-link:hover, + .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #2e63b8; + color: #fff; } } + .navbar.is-info { + background-color: #209cee; + color: #fff; } + .navbar.is-info .navbar-brand > .navbar-item, + .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, + .navbar.is-info .navbar-brand .navbar-link:focus, + .navbar.is-info .navbar-brand .navbar-link:hover, + .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #209cee; + color: #fff; } } + .navbar.is-success { + background-color: #22c35b; + color: #fff; } + .navbar.is-success .navbar-brand > .navbar-item, + .navbar.is-success .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, + .navbar.is-success .navbar-brand .navbar-link:focus, + .navbar.is-success .navbar-brand .navbar-link:hover, + .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-success .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; } + .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #22c35b; + color: #fff; } } + .navbar.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > .navbar-item, + .navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + .navbar.is-warning .navbar-brand .navbar-link:focus, + .navbar.is-warning .navbar-brand .navbar-link:hover, + .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-burger { + color: rgba(0, 0, 0, 0.7); } + @media screen and (min-width: 1056px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } } + .navbar.is-danger { + background-color: #da0b00; + color: #fff; } + .navbar.is-danger .navbar-brand > .navbar-item, + .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + .navbar.is-danger .navbar-brand .navbar-link:focus, + .navbar.is-danger .navbar-brand .navbar-link:hover, + .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #da0b00; + color: #fff; } } + .navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; } + .navbar.has-shadow { + box-shadow: 0 2px 0 0 whitesmoke; } + .navbar.is-fixed-bottom, .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom { + bottom: 0; } + .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 whitesmoke; } + .navbar.is-fixed-top { + top: 0; } + +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; } + +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; } + +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; } + +.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { + background-color: transparent; } + +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + +.navbar-burger { + color: #4a4a4a; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; } + .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + +.navbar-menu { + display: none; } + +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + .navbar-item .icon:only-child, + .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + +a.navbar-item, +.navbar-link { + cursor: pointer; } + a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, + .navbar-link:focus, + .navbar-link:focus-within, + .navbar-link:hover, + .navbar-link.is-active { + background-color: #fafafa; + color: #2e63b8; } + +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; } + .navbar-item img { + max-height: 1.75rem; } + .navbar-item.has-dropdown { + padding: 0; } + .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); } + .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #2e63b8; } + .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #2e63b8; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #2e63b8; + padding-bottom: calc(0.5rem - 3px); } + +.navbar-content { + flex-grow: 1; + flex-shrink: 1; } + +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + .navbar-link:not(.is-arrowless)::after { + border-color: #2e63b8; + margin-top: -0.375em; + right: 1.125em; } + +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + +.navbar-divider { + background-color: whitesmoke; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + +@media screen and (max-width: 1055px) { + .navbar > .container { + display: block; } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + .navbar-link::after { + display: none; } + .navbar-menu { + background-color: white; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + .navbar-menu.is-active { + display: block; } + .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-touch { + bottom: 0; } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-touch { + top: 0; } + .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; } } + +@media screen and (min-width: 1056px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; } + .navbar { + min-height: 3.25rem; } + .navbar.is-spaced { + padding: 1rem 2rem; } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; } + .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #2e63b8; } + .navbar-burger { + display: none; } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; } + .navbar-item { + display: flex; } + .navbar-item.has-dropdown { + align-items: stretch; } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + .navbar-start { + justify-content: flex-start; + margin-right: auto; } + .navbar-end { + justify-content: flex-end; + margin-left: auto; } + .navbar-dropdown { + background-color: white; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #2e63b8; } + .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + .navbar-dropdown.is-right { + left: auto; + right: 0; } + .navbar-divider { + display: block; } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -.75rem; } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -.75rem; } + .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-desktop { + bottom: 0; } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-desktop { + top: 0; } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #0a0a0a; } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; } } + +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); } + +.pagination { + font-size: 1rem; + margin: -0.25rem; } + .pagination.is-small, #documenter .docs-sidebar form.docs-search > input.pagination { + font-size: 0.75rem; } + .pagination.is-medium { + font-size: 1.25rem; } + .pagination.is-large { + font-size: 1.5rem; } + .pagination.is-rounded .pagination-previous, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, + .pagination.is-rounded .pagination-next, + #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; } + .pagination.is-rounded .pagination-link, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { + border-radius: 290486px; } + +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.25em; } + .pagination-previous:hover, + .pagination-next:hover, + .pagination-link:hover { + border-color: #b5b5b5; + color: #363636; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus { + border-color: #3c5dcd; } + .pagination-previous:active, + .pagination-next:active, + .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #6b6b6b; + opacity: 0.5; } + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + +.pagination-link.is-current { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; } + +.pagination-list { + flex-wrap: wrap; } + +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + .pagination-previous { + order: 2; } + .pagination-next { + order: 3; } + .pagination { + justify-content: space-between; } + .pagination.is-centered .pagination-previous { + order: 1; } + .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + .pagination.is-centered .pagination-next { + order: 3; } + .pagination.is-right .pagination-previous { + order: 1; } + .pagination.is-right .pagination-next { + order: 2; } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + +.panel { + font-size: 1rem; } + .panel:not(:last-child) { + margin-bottom: 1.5rem; } + +.panel-heading, +.panel-tabs, +.panel-block { + border-bottom: 1px solid #dbdbdb; + border-left: 1px solid #dbdbdb; + border-right: 1px solid #dbdbdb; } + .panel-heading:first-child, + .panel-tabs:first-child, + .panel-block:first-child { + border-top: 1px solid #dbdbdb; } + +.panel-heading { + background-color: whitesmoke; + border-radius: 4px 4px 0 0; + color: #222222; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; } + +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + .panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; } + .panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; } + +.panel-list a { + color: #222222; } + .panel-list a:hover { + color: #2e63b8; } + +.panel-block { + align-items: center; + color: #222222; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + .panel-block.is-wrapped { + flex-wrap: wrap; } + .panel-block.is-active { + border-left-color: #2e63b8; + color: #363636; } + .panel-block.is-active .panel-icon { + color: #2e63b8; } + +a.panel-block, +label.panel-block { + cursor: pointer; } + a.panel-block:hover, + label.panel-block:hover { + background-color: whitesmoke; } + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #6b6b6b; + margin-right: 0.75em; } + .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + .tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #222222; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + .tabs a:hover { + border-bottom-color: #222222; + color: #222222; } + .tabs li { + display: block; } + .tabs li.is-active a { + border-bottom-color: #2e63b8; + color: #2e63b8; } + .tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + .tabs ul.is-left { + padding-right: 0.75em; } + .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + .tabs .icon:first-child { + margin-right: 0.5em; } + .tabs .icon:last-child { + margin-left: 0.5em; } + .tabs.is-centered ul { + justify-content: center; } + .tabs.is-right ul { + justify-content: flex-end; } + .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + .tabs.is-boxed a:hover { + background-color: whitesmoke; + border-bottom-color: #dbdbdb; } + .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #dbdbdb; + border-bottom-color: transparent !important; } + .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + .tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + .tabs.is-toggle a:hover { + background-color: whitesmoke; + border-color: #b5b5b5; + z-index: 2; } + .tabs.is-toggle li + li { + margin-left: -1px; } + .tabs.is-toggle li:first-child a { + border-radius: 4px 0 0 4px; } + .tabs.is-toggle li:last-child a { + border-radius: 0 4px 4px 0; } + .tabs.is-toggle li.is-active a { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; + z-index: 1; } + .tabs.is-toggle ul { + border-bottom: none; } + .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; } + .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; } + .tabs.is-small, #documenter .docs-sidebar form.docs-search > input.tabs { + font-size: 0.75rem; } + .tabs.is-medium { + font-size: 1.25rem; } + .tabs.is-large { + font-size: 1.5rem; } + +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > .column.is-narrow { + flex: none; } + .columns.is-mobile > .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > .column.is-1 { + flex: none; + width: 8.3333333333%; } + .columns.is-mobile > .column.is-offset-1 { + margin-left: 8.3333333333%; } + .columns.is-mobile > .column.is-2 { + flex: none; + width: 16.6666666667%; } + .columns.is-mobile > .column.is-offset-2 { + margin-left: 16.6666666667%; } + .columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > .column.is-4 { + flex: none; + width: 33.3333333333%; } + .columns.is-mobile > .column.is-offset-4 { + margin-left: 33.3333333333%; } + .columns.is-mobile > .column.is-5 { + flex: none; + width: 41.6666666667%; } + .columns.is-mobile > .column.is-offset-5 { + margin-left: 41.6666666667%; } + .columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > .column.is-7 { + flex: none; + width: 58.3333333333%; } + .columns.is-mobile > .column.is-offset-7 { + margin-left: 58.3333333333%; } + .columns.is-mobile > .column.is-8 { + flex: none; + width: 66.6666666667%; } + .columns.is-mobile > .column.is-offset-8 { + margin-left: 66.6666666667%; } + .columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > .column.is-10 { + flex: none; + width: 83.3333333333%; } + .columns.is-mobile > .column.is-offset-10 { + margin-left: 83.3333333333%; } + .columns.is-mobile > .column.is-11 { + flex: none; + width: 91.6666666667%; } + .columns.is-mobile > .column.is-offset-11 { + margin-left: 91.6666666667%; } + .columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; } + .column.is-full-mobile { + flex: none; + width: 100%; } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + .column.is-half-mobile { + flex: none; + width: 50%; } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + .column.is-offset-half-mobile { + margin-left: 50%; } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + .column.is-0-mobile { + flex: none; + width: 0%; } + .column.is-offset-0-mobile { + margin-left: 0%; } + .column.is-1-mobile { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-mobile { + margin-left: 8.3333333333%; } + .column.is-2-mobile { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-mobile { + margin-left: 16.6666666667%; } + .column.is-3-mobile { + flex: none; + width: 25%; } + .column.is-offset-3-mobile { + margin-left: 25%; } + .column.is-4-mobile { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-mobile { + margin-left: 33.3333333333%; } + .column.is-5-mobile { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-mobile { + margin-left: 41.6666666667%; } + .column.is-6-mobile { + flex: none; + width: 50%; } + .column.is-offset-6-mobile { + margin-left: 50%; } + .column.is-7-mobile { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-mobile { + margin-left: 58.3333333333%; } + .column.is-8-mobile { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-mobile { + margin-left: 66.6666666667%; } + .column.is-9-mobile { + flex: none; + width: 75%; } + .column.is-offset-9-mobile { + margin-left: 75%; } + .column.is-10-mobile { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-mobile { + margin-left: 83.3333333333%; } + .column.is-11-mobile { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-mobile { + margin-left: 91.6666666667%; } + .column.is-12-mobile { + flex: none; + width: 100%; } + .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + .column.is-narrow, .column.is-narrow-tablet { + flex: none; } + .column.is-full, .column.is-full-tablet { + flex: none; + width: 100%; } + .column.is-three-quarters, .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + .column.is-two-thirds, .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + .column.is-half, .column.is-half-tablet { + flex: none; + width: 50%; } + .column.is-one-third, .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + .column.is-one-quarter, .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + .column.is-one-fifth, .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + .column.is-two-fifths, .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + .column.is-three-fifths, .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + .column.is-four-fifths, .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + .column.is-offset-half, .column.is-offset-half-tablet { + margin-left: 50%; } + .column.is-offset-one-third, .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + .column.is-0, .column.is-0-tablet { + flex: none; + width: 0%; } + .column.is-offset-0, .column.is-offset-0-tablet { + margin-left: 0%; } + .column.is-1, .column.is-1-tablet { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1, .column.is-offset-1-tablet { + margin-left: 8.3333333333%; } + .column.is-2, .column.is-2-tablet { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2, .column.is-offset-2-tablet { + margin-left: 16.6666666667%; } + .column.is-3, .column.is-3-tablet { + flex: none; + width: 25%; } + .column.is-offset-3, .column.is-offset-3-tablet { + margin-left: 25%; } + .column.is-4, .column.is-4-tablet { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4, .column.is-offset-4-tablet { + margin-left: 33.3333333333%; } + .column.is-5, .column.is-5-tablet { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5, .column.is-offset-5-tablet { + margin-left: 41.6666666667%; } + .column.is-6, .column.is-6-tablet { + flex: none; + width: 50%; } + .column.is-offset-6, .column.is-offset-6-tablet { + margin-left: 50%; } + .column.is-7, .column.is-7-tablet { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7, .column.is-offset-7-tablet { + margin-left: 58.3333333333%; } + .column.is-8, .column.is-8-tablet { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8, .column.is-offset-8-tablet { + margin-left: 66.6666666667%; } + .column.is-9, .column.is-9-tablet { + flex: none; + width: 75%; } + .column.is-offset-9, .column.is-offset-9-tablet { + margin-left: 75%; } + .column.is-10, .column.is-10-tablet { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10, .column.is-offset-10-tablet { + margin-left: 83.3333333333%; } + .column.is-11, .column.is-11-tablet { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11, .column.is-offset-11-tablet { + margin-left: 91.6666666667%; } + .column.is-12, .column.is-12-tablet { + flex: none; + width: 100%; } + .column.is-offset-12, .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1055px) { + .column.is-narrow-touch { + flex: none; } + .column.is-full-touch { + flex: none; + width: 100%; } + .column.is-three-quarters-touch { + flex: none; + width: 75%; } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + .column.is-half-touch { + flex: none; + width: 50%; } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-touch { + flex: none; + width: 25%; } + .column.is-one-fifth-touch { + flex: none; + width: 20%; } + .column.is-two-fifths-touch { + flex: none; + width: 40%; } + .column.is-three-fifths-touch { + flex: none; + width: 60%; } + .column.is-four-fifths-touch { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-touch { + margin-left: 75%; } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + .column.is-offset-half-touch { + margin-left: 50%; } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-touch { + margin-left: 25%; } + .column.is-offset-one-fifth-touch { + margin-left: 20%; } + .column.is-offset-two-fifths-touch { + margin-left: 40%; } + .column.is-offset-three-fifths-touch { + margin-left: 60%; } + .column.is-offset-four-fifths-touch { + margin-left: 80%; } + .column.is-0-touch { + flex: none; + width: 0%; } + .column.is-offset-0-touch { + margin-left: 0%; } + .column.is-1-touch { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-touch { + margin-left: 8.3333333333%; } + .column.is-2-touch { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-touch { + margin-left: 16.6666666667%; } + .column.is-3-touch { + flex: none; + width: 25%; } + .column.is-offset-3-touch { + margin-left: 25%; } + .column.is-4-touch { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-touch { + margin-left: 33.3333333333%; } + .column.is-5-touch { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-touch { + margin-left: 41.6666666667%; } + .column.is-6-touch { + flex: none; + width: 50%; } + .column.is-offset-6-touch { + margin-left: 50%; } + .column.is-7-touch { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-touch { + margin-left: 58.3333333333%; } + .column.is-8-touch { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-touch { + margin-left: 66.6666666667%; } + .column.is-9-touch { + flex: none; + width: 75%; } + .column.is-offset-9-touch { + margin-left: 75%; } + .column.is-10-touch { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-touch { + margin-left: 83.3333333333%; } + .column.is-11-touch { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-touch { + margin-left: 91.6666666667%; } + .column.is-12-touch { + flex: none; + width: 100%; } + .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1056px) { + .column.is-narrow-desktop { + flex: none; } + .column.is-full-desktop { + flex: none; + width: 100%; } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + .column.is-half-desktop { + flex: none; + width: 50%; } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + .column.is-offset-half-desktop { + margin-left: 50%; } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + .column.is-0-desktop { + flex: none; + width: 0%; } + .column.is-offset-0-desktop { + margin-left: 0%; } + .column.is-1-desktop { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-desktop { + margin-left: 8.3333333333%; } + .column.is-2-desktop { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-desktop { + margin-left: 16.6666666667%; } + .column.is-3-desktop { + flex: none; + width: 25%; } + .column.is-offset-3-desktop { + margin-left: 25%; } + .column.is-4-desktop { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-desktop { + margin-left: 33.3333333333%; } + .column.is-5-desktop { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-desktop { + margin-left: 41.6666666667%; } + .column.is-6-desktop { + flex: none; + width: 50%; } + .column.is-offset-6-desktop { + margin-left: 50%; } + .column.is-7-desktop { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-desktop { + margin-left: 58.3333333333%; } + .column.is-8-desktop { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-desktop { + margin-left: 66.6666666667%; } + .column.is-9-desktop { + flex: none; + width: 75%; } + .column.is-offset-9-desktop { + margin-left: 75%; } + .column.is-10-desktop { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-desktop { + margin-left: 83.3333333333%; } + .column.is-11-desktop { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-desktop { + margin-left: 91.6666666667%; } + .column.is-12-desktop { + flex: none; + width: 100%; } + .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + .column.is-narrow-widescreen { + flex: none; } + .column.is-full-widescreen { + flex: none; + width: 100%; } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + .column.is-half-widescreen { + flex: none; + width: 50%; } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + .column.is-offset-half-widescreen { + margin-left: 50%; } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + .column.is-0-widescreen { + flex: none; + width: 0%; } + .column.is-offset-0-widescreen { + margin-left: 0%; } + .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; } + .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; } + .column.is-3-widescreen { + flex: none; + width: 25%; } + .column.is-offset-3-widescreen { + margin-left: 25%; } + .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; } + .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; } + .column.is-6-widescreen { + flex: none; + width: 50%; } + .column.is-offset-6-widescreen { + margin-left: 50%; } + .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; } + .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; } + .column.is-9-widescreen { + flex: none; + width: 75%; } + .column.is-offset-9-widescreen { + margin-left: 75%; } + .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; } + .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; } + .column.is-12-widescreen { + flex: none; + width: 100%; } + .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + .column.is-narrow-fullhd { + flex: none; } + .column.is-full-fullhd { + flex: none; + width: 100%; } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + .column.is-half-fullhd { + flex: none; + width: 50%; } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + .column.is-offset-half-fullhd { + margin-left: 50%; } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + .column.is-0-fullhd { + flex: none; + width: 0%; } + .column.is-offset-0-fullhd { + margin-left: 0%; } + .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; } + .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; } + .column.is-3-fullhd { + flex: none; + width: 25%; } + .column.is-offset-3-fullhd { + margin-left: 25%; } + .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; } + .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; } + .column.is-6-fullhd { + flex: none; + width: 50%; } + .column.is-offset-6-fullhd { + margin-left: 50%; } + .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; } + .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; } + .column.is-9-fullhd { + flex: none; + width: 75%; } + .column.is-offset-9-fullhd { + margin-left: 75%; } + .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; } + .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; } + .column.is-12-fullhd { + flex: none; + width: 100%; } + .column.is-offset-12-fullhd { + margin-left: 100%; } } +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .columns:last-child { + margin-bottom: -0.75rem; } + .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + .columns.is-centered { + justify-content: center; } + .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + .columns.is-gapless:last-child { + margin-bottom: 0; } + .columns.is-mobile { + display: flex; } + .columns.is-multiline { + flex-wrap: wrap; } + .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1056px) { + .columns.is-desktop { + display: flex; } } +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + .columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + .tile.is-child { + margin: 0 !important; } + .tile.is-parent { + padding: 0.75rem; } + .tile.is-vertical { + flex-direction: column; } + .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; } + .tile.is-1 { + flex: none; + width: 8.3333333333%; } + .tile.is-2 { + flex: none; + width: 16.6666666667%; } + .tile.is-3 { + flex: none; + width: 25%; } + .tile.is-4 { + flex: none; + width: 33.3333333333%; } + .tile.is-5 { + flex: none; + width: 41.6666666667%; } + .tile.is-6 { + flex: none; + width: 50%; } + .tile.is-7 { + flex: none; + width: 58.3333333333%; } + .tile.is-8 { + flex: none; + width: 66.6666666667%; } + .tile.is-9 { + flex: none; + width: 75%; } + .tile.is-10 { + flex: none; + width: 83.3333333333%; } + .tile.is-11 { + flex: none; + width: 91.6666666667%; } + .tile.is-12 { + flex: none; + width: 100%; } } +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + .hero .navbar { + background: none; } + .hero .tabs ul { + border-bottom: none; } + .hero.is-white { + background-color: white; + color: #0a0a0a; } + .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-white strong { + color: inherit; } + .hero.is-white .title { + color: #0a0a0a; } + .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + .hero.is-white .subtitle a:not(.button), + .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1055px) { + .hero.is-white .navbar-menu { + background-color: white; } } + .hero.is-white .navbar-item, + .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, + .hero.is-white .navbar-link:hover, + .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + .hero.is-white .tabs a:hover { + opacity: 1; } + .hero.is-white .tabs li.is-active a { + opacity: 1; } + .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + .hero.is-black { + background-color: #0a0a0a; + color: white; } + .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-black strong { + color: inherit; } + .hero.is-black .title { + color: white; } + .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-black .subtitle a:not(.button), + .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1055px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + .hero.is-black .navbar-item, + .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, + .hero.is-black .navbar-link:hover, + .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + .hero.is-black .tabs a:hover { + opacity: 1; } + .hero.is-black .tabs li.is-active a { + opacity: 1; } + .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { + color: white; } + .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + .hero.is-light { + background-color: whitesmoke; + color: #363636; } + .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-light strong { + color: inherit; } + .hero.is-light .title { + color: #363636; } + .hero.is-light .subtitle { + color: rgba(54, 54, 54, 0.9); } + .hero.is-light .subtitle a:not(.button), + .hero.is-light .subtitle strong { + color: #363636; } + @media screen and (max-width: 1055px) { + .hero.is-light .navbar-menu { + background-color: whitesmoke; } } + .hero.is-light .navbar-item, + .hero.is-light .navbar-link { + color: rgba(54, 54, 54, 0.7); } + .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, + .hero.is-light .navbar-link:hover, + .hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .hero.is-light .tabs a { + color: #363636; + opacity: 0.9; } + .hero.is-light .tabs a:hover { + opacity: 1; } + .hero.is-light .tabs li.is-active a { + opacity: 1; } + .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { + color: #363636; } + .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } + .hero.is-dark, .content kbd.hero { + background-color: #363636; + color: whitesmoke; } + .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-dark strong, + .content kbd.hero strong { + color: inherit; } + .hero.is-dark .title, .content kbd.hero .title { + color: whitesmoke; } + .hero.is-dark .subtitle, .content kbd.hero .subtitle { + color: rgba(245, 245, 245, 0.9); } + .hero.is-dark .subtitle a:not(.button), .content kbd.hero .subtitle a:not(.button), + .hero.is-dark .subtitle strong, + .content kbd.hero .subtitle strong { + color: whitesmoke; } + @media screen and (max-width: 1055px) { + .hero.is-dark .navbar-menu, .content kbd.hero .navbar-menu { + background-color: #363636; } } + .hero.is-dark .navbar-item, .content kbd.hero .navbar-item, + .hero.is-dark .navbar-link, + .content kbd.hero .navbar-link { + color: rgba(245, 245, 245, 0.7); } + .hero.is-dark a.navbar-item:hover, .content kbd.hero a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, .content kbd.hero a.navbar-item.is-active, + .hero.is-dark .navbar-link:hover, + .content kbd.hero .navbar-link:hover, + .hero.is-dark .navbar-link.is-active, + .content kbd.hero .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .hero.is-dark .tabs a, .content kbd.hero .tabs a { + color: whitesmoke; + opacity: 0.9; } + .hero.is-dark .tabs a:hover, .content kbd.hero .tabs a:hover { + opacity: 1; } + .hero.is-dark .tabs li.is-active a, .content kbd.hero .tabs li.is-active a { + opacity: 1; } + .hero.is-dark .tabs.is-boxed a, .content kbd.hero .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .content kbd.hero .tabs.is-toggle a { + color: whitesmoke; } + .hero.is-dark .tabs.is-boxed a:hover, .content kbd.hero .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-dark .tabs.is-boxed li.is-active a, .content kbd.hero .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .content kbd.hero .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .hero.is-dark.is-bold, .content kbd.hero.is-bold { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } + @media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu, .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } + .hero.is-primary, .docstring > section > a.hero.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-primary strong, + .docstring > section > a.hero.docs-sourcelink strong { + color: inherit; } + .hero.is-primary .title, .docstring > section > a.hero.docs-sourcelink .title { + color: #fff; } + .hero.is-primary .subtitle, .docstring > section > a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-primary .subtitle a:not(.button), .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), + .hero.is-primary .subtitle strong, + .docstring > section > a.hero.docs-sourcelink .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-primary .navbar-menu, .docstring > section > a.hero.docs-sourcelink .navbar-menu { + background-color: #4eb5de; } } + .hero.is-primary .navbar-item, .docstring > section > a.hero.docs-sourcelink .navbar-item, + .hero.is-primary .navbar-link, + .docstring > section > a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-primary a.navbar-item:hover, .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, + .hero.is-primary .navbar-link:hover, + .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, + .hero.is-primary .navbar-link.is-active, + .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .hero.is-primary .tabs a, .docstring > section > a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-primary .tabs a:hover, .docstring > section > a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; } + .hero.is-primary .tabs li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; } + .hero.is-primary .tabs.is-boxed a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; } + .hero.is-primary .tabs.is-boxed a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-primary .tabs.is-boxed li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #4eb5de; } + .hero.is-primary.is-bold, .docstring > section > a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } + @media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu, .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } } + .hero.is-link { + background-color: #2e63b8; + color: #fff; } + .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-link strong { + color: inherit; } + .hero.is-link .title { + color: #fff; } + .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-link .subtitle a:not(.button), + .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-link .navbar-menu { + background-color: #2e63b8; } } + .hero.is-link .navbar-item, + .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, + .hero.is-link .navbar-link:hover, + .hero.is-link .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-link .tabs a:hover { + opacity: 1; } + .hero.is-link .tabs li.is-active a { + opacity: 1; } + .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { + color: #fff; } + .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #2e63b8; } + .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } + @media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } } + .hero.is-info { + background-color: #209cee; + color: #fff; } + .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-info strong { + color: inherit; } + .hero.is-info .title { + color: #fff; } + .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-info .subtitle a:not(.button), + .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-info .navbar-menu { + background-color: #209cee; } } + .hero.is-info .navbar-item, + .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, + .hero.is-info .navbar-link:hover, + .hero.is-info .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-info .tabs a:hover { + opacity: 1; } + .hero.is-info .tabs li.is-active a { + opacity: 1; } + .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { + color: #fff; } + .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #209cee; } + .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } + @media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } } + .hero.is-success { + background-color: #22c35b; + color: #fff; } + .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-success strong { + color: inherit; } + .hero.is-success .title { + color: #fff; } + .hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-success .subtitle a:not(.button), + .hero.is-success .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-success .navbar-menu { + background-color: #22c35b; } } + .hero.is-success .navbar-item, + .hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, + .hero.is-success .navbar-link:hover, + .hero.is-success .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .hero.is-success .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-success .tabs a:hover { + opacity: 1; } + .hero.is-success .tabs li.is-active a { + opacity: 1; } + .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { + color: #fff; } + .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #22c35b; } + .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } + @media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } } + .hero.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-warning strong { + color: inherit; } + .hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-warning .subtitle a:not(.button), + .hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); } + @media screen and (max-width: 1055px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; } } + .hero.is-warning .navbar-item, + .hero.is-warning .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, + .hero.is-warning .navbar-link:hover, + .hero.is-warning .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-warning .tabs a:hover { + opacity: 1; } + .hero.is-warning .tabs li.is-active a { + opacity: 1; } + .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } + @media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } } + .hero.is-danger { + background-color: #da0b00; + color: #fff; } + .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-danger strong { + color: inherit; } + .hero.is-danger .title { + color: #fff; } + .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-danger .subtitle a:not(.button), + .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-danger .navbar-menu { + background-color: #da0b00; } } + .hero.is-danger .navbar-item, + .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, + .hero.is-danger .navbar-link:hover, + .hero.is-danger .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-danger .tabs a:hover { + opacity: 1; } + .hero.is-danger .tabs li.is-active a { + opacity: 1; } + .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { + color: #fff; } + .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #da0b00; } + .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } + @media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } } + .hero.is-small .hero-body, #documenter .docs-sidebar form.docs-search > input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; } + @media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; } } + @media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; } } + .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + .hero.is-halfheight { + min-height: 50vh; } + .hero.is-fullheight { + min-height: 100vh; } + +.hero-video { + overflow: hidden; } + .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + .hero-video { + display: none; } } +.hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; } + +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + +.section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1056px) { + .section.is-medium { + padding: 9rem 1.5rem; } + .section.is-large { + padding: 18rem 1.5rem; } } +.footer { + background-color: #fafafa; + padding: 3rem 1.5rem 6rem; } + +h1 .docs-heading-anchor, h1 .docs-heading-anchor:hover, h1 .docs-heading-anchor:visited, h2 .docs-heading-anchor, h2 .docs-heading-anchor:hover, h2 .docs-heading-anchor:visited, h3 .docs-heading-anchor, h3 .docs-heading-anchor:hover, h3 .docs-heading-anchor:visited, h4 .docs-heading-anchor, h4 .docs-heading-anchor:hover, h4 .docs-heading-anchor:visited, h5 .docs-heading-anchor, h5 .docs-heading-anchor:hover, h5 .docs-heading-anchor:visited, h6 .docs-heading-anchor, h6 .docs-heading-anchor:hover, h6 .docs-heading-anchor:visited { + color: #222222; } + +h1 .docs-heading-anchor-permalink, h2 .docs-heading-anchor-permalink, h3 .docs-heading-anchor-permalink, h4 .docs-heading-anchor-permalink, h5 .docs-heading-anchor-permalink, h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; } + h1 .docs-heading-anchor-permalink::before, h2 .docs-heading-anchor-permalink::before, h3 .docs-heading-anchor-permalink::before, h4 .docs-heading-anchor-permalink::before, h5 .docs-heading-anchor-permalink::before, h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; } + +h1:hover .docs-heading-anchor-permalink, h2:hover .docs-heading-anchor-permalink, h3:hover .docs-heading-anchor-permalink, h4:hover .docs-heading-anchor-permalink, h5:hover .docs-heading-anchor-permalink, h6:hover .docs-heading-anchor-permalink { + visibility: visible; } + +.docs-dark-only { + display: none !important; } + +pre { + position: relative; + overflow: hidden; } + pre code, pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; } + pre code:first-of-type, pre code.hljs:first-of-type { + padding-top: 0.5rem !important; } + pre code:last-of-type, pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; } + pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #222222; + cursor: pointer; + text-align: center; } + pre .copy-button:focus, pre .copy-button:hover { + opacity: 1; + background: rgba(34, 34, 34, 0.1); + color: #2e63b8; } + pre .copy-button.success { + color: #259a12; + opacity: 1; } + pre .copy-button.error { + color: #cb3c33; + opacity: 1; } + pre:hover .copy-button { + opacity: 1; } + +.admonition { + background-color: #b5b5b5; + border-style: solid; + border-width: 1px; + border-color: #363636; + border-radius: 4px; + font-size: 1rem; } + .admonition strong { + color: currentColor; } + .admonition.is-small, #documenter .docs-sidebar form.docs-search > input.admonition { + font-size: 0.75rem; } + .admonition.is-medium { + font-size: 1.25rem; } + .admonition.is-large { + font-size: 1.5rem; } + .admonition.is-default { + background-color: #b5b5b5; + border-color: #363636; } + .admonition.is-default > .admonition-header { + background-color: #363636; + color: #fff; } + .admonition.is-default > .admonition-body { + color: #fff; } + .admonition.is-info { + background-color: #def0fc; + border-color: #209cee; } + .admonition.is-info > .admonition-header { + background-color: #209cee; + color: #fff; } + .admonition.is-info > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-success { + background-color: #bdf4d1; + border-color: #22c35b; } + .admonition.is-success > .admonition-header { + background-color: #22c35b; + color: #fff; } + .admonition.is-success > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-warning { + background-color: #fff3c5; + border-color: #ffdd57; } + .admonition.is-warning > .admonition-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .admonition.is-warning > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-danger { + background-color: #ffaba7; + border-color: #da0b00; } + .admonition.is-danger > .admonition-header { + background-color: #da0b00; + color: #fff; } + .admonition.is-danger > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-compat { + background-color: #bdeff5; + border-color: #1db5c9; } + .admonition.is-compat > .admonition-header { + background-color: #1db5c9; + color: #fff; } + .admonition.is-compat > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + +.admonition-header { + color: #fff; + background-color: #363636; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; } + .admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; } + +.admonition-body { + color: #222222; + padding: 0.5rem 0.75rem; } + .admonition-body pre { + background-color: whitesmoke; } + .admonition-body code { + background-color: rgba(0, 0, 0, 0.05); } + +.docstring { + margin-bottom: 1em; + background-color: transparent; + border: 1px solid #dbdbdb; + box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); + max-width: 100%; } + .docstring > header { + display: flex; + flex-grow: 1; + align-items: stretch; + padding: 0.5rem 0.75rem; + background-color: whitesmoke; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #dbdbdb; } + .docstring > header code { + background-color: transparent; } + .docstring > header .docstring-binding { + margin-right: 0.3em; } + .docstring > header .docstring-category { + margin-left: 0.3em; } + .docstring > section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #dbdbdb; } + .docstring > section:last-child { + border-bottom: none; } + .docstring > section > a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; } + .docstring > section > a.docs-sourcelink:focus { + opacity: 1 !important; } + .docstring:hover > section > a.docs-sourcelink { + opacity: 0.2; } + .docstring:focus-within > section > a.docs-sourcelink { + opacity: 0.2; } + .docstring > section:hover a.docs-sourcelink { + opacity: 1; } + +.documenter-example-output { + background-color: white; } + +.outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #ffaba7; + color: rgba(0, 0, 0, 0.7); + border-bottom: 3px solid #da0b00; + padding: 10px 35px; + text-align: center; + font-size: 15px; } + .outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; } + .outdated-warning-overlay a { + color: #2e63b8; } + .outdated-warning-overlay a:hover { + color: #363636; } + +.content pre { + border: 1px solid #dbdbdb; } + +.content code { + font-weight: inherit; } + +.content a code { + color: #2e63b8; } + +.content h1 code, .content h2 code, .content h3 code, .content h4 code, .content h5 code, .content h6 code { + color: #222222; } + +.content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; } + +.content blockquote > ul:first-child, .content blockquote > ol:first-child, .content .admonition-body > ul:first-child, .content .admonition-body > ol:first-child { + margin-top: 0; } + +pre, code { + font-variant-ligatures: no-contextual; } + +.breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; } + .breadcrumb a.is-disabled, .breadcrumb a.is-disabled:hover { + color: #222222; } + +.hljs { + background: initial !important; } + +.katex .katex-mathml { + top: 0; + right: 0; } + +.katex-display, mjx-container, .MathJax_Display { + margin: 0.5em 0 !important; } + +html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; } + +li.no-marker { + list-style: none; } + +/* This file contain the overall layout. + * + * The main container is
that is identified by id #documenter. + */ +#documenter .docs-main > article { + overflow-wrap: break-word; } + #documenter .docs-main > article .math-container { + overflow-x: auto; + overflow-y: hidden; } + +@media screen and (min-width: 1056px) { + #documenter .docs-main { + max-width: 52rem; + margin-left: 20rem; + padding-right: 1rem; } } + +@media screen and (max-width: 1055px) { + #documenter .docs-main { + width: 100%; } + #documenter .docs-main > article { + max-width: 52rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; } + #documenter .docs-main > header, #documenter .docs-main > nav { + max-width: 100%; + width: 100%; + margin: 0; } } + +#documenter .docs-main header.docs-navbar { + background-color: white; + border-bottom: 1px solid #dbdbdb; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; } + #documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; } + #documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; } + #documenter .docs-main header.docs-navbar .docs-right .docs-icon, #documenter .docs-main header.docs-navbar .docs-right .docs-label, #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; } + #documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; } + #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; } + #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; } + #documenter .docs-main header.docs-navbar > * { + margin: auto 0; } + @media screen and (max-width: 1055px) { + #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + /* For Headroom.js */ + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + /* Safari */ + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + /* Safari */ } + #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #bbb; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } + #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } } +#documenter .docs-main section.footnotes { + border-top: 1px solid #dbdbdb; } + #documenter .docs-main section.footnotes li .tag:first-child, #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, #documenter .docs-main section.footnotes li .content kbd:first-child, .content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; } + +#documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #dbdbdb; + padding-top: 1rem; + padding-bottom: 1rem; } + @media screen and (max-width: 1055px) { + #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; } } + #documenter .docs-main .docs-footer .docs-footer-nextpage, #documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; } + #documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; } + #documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; } + #documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; } + +#documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #0a0a0a; + background-color: whitesmoke; + border-right: 1px solid #dbdbdb; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 1rem; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; + /* Setting up a nicer theme style for the scrollbar */ } + #documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #bbb; } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar.visible { + box-shadow: none; } } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar { + left: 0; + top: 0; } } + #documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; } + #documenter .docs-sidebar .docs-logo > img { + max-height: 6rem; + margin: auto; } + #documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; } + #documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; } + #documenter .docs-sidebar .docs-package-name a, #documenter .docs-sidebar .docs-package-name a:hover { + color: #0a0a0a; } + #documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #dbdbdb; + display: none; + padding: 0.5rem; } + #documenter .docs-sidebar .docs-version-selector.visible { + display: flex; } + #documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #dbdbdb; + padding-bottom: 1.5rem; + /* Managing collapsible submenus */ } + #documenter .docs-sidebar ul.docs-menu > li > .tocitem { + font-weight: bold; } + #documenter .docs-sidebar ul.docs-menu > li li { + font-size: 0.95rem; + margin-left: 1em; + border-left: 1px solid #dbdbdb; } + #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; } + #documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; } + #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { + display: block; } + #documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 0.75rem; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; } + #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { + content: "\f078"; } + #documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; } + #documenter .docs-sidebar ul.docs-menu .tocitem, #documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #0a0a0a; + background: whitesmoke; } + #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #0a0a0a; + background-color: #ebebeb; } + #documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #dbdbdb; + border-bottom: 1px solid #dbdbdb; + background-color: white; } + #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: white; + color: #0a0a0a; } + #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #ebebeb; + color: #0a0a0a; } + #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { + border-top: none; } + #documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #dbdbdb; } + #documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 0.85rem; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; } + #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; } + #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; } + #documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + #documenter .docs-sidebar form.docs-search > input { + width: 14.4rem; } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: .3rem; + background: none; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #cccccc; } } + @media screen and (max-width: 1055px) { + #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + #documenter .docs-sidebar::-webkit-scrollbar { + width: .3rem; + background: none; } + #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; } + #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #cccccc; } } +#documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; } + +#documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; } + #documenter .docs-main #documenter-search-results li { + margin-left: 2rem; } + #documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; } + +.ansi span.sgr1 { + font-weight: bolder; } + +.ansi span.sgr2 { + font-weight: lighter; } + +.ansi span.sgr3 { + font-style: italic; } + +.ansi span.sgr4 { + text-decoration: underline; } + +.ansi span.sgr7 { + color: white; + background-color: #222222; } + +.ansi span.sgr8 { + color: transparent; } + .ansi span.sgr8 span { + color: transparent; } + +.ansi span.sgr9 { + text-decoration: line-through; } + +.ansi span.sgr30 { + color: #242424; } + +.ansi span.sgr31 { + color: #a7201f; } + +.ansi span.sgr32 { + color: #066f00; } + +.ansi span.sgr33 { + color: #856b00; } + +.ansi span.sgr34 { + color: #2149b0; } + +.ansi span.sgr35 { + color: #7d4498; } + +.ansi span.sgr36 { + color: #007989; } + +.ansi span.sgr37 { + color: gray; } + +.ansi span.sgr40 { + background-color: #242424; } + +.ansi span.sgr41 { + background-color: #a7201f; } + +.ansi span.sgr42 { + background-color: #066f00; } + +.ansi span.sgr43 { + background-color: #856b00; } + +.ansi span.sgr44 { + background-color: #2149b0; } + +.ansi span.sgr45 { + background-color: #7d4498; } + +.ansi span.sgr46 { + background-color: #007989; } + +.ansi span.sgr47 { + background-color: gray; } + +.ansi span.sgr90 { + color: #616161; } + +.ansi span.sgr91 { + color: #cb3c33; } + +.ansi span.sgr92 { + color: #0e8300; } + +.ansi span.sgr93 { + color: #a98800; } + +.ansi span.sgr94 { + color: #3c5dcd; } + +.ansi span.sgr95 { + color: #9256af; } + +.ansi span.sgr96 { + color: #008fa3; } + +.ansi span.sgr97 { + color: whitesmoke; } + +.ansi span.sgr100 { + background-color: #616161; } + +.ansi span.sgr101 { + background-color: #cb3c33; } + +.ansi span.sgr102 { + background-color: #0e8300; } + +.ansi span.sgr103 { + background-color: #a98800; } + +.ansi span.sgr104 { + background-color: #3c5dcd; } + +.ansi span.sgr105 { + background-color: #9256af; } + +.ansi span.sgr106 { + background-color: #008fa3; } + +.ansi span.sgr107 { + background-color: whitesmoke; } + +code.language-julia-repl > span.hljs-meta { + color: #066f00; + font-weight: bolder; } + +/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/ +/* +This is left on purpose making default.css the single file that can be lifted +as-is from the repository directly without the need for a build step + +Typically this "required" baseline CSS is added by `makestuff.js` during build. +*/ +pre code.hljs { + display: block; + overflow-x: auto; } + +code.hljs { + padding: 3px 5px; } + +/* end baseline CSS */ +.hljs { + background: #F0F0F0; + color: #444; } + +/* Base color: saturation 0; */ +.hljs-subst { + /* default */ } + +/* purposely ignored */ +.hljs-comment { + color: #888888; } + +.hljs-tag, +.hljs-punctuation { + color: #444a; } + +.hljs-tag .hljs-name, +.hljs-tag .hljs-attr { + color: #444; } + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta .hljs-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; } + +/* User color: hue: 0 */ +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; } + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; } + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-operator, +.hljs-selector-pseudo { + color: #BC6060; } + +/* Language color: hue: 90; */ +.hljs-literal { + color: #78A960; } + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; } + +/* Meta color: hue: 200 */ +.hljs-meta { + color: #1f7199; } + +.hljs-meta .hljs-string { + color: #4d99bf; } + +/* Misc effects */ +.hljs-emphasis { + font-style: italic; } + +.hljs-strong { + font-weight: bold; } diff --git a/previews/PR326/assets/themeswap.js b/previews/PR326/assets/themeswap.js new file mode 100644 index 00000000..c58e993e --- /dev/null +++ b/previews/PR326/assets/themeswap.js @@ -0,0 +1,66 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Intialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if(window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the browser supports user color preference + var darkPreference = false; + // Check if the users preference is for dark color scheme + if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) { + darkPreference = true; + } + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; var disabled = []; var darkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if(themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null); + // Check if the theme is primary dark theme + var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null); + // If ss is for dark theme then set the value of darkTheme to the name of the theme + if(isDarkTheme) darkTheme = themename; + // If we find a matching theme (and it's not the default), we'll set active to non-null + if(themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if(themename !== theme) disabled.push(ss); + } + if(active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + theme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + else if(darkTheme !== null && darkPreference === true) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + darkTheme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) { + ss.disabled = true; + } + }); + } +} +set_theme_from_local_storage(); diff --git a/previews/PR326/assets/warner.js b/previews/PR326/assets/warner.js new file mode 100644 index 00000000..5531c885 --- /dev/null +++ b/previews/PR326/assets/warner.js @@ -0,0 +1,49 @@ +function maybeAddWarning () { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return + }; + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return + }; + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return + }; + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement('meta'); + meta.name = 'robots'; + meta.content = 'noindex'; + + document.getElementsByTagName('head')[0].appendChild(meta); + }; + + const div = document.createElement('div'); + div.classList.add('outdated-warning-overlay'); + const closer = document.createElement('button'); + closer.classList.add('outdated-warning-closer', 'delete'); + closer.addEventListener('click', function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE; + div.innerHTML = 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +}; + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', maybeAddWarning); +} else { + maybeAddWarning(); +}; diff --git a/previews/PR326/contributing/index.html b/previews/PR326/contributing/index.html new file mode 100644 index 00000000..d68f9e9f --- /dev/null +++ b/previews/PR326/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

Contributors' Guide

This is a short guide for potential GeophysicalFlows.jl contributors.

Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

What can I do?

  • Tackle an existing issue.

  • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

  • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

  • Improve documentation, docstrings, or comments if you found something is hard to use.

  • Implement a new feature (e.g., a new diagnostic into a module).

  • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

Ground Rules

  • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
  • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
  • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
  • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

Reporting a bug

The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

  • Head over to the issues page.
  • Search to see if your issue already exists or has even been solved previously.
  • If you indeed have a new issue or request, click the "New Issue" button.
  • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

Setting up your development environment

  • Install Julia on your system.
  • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
  • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
  • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
    git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
  • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
  • Connect your repository to the upstream (main project).
    git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
  • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
  • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

Your development environment is now ready!

Pull Requests

Changes and contributions should be made via GitHub pull requests against the main branch.

When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

Documentation

All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
+julia --project=docs/ docs/make.jl

and then open docs/build/index.html in your favorite browser.

Credits

This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

diff --git a/previews/PR326/gpu/index.html b/previews/PR326/gpu/index.html new file mode 100644 index 00000000..ac7b7afe --- /dev/null +++ b/previews/PR326/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

GPU

GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
+Problem
+  ├─────────── grid: grid (on GPU)
+  ├───── parameters: params
+  ├────── variables: vars
+  ├─── state vector: sol
+  ├─────── equation: eqn
+  ├────────── clock: clock
+  └──── timestepper: RK4TimeStepper

Selecting GPU device

FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

diff --git a/previews/PR326/index.html b/previews/PR326/index.html new file mode 100644 index 00000000..d4f05f11 --- /dev/null +++ b/previews/PR326/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

GeophysicalFlows.jl Documentation

Overview

GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

Examples

Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

Fourier transforms normalization

Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

\[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

\[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

Read more in the FourierFlows.jl Documentation; see Grids section.

Unicode

Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

Read more about Unicode symbols in the Julia Documentation.

Developers

The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

Citing

If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

The bibtex entry for the paper is:

@article{GeophysicalFlowsJOSS,
+  doi = {10.21105/joss.03053},
+  url = {https://doi.org/10.21105/joss.03053},
+  year = {2021},
+  publisher = {The Open Journal},
+  volume = {6},
+  number = {60},
+  pages = {3053},
+  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
+  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
+  journal = {Journal of Open Source Software}
+}

Papers using GeophysicalFlows.jl

  1. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

  2. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.

  3. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.

  4. Drivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.

  5. Palóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

  6. Karrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

diff --git a/previews/PR326/installation_instructions/index.html b/previews/PR326/installation_instructions/index.html new file mode 100644 index 00000000..326a4c0d --- /dev/null +++ b/previews/PR326/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

Installation instructions

You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

julia>]
+(v1.6) pkg> add GeophysicalFlows
+(v1.6) pkg> instantiate

We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

(v1.6) pkg> update GeophysicalFlows

Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

Use Julia 1.6 or newer

The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1

diff --git a/previews/PR326/lib/functions/index.html b/previews/PR326/lib/functions/index.html new file mode 100644 index 00000000..bfa1fb7f --- /dev/null +++ b/previews/PR326/lib/functions/index.html @@ -0,0 +1,89 @@ + +Functions · GeophysicalFlows.jl

Functions

GeophysicalFlows

Exported functions

GeophysicalFlows.lambdipoleFunction
lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

source
GeophysicalFlows.peakedisotropicspectrumFunction
peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

source

TwoDNavierStokes

Exported functions

GeophysicalFlows.TwoDNavierStokes.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 ny = nx,
+                 Lx = 2π,
+                 Ly = Lx,
+                  ν = 0,
+                 nν = 1,
+                  μ = 0,
+                 nμ = 0,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a two-dimensional Navier-Stokes problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Large-scale (hypo)-viscosity coefficient.
  • : (Hypo)-viscosity order, $≤ 0$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.TwoDNavierStokes.energy_workFunction
energy_work(prob)

Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

\[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

where $ψ$ is the stream flow.

source
GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
enstrophy_work(prob)

Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

\[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

where $ζ$ is the relative vorticity.

source

Private functions

GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

\[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

source
GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
energy_dissipation(prob, ξ, νξ)

Return the domain-averaged energy dissipation rate done by the viscous term,

\[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

source
GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
enstrophy_dissipation(prob, ξ, νξ)

Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

\[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

source

SingleLayerQG

Exported functions

GeophysicalFlows.SingleLayerQG.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 ny = nx,
+                 Lx = 2π,
+                 Ly = Lx,
+                  β = 0.0,
+ deformation_radius = Inf,
+                eta = nothing,
+                  ν = 0.0,
+                 nν = 1,
+                  μ = 0.0,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a single-layer quasi-geostrophic problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • β: Planetary vorticity $y$-gradient.
  • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
  • eta: Topographic potential vorticity.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Linear drag coefficient.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source

Private functions

GeophysicalFlows.SingleLayerQG.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

\[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

source

MultiLayerQG

Exported functions

GeophysicalFlows.MultiLayerQG.ProblemFunction
Problem(nlayers :: Int,
+                    dev = CPU();
+                     nx = 128,
+                     ny = nx,
+                     Lx = 2π,
+                     Ly = Lx,
+                     f₀ = 1.0,
+                      β = 0.0,
+                      g = 1.0,
+                      U = zeros(nlayers),
+                      H = 1/nlayers * ones(nlayers),
+                      ρ = Array{Float64}(1:nlayers),
+                    eta = nothing,
+topographic_pv_gradient = (0, 0),
+                      μ = 0,
+                      ν = 0,
+                     nν = 1,
+                     dt = 0.01,
+                stepper = "RK4",
+                 calcFq = nothingfunction,
+             stochastic = false,
+                 linear = false,
+       aliased_fraction = 1/3,
+                      T = Float64)

Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

Arguments

  • nlayers: (required) Number of fluid layers.
  • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • f₀: Constant planetary vorticity.
  • β: Planetary vorticity $y$-gradient.
  • g: Gravitational acceleration constant.
  • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
  • H: Rest height of each fluid layer.
  • ρ: Density of each fluid layer.
  • eta: Periodic component of the topographic potential vorticity.
  • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
  • μ: Linear bottom drag coefficient.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
  • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64 (default); floating point type used for problem data.
source
GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
streamfunctionfrompv!(ψh, qh, params, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

source
streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

source
streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

\[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

\[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

source
GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
pvfromstreamfunction!(qh, ψh, params, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

source
pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

source
pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

\[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) * (ψ̂₂ - ψ̂₁) ,\]

\[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) * (ψ̂₁ - ψ̂₂) .\]

(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

source

Private functions

GeophysicalFlows.MultiLayerQG.LinearEquationFunction
LinearEquation(params, grid)

Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

The nonlinear term is computed via function calcNlinear!.

source
GeophysicalFlows.MultiLayerQG.calcS!Function
calcS!(S, Fp, Fm, nlayers, grid)

Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

source
GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
calcS⁻¹!(S, Fp, Fm, nlayers, grid)

Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

source
GeophysicalFlows.MultiLayerQG.calcNlinear!Function
calcNlinear!(N, sol, t, clock, vars, params, grid)

Compute the nonlinear term of the linearized equations:

\[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

source
GeophysicalFlows.MultiLayerQG.calcN_advection!Function
calcN_advection!(N, sol, vars, params, grid)

Compute the advection term and stores it in N:

\[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

source
GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
calcN_linearadvection!(N, sol, vars, params, grid)

Compute the advection term of the linearized equations and stores it in N:

\[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

source

SurfaceQG

Exported functions

GeophysicalFlows.SurfaceQG.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 Lx = 2π,
+                 ny = nx,
+                 Ly = Lx,
+                  ν = 0,
+                 nν = 1,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a surface quasi-geostrophic problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source
GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
buoyancy_dissipation(prob)

Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

\[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

source
GeophysicalFlows.SurfaceQG.buoyancy_workFunction
buoyancy_work(prob)
+buoyancy_work(sol, vars, grid)

Return the domain-averaged rate of work of buoyancy variance by the forcing,

\[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

source

Private functions

GeophysicalFlows.SurfaceQG.calcN_advection!Function
calcN_advection!(N, sol, t, clock, vars, params, grid)

Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

\[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

source

BarotropicQGQL

Exported functions

GeophysicalFlows.BarotropicQGQL.ProblemFunction
Problem(dev::Device = CPU();
+                 nx = 256,
+                 ny = nx,
+                 Lx = 2π,
+                 Ly = Lx,
+                  β = 0.0,
+                eta = nothing,
+                  ν = 0.0,
+                 nν = 1,
+                  μ = 0.0,
+                 dt = 0.01,
+            stepper = "RK4",
+              calcF = nothingfunction,
+         stochastic = false,
+   aliased_fraction = 1/3,
+                  T = Float64)

Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

Arguments

  • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

Keyword arguments

  • nx: Number of grid points in $x$-domain.
  • ny: Number of grid points in $y$-domain.
  • Lx: Extent of the $x$-domain.
  • Ly: Extent of the $y$-domain.
  • β: Planetary vorticity $y$-gradient.
  • eta: Topographic potential vorticity.
  • ν: Small-scale (hyper)-viscosity coefficient.
  • : (Hyper)-viscosity order, $≥ 1$.
  • μ: Linear drag coefficient.
  • dt: Time-step.
  • stepper: Time-stepping method.
  • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
  • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
  • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
  • T: Float32 or Float64; floating point type used for problem data.
source

Private functions

diff --git a/previews/PR326/lib/types/index.html b/previews/PR326/lib/types/index.html new file mode 100644 index 00000000..6ae3eb80 --- /dev/null +++ b/previews/PR326/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

Private types

TwoDNavierStokes

GeophysicalFlows.TwoDNavierStokes.ParamsType
struct Params{T} <: AbstractParams

The parameters for a two-dimensional Navier-Stokes problem:

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • μ::Any: large-scale (hypo)-viscosity coefficient

  • nμ::Int64: (hypo)-viscosity order, $≤ 0$

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.TwoDNavierStokes.VarsType
struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

The variables for two-dimensional Navier-Stokes problem:

  • ζ: relative vorticity

  • u: x-component of velocity

  • v: y-component of velocity

  • ζh: Fourier transform of relative vorticity

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

SingleLayerQG

GeophysicalFlows.SingleLayerQG.ParamsType
struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

The parameters for the SingleLayerQG problem.

  • β::Any: planetary vorticity $y$-gradient

  • deformation_radius::Any: Rossby radius of deformation

  • eta::Any: topographic potential vorticity

  • etah::Any: Fourier transform of topographic potential vorticity

  • μ::Any: linear drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.SingleLayerQG.VarsType
struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

The variables for SingleLayer QG:

  • q: relative vorticity (+ vortex stretching)

  • ψ: streamfunction

  • u: $x$-component of velocity

  • v: $y$-component of velocity

  • qh: Fourier transform of relative vorticity (+ vortex stretching)

  • ψh: Fourier transform of streamfunction

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

MultiLayerQG

GeophysicalFlows.MultiLayerQG.ParamsType
struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams

The parameters for the MultiLayerQG problem.

  • nlayers::Int64: number of fluid layers

  • g::Any: gravitational constant

  • f₀::Any: constant planetary vorticity

  • β::Any: planetary vorticity $y$-gradient

  • ρ::Any: array with density of each fluid layer

  • H::Any: array with rest height of each fluid layer

  • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

  • eta::Any: array containing the topographic PV

  • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

  • μ::Any: linear bottom drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

  • g′::Any: array with the reduced gravity constants for each fluid interface

  • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

  • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

  • S::Any: array containing coeffients for getting PV from streamfunction

  • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

  • rfftplan::Any: rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

The parameters for the a single-layer MultiLayerQG problem.

  • β::Any: planetary vorticity $y$-gradient

  • U::Any: array with imposed constant zonal flow $U(y)$

  • eta::Any: array containing the periodic component of the topographic PV

  • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

  • μ::Any: linear drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

  • Qx::Any: array containing $x$-gradient of PV due to topographic PV

  • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

  • rfftplan::Any: rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

The parameters for the a two-layer MultiLayerQG problem.

  • g::Any: gravitational constant

  • f₀::Any: constant planetary vorticity

  • β::Any: planetary vorticity $y$-gradient

  • ρ::Any: array with density of each fluid layer

  • H::Tuple: tuple with rest height of each fluid layer

  • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

  • eta::Any: array containing periodic component of the topographic PV

  • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

  • μ::Any: linear bottom drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

  • g′::Any: the reduced gravity constants for the fluid interface

  • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

  • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

  • rfftplan::Any: rfft plan for FFTs

source
GeophysicalFlows.MultiLayerQG.VarsType
struct Vars{Aphys, Atrans, F, P} <: AbstractVars

The variables for multi-layer QG problem.

  • q: relative vorticity + vortex stretching

  • ψ: streamfunction

  • u: x-component of velocity

  • v: y-component of velocity

  • qh: Fourier transform of relative vorticity + vortex stretching

  • ψh: Fourier transform of streamfunction

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fqh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

SurfaceQG

GeophysicalFlows.SurfaceQG.ParamsType
Params{T}(ν, nν, calcF!)

A struct containing the parameters for Surface QG dynamics. Included are:

  • ν::Any: buoyancy (hyper)-viscosity coefficient

  • nν::Int64: buoyancy (hyper)-viscosity order

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.SurfaceQG.VarsType
Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

The variables for surface QG problem:

  • b: buoyancy

  • u: $x$-component of velocity

  • v: $y$-component of velocity

  • bh: Fourier transform of buoyancy

  • uh: Fourier transform of $x$-component of velocity

  • vh: Fourier transform of $y$-component of velocity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source

BarotropicQGQL

GeophysicalFlows.BarotropicQGQL.ParamsType
Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

A struct containing the parameters for a barotropic QL QG problem. Included are:

  • β::Any: planetary vorticity $y$-gradient

  • eta::Any: topographic potential vorticity

  • etah::Any: Fourier transform of topographic potential vorticity

  • μ::Any: linear drag coefficient

  • ν::Any: small-scale (hyper)-viscosity coefficient

  • nν::Int64: (hyper)-viscosity order, $≥ 1$

  • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

source
GeophysicalFlows.BarotropicQGQL.VarsType
Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

The variables for barotropic QL QG:

  • u: $x$-component of small-scale velocity

  • v: $y$-component of small-scale velocity

  • U: $x$-component of large-scale velocity

  • uzeta: small-scale $u′ζ′$

  • vzeta: small-scale $v′ζ′$

  • zeta: small-scale relative vorticity

  • Zeta: large-scale relative vorticity

  • psi: small-scale streamfunction

  • Psi: large-scale streamfunction

  • Nz: small-scale nonlinear term

  • NZ: large-scale nonlinear term

  • uh: Fourier transform of $x$-component of small-scale velocity

  • vh: Fourier transform of $y$-component of small-scale velocity

  • Uh: Fourier transform of $x$-component of large-scale velocity

  • zetah: Fourier transform of small-scale relative vorticity

  • Zetah: Fourier transform of large-scale relative vorticity

  • psih: Fourier transform of small-scale relative vorticity

  • Psih: Fourier transform of large-scale relative vorticity

  • Fh: Fourier transform of forcing

  • prevsol: sol at previous time-step

source
diff --git a/previews/PR326/modules/barotropicqgql/index.html b/previews/PR326/modules/barotropicqgql/index.html new file mode 100644 index 00000000..309d09ef --- /dev/null +++ b/previews/PR326/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

BarotropicQGQL

Basic Equations

This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

\[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g.,

As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

\[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

\[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

The state variable sol is the Fourier transform of vorticity, ζh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

The linear operator is constructed in Equation

GeophysicalFlows.BarotropicQGQL.EquationFunction
Equation(params, grid)

Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

Nonlinear term is computed via calcN! function.

source

and the nonlinear terms are computed via

GeophysicalFlows.BarotropicQGQL.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Diagnostics

The kinetic energy of the fluid is obtained via:

while the enstrophy via:

Other diagnostic include: dissipation, drag, and work.

Examples

  • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
diff --git a/previews/PR326/modules/multilayerqg/index.html b/previews/PR326/modules/multilayerqg/index.html new file mode 100644 index 00000000..7cd18ddf --- /dev/null +++ b/previews/PR326/modules/multilayerqg/index.html @@ -0,0 +1,46 @@ + +MultiLayerQG · GeophysicalFlows.jl

MultiLayerQG

From continuous to discrete

Under the quasi-geostrophic approximation with stratified dynamics both the horizontal flow, $u(x, y, z, t)$, $v(x, y, z, t)$, and the buoyancy $b(x, y, z, t)$ are obtained via a streamfunction $\psi(x, y, z, t)$:

\[\begin{aligned} + u &= - \partial_y \psi , \\ + v &= \partial_x \psi , \\ + b &= f_0 \partial_z \psi . +\end{aligned}\]

The dynamics are determined from the quasi-geostrophic potential vorticity (QGPV)

\[\begin{aligned} + q &= \partial_x v - \partial_y u + \partial_z \left( \frac{f_0}{N^2} b \right) , \\ + &= (\partial_x^2 + \partial_y^2) \psi + \partial_z \left( \frac{f_0^2}{N^2} \partial_z \psi \right) . +\end{aligned}\]

where $N^2 = - \rho_0^{-1} g \, \mathrm{d} \rho / \mathrm{d}z$ is the square of the Brunt-Väisälä frequency for a Boussinesq fluid, where $\rho_0$ is a reference density and $g$ the gravitational constant.

To go from the continuous (in $z$) dynamics above to a discrete dynamics we can integrate all quantities over the height of each fluid layer. An alternative is to replace the vertical derivatives that appear both in the buoyancy definition and in the Brunt-Väisälä frequency with a discrete approximation.

We use subscripts $j$ to denote quantities that are constant within each fluid layer. For example, the heights of each fluid layer are $H_j$, $j = 1, \dots, n$, where $n$ is the number of fluid layers. Also, $\rho_j$ is the density of each layer and $\psi_j$ and $q_j$ the streamfunction and QGPV associated with that fluid layer.

The buoyancy is associated with the fluid interfaces. We use semi-integer subscript values to denote a fluid interface, e.g., $b_{5/2}$ is the buoyancy that corresponds to the interface between fluid layers 2 and 3. Thus, from the relationship that connects buoyancy $b$ and streamfunction $\psi$ we approximate the buoyancies at each interface as

\[ b_{j+1/2} = f_0 \frac{\psi_j - \psi_{j+1}}{(H_j + H_{j+1})/2} .\]

Above we divided the difference of streamfunction at the two layers with the distance between the center of the two layers, $(H_j + H_{j+1})/2$.

Similarly, since the Brunt-Väisälä frequency is proportional to the $z$-derivative of the density, it also corresponds to the fluid interfaces, i.e.,

\[ N^2_{j+1/2} = - \frac{g}{\rho_0} \frac{\rho_j - \rho_{j+1}}{(H_j + H_{j+1})/2} .\]

Combining the above we have that the vortex stretching term for the $j$-th layer is

\[\begin{aligned} + \left . \partial_z \left( \frac{f_0}{N^2} b \right) \right |_{j} & = \frac{1}{H_j} \left( \frac{f_0}{N^2_{j-1/2}} b_{j-1/2} - \frac{f_0}{N^2_{j+1/2}} b_{j+1/2} \right ) \\ + & = \frac{1}{H_j} \left[ \dfrac{f_0}{- \frac{g}{\rho_0} \frac{\rho_{j-1} - \rho_{j}}{(H_{j-1}+H_{j})/2}} f_0 \frac{\psi_{j-1} - \psi_{j}}{(H_{j-1}+H_{j})/2} - \dfrac{f_0}{- \frac{g}{\rho_0} \frac{\rho_j - \rho_{j+1}}{(H_j+H_{j+1})/2}} f_0 \frac{\psi_j - \psi_{j+1}}{(H_j+H_{j+1})/2} \right ] \\ + & = \frac{1}{H_j} \left[\dfrac{f_0^2}{g \frac{\rho_j - \rho_{j-1} }{\rho_0}} (\psi_{j-1} - \psi_j) - \dfrac{f_0^2}{g \frac{\rho_{j+1} - \rho_j}{\rho_0}} (\psi_j - \psi_{j+1}) \right ] \\ + & = \dfrac{f_0^2}{g'_{j-1/2} H_j} (\psi_{j-1} - \psi_j) - \dfrac{f_0^2}{g'_{j+1/2} H_j} (\psi_j - \psi_{j+1}) , +\end{aligned}\]

where above we defined the reduced gravity that corresponds to the $j+1/2$ interface

\[ g'_{j+1/2} = g \frac{\rho_{j+1} - \rho_j}{\rho_0} .\]

Τhe the reference density $\rho_0$ appears in the denominator of the reduced gravity. One can use the mean density as the reference density, e.g.,

\[ \rho_0 = \dfrac{\sum_j \rho_j H_j}{\sum_j H_j} .\]

Basic Equations

This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

The QGPV in each layer is

\[ \mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

\[\begin{aligned} + q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1), \\ + sq_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1, \\ + q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n). +\end{aligned}\]

with

\[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} .\]

In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

\[\begin{pmatrix} + \widehat{q}_{𝐤, 1} \\ + \vdots \\ + \widehat{q}_{𝐤, n} +\end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} + \widehat{\psi}_{𝐤, 1} \\ + \vdots \\ + \widehat{\psi}_{𝐤, n} +\end{pmatrix}\]

where

\[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0 \\ + F_{3/2, 2} & -(F_{3/2, 2} + F_{5/2, 2}) & F_{5/2, 2} & & \vdots \\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

\[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

with

\[\begin{aligned} + \partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . + \partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1 - \delta_{j, 1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j, n} \partial_y \eta , \\ +\end{aligned}\]

Implementation

Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params under params.Qx and params.Qy.

One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(ψh, qh, params, grid), while the inverse, i.e., obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, ψh, params, grid).

The equations of motion are time-stepped forward in Fourier space:

\[ \partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} + + \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

The linear operator is constructed in Equation

GeophysicalFlows.MultiLayerQG.EquationFunction
Equation(params, grid)

Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

The nonlinear term is computed via function calcN!.

source
GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
hyperviscosity(params, grid)

Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

\[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

source

The nonlinear terms are computed via

GeophysicalFlows.MultiLayerQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

\[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

source

which in turn calls calcN_advection! and addforcing!.

Linearized MultiLayerQG dynamics

The MultiLayerQG module includes also version of the dynamics that is linearized about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

Parameters and Variables

All required parameters are gathered in Params and all module variables are found in Vars.

For a problem without any forcing ($F = 0$), vars is constructed with DecayingVars. For the forced problems ($F \ne 0$) the vars is constructed either via ForcedVars when the forcing is deterministic or via StochasticForcedVars when the forcing is stochastic.

Helper functions

GeophysicalFlows.MultiLayerQG.set_ψ!Function
set_ψ!(params, vars, grid, sol, ψ)
+set_ψ!(prob, ψ)

Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

source

Diagnostics

The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

GeophysicalFlows.MultiLayerQG.energiesFunction
energies(vars, params, grid, sol)
+energies(prob)

Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

The kinetic energy at the $j$-th fluid layer is

\[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

\[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

source

The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

GeophysicalFlows.MultiLayerQG.fluxesFunction
fluxes(vars, params, grid, sol)
+fluxes(prob)

Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

The lateral eddy fluxes within the $j$-th fluid layer are

\[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

\[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

source

Examples

diff --git a/previews/PR326/modules/singlelayerqg/index.html b/previews/PR326/modules/singlelayerqg/index.html new file mode 100644 index 00000000..1c47c244 --- /dev/null +++ b/previews/PR326/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

SingleLayerQG

Basic Equations

This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

\[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

The dynamical variable is $q$. Thus, the equation solved by the module is:

\[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

The linear operator is constructed in Equation

GeophysicalFlows.SingleLayerQG.EquationFunction
Equation(params::BarotropicQGParams, grid)

Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

The nonlinear term is computed via calcN! function.

source
Equation(params::EquivalentBarotropicQGParams, grid)

Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

\[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

The nonlinear term is computed via calcN! function.

source

The nonlinear terms are computed via

GeophysicalFlows.SingleLayerQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Some helper functions included in the module are:

Diagnostics

The kinetic energy of the fluid is computed via:

GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
kinetic_energy(prob)

Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

source

while the potential energy, for an equivalent barotropic fluid, is computed via:

GeophysicalFlows.SingleLayerQG.potential_energyFunction
potential_energy(prob)

Return the problem's (prob) domain-averaged potential energy of the fluid,

\[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

source

The total energy is:

GeophysicalFlows.SingleLayerQG.energyFunction
energy(prob)

Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

source

Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

Examples

diff --git a/previews/PR326/modules/surfaceqg/index.html b/previews/PR326/modules/surfaceqg/index.html new file mode 100644 index 00000000..635ea3d0 --- /dev/null +++ b/previews/PR326/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

SurfaceQG

Basic Equations

This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

\[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

The SQG model evolves the surface buoyancy,

\[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

\[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

\[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

Implementation

The buoyancy equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

The linear operator is constructed in Equation

GeophysicalFlows.SurfaceQG.EquationFunction
Equation(params, grid)

Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

\[L = - ν |𝐤|^{2 n_ν} .\]

Plain old viscocity corresponds to $n_ν=1$.

The nonlinear term is computed via function calcN!().

source

while the nonlinear terms via

GeophysicalFlows.SurfaceQG.calcN!Function
calcN!(N, sol, t, clock, vars, params, grid)

Calculate the nonlinear term, that is the advection term and the forcing,

\[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

source

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Diagnostics

Some useful diagnostics are kinetic energy and buoyancy variance.

GeophysicalFlows.SurfaceQG.kinetic_energyFunction
kinetic_energy(prob)

Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

In SQG, this is identical to half the domain-averaged surface buoyancy variance.

source
GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
buoyancy_variance(prob)

Return the buoyancy variance,

\[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

source

Other diagnostic include: buoyancy_dissipation and buoyancy_work.

Examples

  • examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.

    Capet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.

diff --git a/previews/PR326/modules/twodnavierstokes/index.html b/previews/PR326/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..65b4b044 --- /dev/null +++ b/previews/PR326/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

TwoDNavierStokes

Basic Equations

This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

\[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

Implementation

The equation is time-stepped forward in Fourier space:

\[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

The state variable sol is the Fourier transform of vorticity, ζh.

The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

The linear operator is constructed in Equation

GeophysicalFlows.TwoDNavierStokes.EquationFunction
Equation(params, grid)

Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

\[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

The nonlinear term is computed via the function calcN!.

source

The nonlinear terms are computed via calcN!,

which in turn calls calcN_advection! and addforcing!.

Parameters and Variables

All required parameters are included inside Params and all module variables are included inside Vars.

For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

Helper functions

Some helper functions included in the module are:

Diagnostics

Some useful diagnostics are:

GeophysicalFlows.TwoDNavierStokes.energyFunction
energy(prob)

Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

\[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

where $ψ$ is the streamfunction.

source
GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
enstrophy(prob)

Return the problem's (prob) domain-averaged enstrophy,

\[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

where $ζ$ is the relative vorticity.

source

Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

Examples

diff --git a/previews/PR326/search/index.html b/previews/PR326/search/index.html new file mode 100644 index 00000000..47a26f51 --- /dev/null +++ b/previews/PR326/search/index.html @@ -0,0 +1,2 @@ + +Search · GeophysicalFlows.jl

Loading search...

    diff --git a/previews/PR326/search_index.js b/previews/PR326/search_index.js new file mode 100644 index 00000000..bf977ea3 --- /dev/null +++ b/previews/PR326/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#From-continuous-to-discrete","page":"MultiLayerQG","title":"From continuous to discrete","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Under the quasi-geostrophic approximation with stratified dynamics both the horizontal flow, u(x y z t), v(x y z t), and the buoyancy b(x y z t) are obtained via a streamfunction psi(x y z t):","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\n u = - partial_y psi \n v = partial_x psi \n b = f_0 partial_z psi \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The dynamics are determined from the quasi-geostrophic potential vorticity (QGPV)","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\n q = partial_x v - partial_y u + partial_z left( fracf_0N^2 b right) \n = (partial_x^2 + partial_y^2) psi + partial_z left( fracf_0^2N^2 partial_z psi right) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where N^2 = - rho_0^-1 g mathrmd rho mathrmdz is the square of the Brunt-Väisälä frequency for a Boussinesq fluid, where rho_0 is a reference density and g the gravitational constant.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"To go from the continuous (in z) dynamics above to a discrete dynamics we can integrate all quantities over the height of each fluid layer. An alternative is to replace the vertical derivatives that appear both in the buoyancy definition and in the Brunt-Väisälä frequency with a discrete approximation.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"We use subscripts j to denote quantities that are constant within each fluid layer. For example, the heights of each fluid layer are H_j, j = 1 dots n, where n is the number of fluid layers. Also, rho_j is the density of each layer and psi_j and q_j the streamfunction and QGPV associated with that fluid layer.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The buoyancy is associated with the fluid interfaces. We use semi-integer subscript values to denote a fluid interface, e.g., b_52 is the buoyancy that corresponds to the interface between fluid layers 2 and 3. Thus, from the relationship that connects buoyancy b and streamfunction psi we approximate the buoyancies at each interface as","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":" b_j+12 = f_0 fracpsi_j - psi_j+1(H_j + H_j+1)2 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Above we divided the difference of streamfunction at the two layers with the distance between the center of the two layers, (H_j + H_j+1)2.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Similarly, since the Brunt-Väisälä frequency is proportional to the z-derivative of the density, it also corresponds to the fluid interfaces, i.e.,","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":" N^2_j+12 = - fracgrho_0 fracrho_j - rho_j+1(H_j + H_j+1)2 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Combining the above we have that the vortex stretching term for the j-th layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\n left partial_z left( fracf_0N^2 b right) right _j = frac1H_j left( fracf_0N^2_j-12 b_j-12 - fracf_0N^2_j+12 b_j+12 right ) \n = frac1H_j left dfracf_0- fracgrho_0 fracrho_j-1 - rho_j(H_j-1+H_j)2 f_0 fracpsi_j-1 - psi_j(H_j-1+H_j)2 - dfracf_0- fracgrho_0 fracrho_j - rho_j+1(H_j+H_j+1)2 f_0 fracpsi_j - psi_j+1(H_j+H_j+1)2 right \n = frac1H_j leftdfracf_0^2g fracrho_j - rho_j-1 rho_0 (psi_j-1 - psi_j) - dfracf_0^2g fracrho_j+1 - rho_jrho_0 (psi_j - psi_j+1) right \n = dfracf_0^2g_j-12 H_j (psi_j-1 - psi_j) - dfracf_0^2g_j+12 H_j (psi_j - psi_j+1) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where above we defined the reduced gravity that corresponds to the j+12 interface","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":" g_j+12 = g fracrho_j+1 - rho_jrho_0 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Τhe the reference density rho_0 appears in the denominator of the reduced gravity. One can use the mean density as the reference density, e.g.,","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":" rho_0 = dfracsum_j rho_j H_jsum_j H_j ","category":"page"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":" mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\n q_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \n sq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \n q_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n)\nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix\n widehatq_𝐤 1 \n vdots \n widehatq_𝐤 n\nendpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix\n widehatpsi_𝐤 1 \n vdots \n widehatpsi_𝐤 n\nendpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0 \n F_32 2 -(F_32 2 + F_52 2) F_52 2 vdots \n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\n partial_x Q_j equiv delta_j n partial_x eta \n partial_y Q_j equiv beta - partial_y^2 U_j - (1 - delta_j 1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_j n partial_y eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params under params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(ψh, qh, params, grid), while the inverse, i.e., obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, ψh, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":" partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n + widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also version of the dynamics that is linearized about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are gathered in Params and all module variables are found in Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For a problem without any forcing (F = 0), vars is constructed with DecayingVars. For the forced problems (F ne 0) the vars is constructed either via ForcedVars when the forcing is deterministic or via StochasticForcedVars when the forcing is stochastic.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.\nCapet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia>]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that oftentimes this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Any: array with density of each fluid layer\nH::Any: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Any: array with density of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Farrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. J. Atmos. Sci., 60, 2101-2118.\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. J. Atmos. Sci., 69 (5), 1633-1656.\nConstantinou, N. C., Farrell, B. F., and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. J. Atmos. Sci., 71 (5), 1818-1842.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. J. Fluid Mech., 146, 21-43.\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n g = 1.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n ρ = Array{Float64}(1:nlayers),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\ng: Gravitational acceleration constant.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nρ: Density of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) * (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) * (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.\nDrivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.\nPalóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/previews/PR326/siteinfo.js b/previews/PR326/siteinfo.js new file mode 100644 index 00000000..343587f3 --- /dev/null +++ b/previews/PR326/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "previews/PR326"; diff --git a/previews/PR326/stochastic_forcing/index.html b/previews/PR326/stochastic_forcing/index.html new file mode 100644 index 00000000..71e90b61 --- /dev/null +++ b/previews/PR326/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that oftentimes this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/previews/PR326/visualize/index.html b/previews/PR326/visualize/index.html new file mode 100644 index 00000000..0b8b63f4 --- /dev/null +++ b/previews/PR326/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/stable b/stable index c06eba1a..23fed31c 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v0.15.0 \ No newline at end of file +v0.16.1 \ No newline at end of file diff --git a/v0.15 b/v0.15 index c06eba1a..3149f401 120000 --- a/v0.15 +++ b/v0.15 @@ -1 +1 @@ -v0.15.0 \ No newline at end of file +v0.15.4 \ No newline at end of file diff --git a/v0.15.1/aliasing/index.html b/v0.15.1/aliasing/index.html new file mode 100644 index 00000000..aa985e22 --- /dev/null +++ b/v0.15.1/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

    Aliasing

    In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

    De-aliasing scheme

    FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

    julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
    +
    +julia> OneDimensionalGrid
    +         ├─────────── Device: CPU
    +         ├──────── FloatType: Float64
    +         ├────────── size Lx: 6.283185307179586
    +         ├──── resolution nx: 64
    +         ├── grid spacing dx: 0.09817477042468103
    +         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
    +         └─ aliased fraction: 0.5

    or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

    julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
    +Problem
    +  ├─────────── grid: grid (on CPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper
    +  
    +julia> prob.grid.aliased_fraction
    +0.5

    Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

    All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

    To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

    diff --git a/v0.15.1/assets/README/index.html b/v0.15.1/assets/README/index.html new file mode 100644 index 00000000..0472eff1 --- /dev/null +++ b/v0.15.1/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/v0.15.1/assets/documenter.js b/v0.15.1/assets/documenter.js new file mode 100644 index 00000000..6adfbbbf --- /dev/null +++ b/v0.15.1/assets/documenter.js @@ -0,0 +1,331 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fas", "fa-copy"); + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-times"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-times"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function() { + $('#documenter .docs-navbar').headroom({ + "tolerance": {"up": 10, "down": 10}, + }); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function() { + var settings = $('#documenter-settings'); + $('#documenter-settings-button').click(function(){ + settings.toggleClass('is-active'); + }); + // Close the dialog if X is clicked + $('#documenter-settings button.delete').click(function(){ + settings.removeClass('is-active'); + }); + // Close dialog if ESC is pressed + $(document).keyup(function(e) { + if (e.keyCode == 27) settings.removeClass('is-active'); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function() { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button") + sidebar_button.click(function(ev) { + ev.preventDefault(); + sidebar.toggleClass('visible'); + if (sidebar.hasClass('visible')) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind('click', function(ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + }); +}) + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function() { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css('max-width'), 10); + var L0 = e.width(); + if(L0 > L) { + var h0 = parseInt(e.css('font-size'), 10); + e.css('font-size', L * h0 / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on('orientationchange', resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function() { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if(typeof active !== 'undefined') { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +function set_theme(theme) { + var active = null; + var disabled = []; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + var themename = ss.ownerNode.getAttribute("data-theme-name"); + if(themename === null) continue; // ignore non-theme stylesheets + // Find the active theme + if(themename === theme) active = ss; + else disabled.push(ss); + } + if(active !== null) { + active.disabled = false; + if(active.ownerNode.getAttribute("data-theme-primary") === null) { + document.getElementsByTagName('html')[0].className = "theme--" + theme; + } else { + document.getElementsByTagName('html')[0].className = ""; + } + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + + // Store the theme in localStorage + if(typeof(window.localStorage) !== "undefined") { + window.localStorage.setItem("documenter-theme", theme); + } else { + console.error("Browser does not support window.localStorage"); + } +} + +// Theme picker setup +$(document).ready(function() { + // onchange callback + $('#documenter-themepicker').change(function themepick_callback(ev){ + var themename = $('#documenter-themepicker option:selected').attr('value'); + set_theme(themename); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if(typeof(window.localStorage) !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if(theme !== null) { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = (e.value === theme); + }) + } else { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = $("html").hasClass(`theme--${e.value}`); + }) + } + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function() { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function(x) { + target_href = version_selector_select.children("option:selected").get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) { + var option = $(""); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== 'undefined') { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function(i,x){return x.text}); + DOC_VERSIONS.forEach(function(each) { + var version_url = documenterBaseURL + "/../" + each; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $(""); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}) + +}) diff --git a/v0.15.1/assets/energy_budgets_Ito.svg b/v0.15.1/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..5de31295 --- /dev/null +++ b/v0.15.1/assets/energy_budgets_Ito.svg @@ -0,0 +1,1390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.1/assets/energy_budgets_Stratonovich.svg b/v0.15.1/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..80045065 --- /dev/null +++ b/v0.15.1/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.1/assets/energy_comparison.svg b/v0.15.1/assets/energy_comparison.svg new file mode 100644 index 00000000..33e52435 --- /dev/null +++ b/v0.15.1/assets/energy_comparison.svg @@ -0,0 +1,616 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.1/assets/search.js b/v0.15.1/assets/search.js new file mode 100644 index 00000000..c133f741 --- /dev/null +++ b/v0.15.1/assets/search.js @@ -0,0 +1,267 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min', + 'lodash': 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + } +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'lunr', 'lodash'], function($, lunr, _) { + +$(document).ready(function() { + // parseUri 1.2.2 + // (c) Steven Levithan + // MIT License + function parseUri (str) { + var o = parseUri.options, + m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) uri[o.key[i]] = m[i] || ""; + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) uri[o.q.name][$1] = $2; + }); + + return uri; + }; + parseUri.options = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } + }; + + $("#search-form").submit(function(e) { + e.preventDefault() + }) + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'does', + 'either', + 'ever', + 'every', + 'from', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'into', + 'it', + 'its', + 'just', + 'least', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'who', + 'whom', + 'why', + 'will', + 'would', + 'yet', + 'you', + 'your' + ]) + + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!" + // would not find anything if searching for "add!", only for the entire qualification + lunr.tokenizer.separator = /[\s\-\.]+/ + + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '') + }) + } + + lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter') + lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer') + + var index = lunr(function () { + this.ref('location') + this.field('title',{boost: 100}) + this.field('text') + documenterSearchIndex['docs'].forEach(function(e) { + this.add(e) + }, this) + }) + var store = {} + + documenterSearchIndex['docs'].forEach(function(e) { + store[e.location] = {title: e.title, category: e.category, page: e.page} + }) + + $(function(){ + searchresults = $('#documenter-search-results'); + searchinfo = $('#documenter-search-info'); + searchbox = $('#documenter-search-query'); + searchform = $('.docs-search'); + sidebar = $('.docs-sidebar'); + function update_search(querystring) { + tokens = lunr.tokenizer(querystring) + results = index.query(function (q) { + tokens.forEach(function (t) { + q.term(t.toString(), { + fields: ["title"], + boost: 100, + usePipeline: true, + editDistance: 0, + wildcard: lunr.Query.wildcard.NONE + }) + q.term(t.toString(), { + fields: ["title"], + boost: 10, + usePipeline: true, + editDistance: 2, + wildcard: lunr.Query.wildcard.NONE + }) + q.term(t.toString(), { + fields: ["text"], + boost: 1, + usePipeline: true, + editDistance: 0, + wildcard: lunr.Query.wildcard.NONE + }) + }) + }) + searchinfo.text("Number of results: " + results.length) + searchresults.empty() + results.forEach(function(result) { + data = store[result.ref] + link = $(''+data.title+'') + link.attr('href', documenterBaseURL+'/'+result.ref) + if (data.category != "page"){ + cat = $('('+data.category+', '+data.page+')') + } else { + cat = $('('+data.category+')') + } + li = $('
  • ').append(link).append(" ").append(cat) + searchresults.append(li) + }) + } + + function update_search_box() { + querystring = searchbox.val() + update_search(querystring) + } + + searchbox.keyup(_.debounce(update_search_box, 250)) + searchbox.change(update_search_box) + + // Disable enter-key form submission for the searchbox on the search page + // and just re-run search rather than refresh the whole page. + searchform.keypress( + function(event){ + if (event.which == '13') { + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + update_search_box(); + event.preventDefault(); + } + } + ); + + search_query_uri = parseUri(window.location).queryKey["q"] + if(search_query_uri !== undefined) { + search_query = decodeURIComponent(search_query_uri.replace(/\+/g, '%20')) + searchbox.val(search_query) + } + update_search_box(); + }) +}) + +}) diff --git a/v0.15.1/assets/themes/documenter-dark.css b/v0.15.1/assets/themes/documenter-dark.css new file mode 100644 index 00000000..0bf1af7d --- /dev/null +++ b/v0.15.1/assets/themes/documenter-dark.css @@ -0,0 +1,7702 @@ +@charset "UTF-8"; +/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +html.theme--documenter-dark .tabs, html.theme--documenter-dark .pagination-previous, +html.theme--documenter-dark .pagination-next, +html.theme--documenter-dark .pagination-link, +html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .breadcrumb, html.theme--documenter-dark .file, html.theme--documenter-dark .button, .is-unselectable, html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after, html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +html.theme--documenter-dark .admonition:not(:last-child), html.theme--documenter-dark .tabs:not(:last-child), html.theme--documenter-dark .message:not(:last-child), html.theme--documenter-dark .list:not(:last-child), html.theme--documenter-dark .level:not(:last-child), html.theme--documenter-dark .breadcrumb:not(:last-child), html.theme--documenter-dark .highlight:not(:last-child), html.theme--documenter-dark .block:not(:last-child), html.theme--documenter-dark .title:not(:last-child), +html.theme--documenter-dark .subtitle:not(:last-child), html.theme--documenter-dark .table-container:not(:last-child), html.theme--documenter-dark .table:not(:last-child), html.theme--documenter-dark .progress:not(:last-child), html.theme--documenter-dark .notification:not(:last-child), html.theme--documenter-dark .content:not(:last-child), html.theme--documenter-dark .box:not(:last-child) { + margin-bottom: 1.5rem; } + +html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before, html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before { + height: 2px; + width: 50%; } + html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { + height: 50%; + width: 2px; } + html.theme--documenter-dark .modal-close:hover, html.theme--documenter-dark .delete:hover, html.theme--documenter-dark .modal-close:focus, html.theme--documenter-dark .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + html.theme--documenter-dark .modal-close:active, html.theme--documenter-dark .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + html.theme--documenter-dark .is-small.modal-close, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.modal-close, html.theme--documenter-dark .is-small.delete, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + html.theme--documenter-dark .is-medium.modal-close, html.theme--documenter-dark .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + html.theme--documenter-dark .is-large.modal-close, html.theme--documenter-dark .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +html.theme--documenter-dark .control.is-loading::after, html.theme--documenter-dark .select.is-loading::after, html.theme--documenter-dark .loader, html.theme--documenter-dark .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdee0; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +html.theme--documenter-dark .hero-video, html.theme--documenter-dark .modal-background, html.theme--documenter-dark .modal, html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, +html.theme--documenter-dark .image.is-square .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, +html.theme--documenter-dark .image.is-1by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, +html.theme--documenter-dark .image.is-5by4 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, +html.theme--documenter-dark .image.is-4by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, +html.theme--documenter-dark .image.is-3by2 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, +html.theme--documenter-dark .image.is-5by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, +html.theme--documenter-dark .image.is-16by9 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, +html.theme--documenter-dark .image.is-2by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, +html.theme--documenter-dark .image.is-3by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, +html.theme--documenter-dark .image.is-4by5 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, +html.theme--documenter-dark .image.is-3by4 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, +html.theme--documenter-dark .image.is-2by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, +html.theme--documenter-dark .image.is-3by5 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, +html.theme--documenter-dark .image.is-9by16 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, +html.theme--documenter-dark .image.is-1by2 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, +html.theme--documenter-dark .image.is-1by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +html.theme--documenter-dark .pagination-previous, +html.theme--documenter-dark .pagination-next, +html.theme--documenter-dark .pagination-link, +html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .file-cta, +html.theme--documenter-dark .file-name, html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 0.4em; + box-shadow: none; + display: inline-flex; + font-size: 15px; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; } + html.theme--documenter-dark .pagination-previous:focus, + html.theme--documenter-dark .pagination-next:focus, + html.theme--documenter-dark .pagination-link:focus, + html.theme--documenter-dark .pagination-ellipsis:focus, html.theme--documenter-dark .file-cta:focus, + html.theme--documenter-dark .file-name:focus, html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .button:focus, html.theme--documenter-dark .is-focused.pagination-previous, + html.theme--documenter-dark .is-focused.pagination-next, + html.theme--documenter-dark .is-focused.pagination-link, + html.theme--documenter-dark .is-focused.pagination-ellipsis, html.theme--documenter-dark .is-focused.file-cta, + html.theme--documenter-dark .is-focused.file-name, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-focused.button, html.theme--documenter-dark .pagination-previous:active, + html.theme--documenter-dark .pagination-next:active, + html.theme--documenter-dark .pagination-link:active, + html.theme--documenter-dark .pagination-ellipsis:active, html.theme--documenter-dark .file-cta:active, + html.theme--documenter-dark .file-name:active, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .button:active, html.theme--documenter-dark .is-active.pagination-previous, + html.theme--documenter-dark .is-active.pagination-next, + html.theme--documenter-dark .is-active.pagination-link, + html.theme--documenter-dark .is-active.pagination-ellipsis, html.theme--documenter-dark .is-active.file-cta, + html.theme--documenter-dark .is-active.file-name, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .is-active.button { + outline: none; } + html.theme--documenter-dark .pagination-previous[disabled], + html.theme--documenter-dark .pagination-next[disabled], + html.theme--documenter-dark .pagination-link[disabled], + html.theme--documenter-dark .pagination-ellipsis[disabled], html.theme--documenter-dark .file-cta[disabled], + html.theme--documenter-dark .file-name[disabled], html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .pagination-previous, html.theme--documenter-dark fieldset[disabled] .pagination-previous, + fieldset[disabled] html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark fieldset[disabled] .pagination-next, + fieldset[disabled] html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark fieldset[disabled] .pagination-link, + fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis, + html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis, fieldset[disabled] html.theme--documenter-dark .file-cta, html.theme--documenter-dark fieldset[disabled] .file-cta, + fieldset[disabled] html.theme--documenter-dark .file-name, + html.theme--documenter-dark fieldset[disabled] .file-name, fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark fieldset[disabled] .select select, html.theme--documenter-dark .select fieldset[disabled] select, html.theme--documenter-dark fieldset[disabled] .textarea, html.theme--documenter-dark fieldset[disabled] .input, html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] html.theme--documenter-dark .button, html.theme--documenter-dark fieldset[disabled] .button { + cursor: not-allowed; } + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; } + +audio { + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: left; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 15px !important; } + +.is-size-7, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + font-size: 0.85em !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 15px !important; } + .is-size-7-mobile { + font-size: 0.85em !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 15px !important; } + .is-size-7-tablet { + font-size: 0.85em !important; } } + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 15px !important; } + .is-size-7-touch { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 15px !important; } + .is-size-7-desktop { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 15px !important; } + .is-size-7-widescreen { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 15px !important; } + .is-size-7-fullhd { + font-size: 0.85em !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: #ecf0f1 !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #cfd9db !important; } + +.has-background-light { + background-color: #ecf0f1 !important; } + +.has-text-dark { + color: #282f2f !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #111414 !important; } + +.has-background-dark { + background-color: #282f2f !important; } + +.has-text-primary { + color: #375a7f !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #28415b !important; } + +.has-background-primary { + background-color: #375a7f !important; } + +.has-text-link { + color: #1abc9c !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #148f77 !important; } + +.has-background-link { + background-color: #1abc9c !important; } + +.has-text-info { + color: #024c7d !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #012d4b !important; } + +.has-background-info { + background-color: #024c7d !important; } + +.has-text-success { + color: #008438 !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #005122 !important; } + +.has-background-success { + background-color: #008438 !important; } + +.has-text-warning { + color: #ad8100 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #7a5b00 !important; } + +.has-background-warning { + background-color: #ad8100 !important; } + +.has-text-danger { + color: #9e1b0d !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #6f1309 !important; } + +.has-background-danger { + background-color: #9e1b0d !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #282f2f !important; } + +.has-background-grey-darker { + background-color: #282f2f !important; } + +.has-text-grey-dark { + color: #343c3d !important; } + +.has-background-grey-dark { + background-color: #343c3d !important; } + +.has-text-grey { + color: #5e6d6f !important; } + +.has-background-grey { + background-color: #5e6d6f !important; } + +.has-text-grey-light { + color: #8c9b9d !important; } + +.has-background-grey-light { + background-color: #8c9b9d !important; } + +.has-text-grey-lighter { + color: #dbdee0 !important; } + +.has-background-grey-lighter { + background-color: #dbdee0 !important; } + +.has-text-white-ter { + color: #ecf0f1 !important; } + +.has-background-white-ter { + background-color: #ecf0f1 !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-family-code { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-relative { + position: relative !important; } + +html.theme--documenter-dark { + /* This file contain the overall layout. + * + * The main container is
    that is identified by id #documenter. + */ + /*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/ + /* Comment */ + /* Red */ + /* Orange */ + /* Yellow */ + /* Green */ + /* Blue */ + /* Purple */ } + html.theme--documenter-dark html { + background-color: #1f2424; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + html.theme--documenter-dark article, + html.theme--documenter-dark aside, + html.theme--documenter-dark figure, + html.theme--documenter-dark footer, + html.theme--documenter-dark header, + html.theme--documenter-dark hgroup, + html.theme--documenter-dark section { + display: block; } + html.theme--documenter-dark body, + html.theme--documenter-dark button, + html.theme--documenter-dark input, + html.theme--documenter-dark select, + html.theme--documenter-dark textarea { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + html.theme--documenter-dark code, + html.theme--documenter-dark pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } + html.theme--documenter-dark body { + color: #fff; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + html.theme--documenter-dark a { + color: #1abc9c; + cursor: pointer; + text-decoration: none; } + html.theme--documenter-dark a strong { + color: currentColor; } + html.theme--documenter-dark a:hover { + color: #1dd2af; } + html.theme--documenter-dark code { + background-color: rgba(255, 255, 255, 0.05); + color: #ececec; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; } + html.theme--documenter-dark hr { + background-color: #282f2f; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + html.theme--documenter-dark img { + height: auto; + max-width: 100%; } + html.theme--documenter-dark input[type="checkbox"], + html.theme--documenter-dark input[type="radio"] { + vertical-align: baseline; } + html.theme--documenter-dark small { + font-size: 0.875em; } + html.theme--documenter-dark span { + font-style: inherit; + font-weight: inherit; } + html.theme--documenter-dark strong { + color: #f2f2f2; + font-weight: 700; } + html.theme--documenter-dark fieldset { + border: none; } + html.theme--documenter-dark pre { + -webkit-overflow-scrolling: touch; + background-color: #282f2f; + color: #fff; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + html.theme--documenter-dark pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + html.theme--documenter-dark table td, + html.theme--documenter-dark table th { + vertical-align: top; } + html.theme--documenter-dark table td:not([align]), + html.theme--documenter-dark table th:not([align]) { + text-align: left; } + html.theme--documenter-dark table th { + color: #f2f2f2; } + html.theme--documenter-dark .box { + background-color: #343c3d; + border-radius: 8px; + box-shadow: none; + color: #fff; + display: block; + padding: 1.25rem; } + html.theme--documenter-dark a.box:hover, html.theme--documenter-dark a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #1abc9c; } + html.theme--documenter-dark a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #1abc9c; } + html.theme--documenter-dark .button { + background-color: #282f2f; + border-color: #4c5759; + border-width: 1px; + color: #375a7f; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; } + html.theme--documenter-dark .button strong { + color: inherit; } + html.theme--documenter-dark .button .icon, html.theme--documenter-dark .button .icon.is-small, html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search > input.icon, html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search > input.icon, html.theme--documenter-dark .button .icon.is-medium, html.theme--documenter-dark .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + html.theme--documenter-dark .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; } + html.theme--documenter-dark .button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); } + html.theme--documenter-dark .button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); } + html.theme--documenter-dark .button:hover, html.theme--documenter-dark .button.is-hovered { + border-color: #8c9b9d; + color: #f2f2f2; } + html.theme--documenter-dark .button:focus, html.theme--documenter-dark .button.is-focused { + border-color: #8c9b9d; + color: #17a689; } + html.theme--documenter-dark .button:focus:not(:active), html.theme--documenter-dark .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .button:active, html.theme--documenter-dark .button.is-active { + border-color: #343c3d; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text { + background-color: transparent; + border-color: transparent; + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .button.is-text:hover, html.theme--documenter-dark .button.is-text.is-hovered, html.theme--documenter-dark .button.is-text:focus, html.theme--documenter-dark .button.is-text.is-focused { + background-color: #282f2f; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text:active, html.theme--documenter-dark .button.is-text.is-active { + background-color: #1d2122; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:hover, html.theme--documenter-dark .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:focus, html.theme--documenter-dark .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:focus:not(:active), html.theme--documenter-dark .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white { + background-color: white; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-hovered { + background-color: black; } + html.theme--documenter-dark .button.is-white.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + html.theme--documenter-dark .button.is-white.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-white.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:hover, html.theme--documenter-dark .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:focus, html.theme--documenter-dark .button.is-black.is-focused { + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:focus:not(:active), html.theme--documenter-dark .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-black.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-black.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-light { + background-color: #ecf0f1; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:hover, html.theme--documenter-dark .button.is-light.is-hovered { + background-color: #e5eaec; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:focus, html.theme--documenter-dark .button.is-light.is-focused { + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:focus:not(:active), html.theme--documenter-dark .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light.is-active { + background-color: #dde4e6; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light { + background-color: #ecf0f1; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-light.is-inverted { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-hovered { + background-color: #1d2122; } + html.theme--documenter-dark .button.is-light.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted { + background-color: #282f2f; + border-color: transparent; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-loading::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-light.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-outlined.is-focused { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-light.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #282f2f; + color: #282f2f; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #282f2f; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark, html.theme--documenter-dark .content kbd.button { + background-color: #282f2f; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover, html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered { + background-color: #232829; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused { + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:focus:not(:active), html.theme--documenter-dark .content kbd.button:focus:not(:active), html.theme--documenter-dark .button.is-dark.is-focused:not(:active), html.theme--documenter-dark .content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active { + background-color: #1d2122; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark[disabled], html.theme--documenter-dark .content kbd.button[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark, fieldset[disabled] html.theme--documenter-dark .content kbd.button { + background-color: #282f2f; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-dark.is-inverted, html.theme--documenter-dark .content kbd.button.is-inverted { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted:hover, html.theme--documenter-dark .content kbd.button.is-inverted:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered { + background-color: #dde4e6; } + html.theme--documenter-dark .button.is-dark.is-inverted[disabled], html.theme--documenter-dark .content kbd.button.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted { + background-color: #ecf0f1; + border-color: transparent; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-loading::after, html.theme--documenter-dark .content kbd.button.is-loading::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-dark.is-outlined, html.theme--documenter-dark .content kbd.button.is-outlined { + background-color: transparent; + border-color: #282f2f; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-outlined.is-focused { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-dark.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined { + background-color: transparent; + border-color: #282f2f; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-primary, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { + background-color: #375a7f; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink { + background-color: #335476; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:focus:not(:active), html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus:not(:active), html.theme--documenter-dark .button.is-primary.is-focused:not(:active), html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink { + background-color: #2f4d6d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary[disabled], html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { + background-color: #375a7f; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-primary.is-inverted, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-primary.is-inverted[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-primary.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #375a7f; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #375a7f; + border-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #375a7f #375a7f !important; } + html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-primary.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #375a7f; + box-shadow: none; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #375a7f #375a7f !important; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-link { + background-color: #1abc9c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:hover, html.theme--documenter-dark .button.is-link.is-hovered { + background-color: #18b193; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:focus, html.theme--documenter-dark .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:focus:not(:active), html.theme--documenter-dark .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link.is-active { + background-color: #17a689; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link { + background-color: #1abc9c; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-link.is-inverted { + background-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-link.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-link.is-outlined { + background-color: transparent; + border-color: #1abc9c; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-outlined.is-focused { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #1abc9c #1abc9c !important; } + html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-link.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined { + background-color: transparent; + border-color: #1abc9c; + box-shadow: none; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #1abc9c #1abc9c !important; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-info { + background-color: #024c7d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:hover, html.theme--documenter-dark .button.is-info.is-hovered { + background-color: #024470; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:focus, html.theme--documenter-dark .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:focus:not(:active), html.theme--documenter-dark .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info.is-active { + background-color: #023d64; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info { + background-color: #024c7d; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-info.is-inverted { + background-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-info.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-info.is-outlined { + background-color: transparent; + border-color: #024c7d; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-outlined.is-focused { + background-color: #024c7d; + border-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #024c7d #024c7d !important; } + html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-info.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined { + background-color: transparent; + border-color: #024c7d; + box-shadow: none; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #024c7d #024c7d !important; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-success { + background-color: #008438; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:hover, html.theme--documenter-dark .button.is-success.is-hovered { + background-color: #007733; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:focus, html.theme--documenter-dark .button.is-success.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:focus:not(:active), html.theme--documenter-dark .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success.is-active { + background-color: #006b2d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success { + background-color: #008438; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-success.is-inverted { + background-color: #fff; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-success.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-success.is-outlined { + background-color: transparent; + border-color: #008438; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-outlined.is-focused { + background-color: #008438; + border-color: #008438; + color: #fff; } + html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #008438 #008438 !important; } + html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-success.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined { + background-color: transparent; + border-color: #008438; + box-shadow: none; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #008438 #008438 !important; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-warning { + background-color: #ad8100; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:hover, html.theme--documenter-dark .button.is-warning.is-hovered { + background-color: #a07700; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:focus, html.theme--documenter-dark .button.is-warning.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:focus:not(:active), html.theme--documenter-dark .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning.is-active { + background-color: #946e00; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning { + background-color: #ad8100; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-warning.is-inverted { + background-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-warning.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ad8100; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-outlined.is-focused { + background-color: #ad8100; + border-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ad8100 #ad8100 !important; } + html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-warning.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ad8100; + box-shadow: none; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ad8100 #ad8100 !important; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-danger { + background-color: #9e1b0d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:hover, html.theme--documenter-dark .button.is-danger.is-hovered { + background-color: #92190c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:focus, html.theme--documenter-dark .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:focus:not(:active), html.theme--documenter-dark .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger.is-active { + background-color: #86170b; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger { + background-color: #9e1b0d; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-danger.is-inverted { + background-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-danger.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-danger.is-outlined { + background-color: transparent; + border-color: #9e1b0d; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-outlined.is-focused { + background-color: #9e1b0d; + border-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #9e1b0d #9e1b0d !important; } + html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-danger.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined { + background-color: transparent; + border-color: #9e1b0d; + box-shadow: none; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #9e1b0d #9e1b0d !important; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .button.is-normal { + font-size: 15px; } + html.theme--documenter-dark .button.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .button.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .button { + background-color: #8c9b9d; + border-color: #dbdee0; + box-shadow: none; + opacity: 0.5; } + html.theme--documenter-dark .button.is-fullwidth { + display: flex; + width: 100%; } + html.theme--documenter-dark .button.is-loading { + color: transparent !important; + pointer-events: none; } + html.theme--documenter-dark .button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; } + html.theme--documenter-dark .button.is-static { + background-color: #282f2f; + border-color: #5e6d6f; + color: #dbdee0; + box-shadow: none; + pointer-events: none; } + html.theme--documenter-dark .button.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .buttons .button { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + html.theme--documenter-dark .buttons:last-child { + margin-bottom: -0.5rem; } + html.theme--documenter-dark .buttons:not(:last-child) { + margin-bottom: 1rem; } + html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + html.theme--documenter-dark .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + html.theme--documenter-dark .buttons.has-addons .button:last-child { + margin-right: 0; } + html.theme--documenter-dark .buttons.has-addons .button:hover, html.theme--documenter-dark .buttons.has-addons .button.is-hovered { + z-index: 2; } + html.theme--documenter-dark .buttons.has-addons .button:focus, html.theme--documenter-dark .buttons.has-addons .button.is-focused, html.theme--documenter-dark .buttons.has-addons .button:active, html.theme--documenter-dark .buttons.has-addons .button.is-active, html.theme--documenter-dark .buttons.has-addons .button.is-selected { + z-index: 3; } + html.theme--documenter-dark .buttons.has-addons .button:focus:hover, html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover, html.theme--documenter-dark .buttons.has-addons .button:active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + html.theme--documenter-dark .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .buttons.is-centered { + justify-content: center; } + html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + html.theme--documenter-dark .buttons.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + html.theme--documenter-dark .container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .container { + max-width: 992px; } + html.theme--documenter-dark .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; } } + @media screen and (max-width: 1215px) { + html.theme--documenter-dark .container.is-widescreen { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + html.theme--documenter-dark .container.is-fullhd { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .container { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .container { + max-width: 1344px; } } + html.theme--documenter-dark .content li + li { + margin-top: 0.25em; } + html.theme--documenter-dark .content p:not(:last-child), + html.theme--documenter-dark .content dl:not(:last-child), + html.theme--documenter-dark .content ol:not(:last-child), + html.theme--documenter-dark .content ul:not(:last-child), + html.theme--documenter-dark .content blockquote:not(:last-child), + html.theme--documenter-dark .content pre:not(:last-child), + html.theme--documenter-dark .content table:not(:last-child) { + margin-bottom: 1em; } + html.theme--documenter-dark .content h1, + html.theme--documenter-dark .content h2, + html.theme--documenter-dark .content h3, + html.theme--documenter-dark .content h4, + html.theme--documenter-dark .content h5, + html.theme--documenter-dark .content h6 { + color: #f2f2f2; + font-weight: 600; + line-height: 1.125; } + html.theme--documenter-dark .content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + html.theme--documenter-dark .content h1:not(:first-child) { + margin-top: 1em; } + html.theme--documenter-dark .content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + html.theme--documenter-dark .content h2:not(:first-child) { + margin-top: 1.1428em; } + html.theme--documenter-dark .content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + html.theme--documenter-dark .content h3:not(:first-child) { + margin-top: 1.3333em; } + html.theme--documenter-dark .content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + html.theme--documenter-dark .content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + html.theme--documenter-dark .content h6 { + font-size: 1em; + margin-bottom: 1em; } + html.theme--documenter-dark .content blockquote { + background-color: #282f2f; + border-left: 5px solid #5e6d6f; + padding: 1.25em 1.5em; } + html.theme--documenter-dark .content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + html.theme--documenter-dark .content ol:not([type]) { + list-style-type: decimal; } + html.theme--documenter-dark .content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; } + html.theme--documenter-dark .content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; } + html.theme--documenter-dark .content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; } + html.theme--documenter-dark .content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; } + html.theme--documenter-dark .content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + html.theme--documenter-dark .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + html.theme--documenter-dark .content ul ul ul { + list-style-type: square; } + html.theme--documenter-dark .content dd { + margin-left: 2em; } + html.theme--documenter-dark .content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + html.theme--documenter-dark .content figure:not(:first-child) { + margin-top: 2em; } + html.theme--documenter-dark .content figure:not(:last-child) { + margin-bottom: 2em; } + html.theme--documenter-dark .content figure img { + display: inline-block; } + html.theme--documenter-dark .content figure figcaption { + font-style: italic; } + html.theme--documenter-dark .content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; } + html.theme--documenter-dark .content sup, + html.theme--documenter-dark .content sub { + font-size: 75%; } + html.theme--documenter-dark .content table { + width: 100%; } + html.theme--documenter-dark .content table td, + html.theme--documenter-dark .content table th { + border: 1px solid #5e6d6f; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + html.theme--documenter-dark .content table th { + color: #f2f2f2; } + html.theme--documenter-dark .content table th:not([align]) { + text-align: left; } + html.theme--documenter-dark .content table thead td, + html.theme--documenter-dark .content table thead th { + border-width: 0 0 2px; + color: #f2f2f2; } + html.theme--documenter-dark .content table tfoot td, + html.theme--documenter-dark .content table tfoot th { + border-width: 2px 0 0; + color: #f2f2f2; } + html.theme--documenter-dark .content table tbody tr:last-child td, + html.theme--documenter-dark .content table tbody tr:last-child th { + border-bottom-width: 0; } + html.theme--documenter-dark .content .tabs li + li { + margin-top: 0; } + html.theme--documenter-dark .content.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.content { + font-size: 0.85em; } + html.theme--documenter-dark .content.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .content.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + html.theme--documenter-dark .icon.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.icon { + height: 1rem; + width: 1rem; } + html.theme--documenter-dark .icon.is-medium { + height: 2rem; + width: 2rem; } + html.theme--documenter-dark .icon.is-large { + height: 3rem; + width: 3rem; } + html.theme--documenter-dark .image, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { + display: block; + position: relative; } + html.theme--documenter-dark .image img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img { + display: block; + height: auto; + width: 100%; } + html.theme--documenter-dark .image img.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img.is-rounded { + border-radius: 290486px; } + html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, + html.theme--documenter-dark .image.is-square .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, + html.theme--documenter-dark .image.is-1by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, + html.theme--documenter-dark .image.is-5by4 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, + html.theme--documenter-dark .image.is-4by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, + html.theme--documenter-dark .image.is-3by2 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, + html.theme--documenter-dark .image.is-5by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, + html.theme--documenter-dark .image.is-16by9 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, + html.theme--documenter-dark .image.is-2by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, + html.theme--documenter-dark .image.is-3by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, + html.theme--documenter-dark .image.is-4by5 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, + html.theme--documenter-dark .image.is-3by4 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, + html.theme--documenter-dark .image.is-2by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, + html.theme--documenter-dark .image.is-3by5 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, + html.theme--documenter-dark .image.is-9by16 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, + html.theme--documenter-dark .image.is-1by2 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, + html.theme--documenter-dark .image.is-1by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + html.theme--documenter-dark .image.is-square, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square, html.theme--documenter-dark .image.is-1by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 { + padding-top: 100%; } + html.theme--documenter-dark .image.is-5by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 { + padding-top: 80%; } + html.theme--documenter-dark .image.is-4by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 { + padding-top: 75%; } + html.theme--documenter-dark .image.is-3by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 { + padding-top: 66.6666%; } + html.theme--documenter-dark .image.is-5by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 { + padding-top: 60%; } + html.theme--documenter-dark .image.is-16by9, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 { + padding-top: 56.25%; } + html.theme--documenter-dark .image.is-2by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 { + padding-top: 50%; } + html.theme--documenter-dark .image.is-3by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 { + padding-top: 33.3333%; } + html.theme--documenter-dark .image.is-4by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 { + padding-top: 125%; } + html.theme--documenter-dark .image.is-3by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 { + padding-top: 133.3333%; } + html.theme--documenter-dark .image.is-2by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 { + padding-top: 150%; } + html.theme--documenter-dark .image.is-3by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 { + padding-top: 166.6666%; } + html.theme--documenter-dark .image.is-9by16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 { + padding-top: 177.7777%; } + html.theme--documenter-dark .image.is-1by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 { + padding-top: 200%; } + html.theme--documenter-dark .image.is-1by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 { + padding-top: 300%; } + html.theme--documenter-dark .image.is-16x16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16x16 { + height: 16px; + width: 16px; } + html.theme--documenter-dark .image.is-24x24, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-24x24 { + height: 24px; + width: 24px; } + html.theme--documenter-dark .image.is-32x32, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-32x32 { + height: 32px; + width: 32px; } + html.theme--documenter-dark .image.is-48x48, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-48x48 { + height: 48px; + width: 48px; } + html.theme--documenter-dark .image.is-64x64, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-64x64 { + height: 64px; + width: 64px; } + html.theme--documenter-dark .image.is-96x96, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-96x96 { + height: 96px; + width: 96px; } + html.theme--documenter-dark .image.is-128x128, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-128x128 { + height: 128px; + width: 128px; } + html.theme--documenter-dark .notification { + background-color: #282f2f; + border-radius: 0.4em; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; } + html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + html.theme--documenter-dark .notification strong { + color: currentColor; } + html.theme--documenter-dark .notification code, + html.theme--documenter-dark .notification pre { + background: white; } + html.theme--documenter-dark .notification pre code { + background: transparent; } + html.theme--documenter-dark .notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; } + html.theme--documenter-dark .notification .title, + html.theme--documenter-dark .notification .subtitle, + html.theme--documenter-dark .notification .content { + color: currentColor; } + html.theme--documenter-dark .notification.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .notification.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .notification.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .notification.is-dark, html.theme--documenter-dark .content kbd.notification { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .notification.is-primary, html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .notification.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .notification.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .notification.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .notification.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .notification.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 15px; + overflow: hidden; + padding: 0; + width: 100%; } + html.theme--documenter-dark .progress::-webkit-progress-bar { + background-color: #5e6d6f; } + html.theme--documenter-dark .progress::-webkit-progress-value { + background-color: #dbdee0; } + html.theme--documenter-dark .progress::-moz-progress-bar { + background-color: #dbdee0; } + html.theme--documenter-dark .progress::-ms-fill { + background-color: #dbdee0; + border: none; } + html.theme--documenter-dark .progress.is-white::-webkit-progress-value { + background-color: white; } + html.theme--documenter-dark .progress.is-white::-moz-progress-bar { + background-color: white; } + html.theme--documenter-dark .progress.is-white::-ms-fill { + background-color: white; } + html.theme--documenter-dark .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-light::-webkit-progress-value { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light::-moz-progress-bar { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light::-ms-fill { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light:indeterminate { + background-image: linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-dark::-webkit-progress-value, html.theme--documenter-dark .content kbd.progress::-webkit-progress-value { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark::-moz-progress-bar, html.theme--documenter-dark .content kbd.progress::-moz-progress-bar { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark::-ms-fill, html.theme--documenter-dark .content kbd.progress::-ms-fill { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark:indeterminate, html.theme--documenter-dark .content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #282f2f 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-primary::-webkit-progress-value, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary::-moz-progress-bar, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary::-ms-fill, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-ms-fill { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary:indeterminate, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #375a7f 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-link::-webkit-progress-value { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link::-moz-progress-bar { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link::-ms-fill { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-info::-webkit-progress-value { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info::-moz-progress-bar { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info::-ms-fill { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #024c7d 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-success::-webkit-progress-value { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success::-moz-progress-bar { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success::-ms-fill { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #008438 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-warning::-webkit-progress-value { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning::-moz-progress-bar { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning::-ms-fill { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ad8100 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-danger::-webkit-progress-value { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger::-moz-progress-bar { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger::-ms-fill { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #5e6d6f; + background-image: linear-gradient(to right, #fff 30%, #5e6d6f 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + html.theme--documenter-dark .progress.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.progress { + height: 0.85em; } + html.theme--documenter-dark .progress.is-medium { + height: 1.25rem; } + html.theme--documenter-dark .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + html.theme--documenter-dark .table { + background-color: #343c3d; + color: #fff; } + html.theme--documenter-dark .table td, + html.theme--documenter-dark .table th { + border: 1px solid #5e6d6f; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + html.theme--documenter-dark .table td.is-white, + html.theme--documenter-dark .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .table td.is-black, + html.theme--documenter-dark .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .table td.is-light, + html.theme--documenter-dark .table th.is-light { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .table td.is-dark, + html.theme--documenter-dark .table th.is-dark { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .table td.is-primary, + html.theme--documenter-dark .table th.is-primary { + background-color: #375a7f; + border-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table td.is-link, + html.theme--documenter-dark .table th.is-link { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .table td.is-info, + html.theme--documenter-dark .table th.is-info { + background-color: #024c7d; + border-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .table td.is-success, + html.theme--documenter-dark .table th.is-success { + background-color: #008438; + border-color: #008438; + color: #fff; } + html.theme--documenter-dark .table td.is-warning, + html.theme--documenter-dark .table th.is-warning { + background-color: #ad8100; + border-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .table td.is-danger, + html.theme--documenter-dark .table th.is-danger { + background-color: #9e1b0d; + border-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .table td.is-narrow, + html.theme--documenter-dark .table th.is-narrow { + white-space: nowrap; + width: 1%; } + html.theme--documenter-dark .table td.is-selected, + html.theme--documenter-dark .table th.is-selected { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table td.is-selected a, + html.theme--documenter-dark .table td.is-selected strong, + html.theme--documenter-dark .table th.is-selected a, + html.theme--documenter-dark .table th.is-selected strong { + color: currentColor; } + html.theme--documenter-dark .table th { + color: #f2f2f2; } + html.theme--documenter-dark .table th:not([align]) { + text-align: left; } + html.theme--documenter-dark .table tr.is-selected { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table tr.is-selected a, + html.theme--documenter-dark .table tr.is-selected strong { + color: currentColor; } + html.theme--documenter-dark .table tr.is-selected td, + html.theme--documenter-dark .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + html.theme--documenter-dark .table thead { + background-color: transparent; } + html.theme--documenter-dark .table thead td, + html.theme--documenter-dark .table thead th { + border-width: 0 0 2px; + color: #f2f2f2; } + html.theme--documenter-dark .table tfoot { + background-color: transparent; } + html.theme--documenter-dark .table tfoot td, + html.theme--documenter-dark .table tfoot th { + border-width: 2px 0 0; + color: #f2f2f2; } + html.theme--documenter-dark .table tbody { + background-color: transparent; } + html.theme--documenter-dark .table tbody tr:last-child td, + html.theme--documenter-dark .table tbody tr:last-child th { + border-bottom-width: 0; } + html.theme--documenter-dark .table.is-bordered td, + html.theme--documenter-dark .table.is-bordered th { + border-width: 1px; } + html.theme--documenter-dark .table.is-bordered tr:last-child td, + html.theme--documenter-dark .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + html.theme--documenter-dark .table.is-fullwidth { + width: 100%; } + html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #282f2f; } + html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #282f2f; } + html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #2d3435; } + html.theme--documenter-dark .table.is-narrow td, + html.theme--documenter-dark .table.is-narrow th { + padding: 0.25em 0.5em; } + html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #282f2f; } + html.theme--documenter-dark .table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + html.theme--documenter-dark .tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .tags .tag, html.theme--documenter-dark .tags .content kbd, html.theme--documenter-dark .content .tags kbd, html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .tags .tag:not(:last-child), html.theme--documenter-dark .tags .content kbd:not(:last-child), html.theme--documenter-dark .content .tags kbd:not(:last-child), html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; } + html.theme--documenter-dark .tags:last-child { + margin-bottom: -0.5rem; } + html.theme--documenter-dark .tags:not(:last-child) { + margin-bottom: 1rem; } + html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 15px; } + html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + html.theme--documenter-dark .tags.is-centered { + justify-content: center; } + html.theme--documenter-dark .tags.is-centered .tag, html.theme--documenter-dark .tags.is-centered .content kbd, html.theme--documenter-dark .content .tags.is-centered kbd, html.theme--documenter-dark .tags.is-centered .docstring > section > a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; } + html.theme--documenter-dark .tags.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .tags.is-right .tag:not(:first-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; } + html.theme--documenter-dark .tags.is-right .tag:not(:last-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0; } + html.theme--documenter-dark .tags.has-addons .tag, html.theme--documenter-dark .tags.has-addons .content kbd, html.theme--documenter-dark .content .tags.has-addons kbd, html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink { + margin-right: 0; } + html.theme--documenter-dark .tags.has-addons .tag:not(:first-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .tags.has-addons .tag:not(:last-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .tag:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { + align-items: center; + background-color: #282f2f; + border-radius: 0.4em; + color: #fff; + display: inline-flex; + font-size: 0.85em; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + html.theme--documenter-dark .tag:not(body) .delete, html.theme--documenter-dark .content kbd:not(body) .delete, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + html.theme--documenter-dark .tag.is-white:not(body), html.theme--documenter-dark .content kbd.is-white:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-white:not(body) { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .tag.is-black:not(body), html.theme--documenter-dark .content kbd.is-black:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .tag.is-light:not(body), html.theme--documenter-dark .content kbd.is-light:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-light:not(body) { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .tag.is-dark:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-dark:not(body), html.theme--documenter-dark .content .docstring > section > kbd:not(body) { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .tag.is-primary:not(body), html.theme--documenter-dark .content kbd.is-primary:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .tag.is-link:not(body), html.theme--documenter-dark .content kbd.is-link:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-link:not(body) { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .tag.is-info:not(body), html.theme--documenter-dark .content kbd.is-info:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-info:not(body) { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .tag.is-success:not(body), html.theme--documenter-dark .content kbd.is-success:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-success:not(body) { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .tag.is-warning:not(body), html.theme--documenter-dark .content kbd.is-warning:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-warning:not(body) { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .tag.is-danger:not(body), html.theme--documenter-dark .content kbd.is-danger:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-danger:not(body) { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .tag.is-normal:not(body), html.theme--documenter-dark .content kbd.is-normal:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-normal:not(body) { + font-size: 0.85em; } + html.theme--documenter-dark .tag.is-medium:not(body), html.theme--documenter-dark .content kbd.is-medium:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-medium:not(body) { + font-size: 15px; } + html.theme--documenter-dark .tag.is-large:not(body), html.theme--documenter-dark .content kbd.is-large:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; } + html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child, html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + html.theme--documenter-dark .tag.is-delete:not(body), html.theme--documenter-dark .content kbd.is-delete:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; } + html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; } + html.theme--documenter-dark .tag.is-delete:not(body):hover, html.theme--documenter-dark .content kbd.is-delete:not(body):hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, html.theme--documenter-dark .tag.is-delete:not(body):focus, html.theme--documenter-dark .content kbd.is-delete:not(body):focus, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { + background-color: #1d2122; } + html.theme--documenter-dark .tag.is-delete:not(body):active, html.theme--documenter-dark .content kbd.is-delete:not(body):active, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):active { + background-color: #111414; } + html.theme--documenter-dark .tag.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:not(body), html.theme--documenter-dark .content kbd.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; } + html.theme--documenter-dark a.tag:hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:hover { + text-decoration: underline; } + html.theme--documenter-dark .title, + html.theme--documenter-dark .subtitle { + word-break: break-word; } + html.theme--documenter-dark .title em, + html.theme--documenter-dark .title span, + html.theme--documenter-dark .subtitle em, + html.theme--documenter-dark .subtitle span { + font-weight: inherit; } + html.theme--documenter-dark .title sub, + html.theme--documenter-dark .subtitle sub { + font-size: 0.75em; } + html.theme--documenter-dark .title sup, + html.theme--documenter-dark .subtitle sup { + font-size: 0.75em; } + html.theme--documenter-dark .title .tag, html.theme--documenter-dark .title .content kbd, html.theme--documenter-dark .content .title kbd, html.theme--documenter-dark .title .docstring > section > a.docs-sourcelink, + html.theme--documenter-dark .subtitle .tag, + html.theme--documenter-dark .subtitle .content kbd, + html.theme--documenter-dark .content .subtitle kbd, + html.theme--documenter-dark .subtitle .docstring > section > a.docs-sourcelink { + vertical-align: middle; } + html.theme--documenter-dark .title { + color: #fff; + font-size: 2rem; + font-weight: 500; + line-height: 1.125; } + html.theme--documenter-dark .title strong { + color: inherit; + font-weight: inherit; } + html.theme--documenter-dark .title + .highlight { + margin-top: -0.75rem; } + html.theme--documenter-dark .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + html.theme--documenter-dark .title.is-1 { + font-size: 3rem; } + html.theme--documenter-dark .title.is-2 { + font-size: 2.5rem; } + html.theme--documenter-dark .title.is-3 { + font-size: 2rem; } + html.theme--documenter-dark .title.is-4 { + font-size: 1.5rem; } + html.theme--documenter-dark .title.is-5 { + font-size: 1.25rem; } + html.theme--documenter-dark .title.is-6 { + font-size: 15px; } + html.theme--documenter-dark .title.is-7 { + font-size: 0.85em; } + html.theme--documenter-dark .subtitle { + color: #8c9b9d; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + html.theme--documenter-dark .subtitle strong { + color: #8c9b9d; + font-weight: 600; } + html.theme--documenter-dark .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + html.theme--documenter-dark .subtitle.is-1 { + font-size: 3rem; } + html.theme--documenter-dark .subtitle.is-2 { + font-size: 2.5rem; } + html.theme--documenter-dark .subtitle.is-3 { + font-size: 2rem; } + html.theme--documenter-dark .subtitle.is-4 { + font-size: 1.5rem; } + html.theme--documenter-dark .subtitle.is-5 { + font-size: 1.25rem; } + html.theme--documenter-dark .subtitle.is-6 { + font-size: 15px; } + html.theme--documenter-dark .subtitle.is-7 { + font-size: 0.85em; } + html.theme--documenter-dark .heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + html.theme--documenter-dark .highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; } + html.theme--documenter-dark .highlight pre { + overflow: auto; + max-width: 100%; } + html.theme--documenter-dark .number { + align-items: center; + background-color: #282f2f; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + background-color: #1f2424; + border-color: #5e6d6f; + border-radius: 0.4em; + color: #dbdee0; } + html.theme--documenter-dark .select select::-moz-placeholder, html.theme--documenter-dark .textarea::-moz-placeholder, html.theme--documenter-dark .input::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select::-webkit-input-placeholder, html.theme--documenter-dark .textarea::-webkit-input-placeholder, html.theme--documenter-dark .input::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:-moz-placeholder, html.theme--documenter-dark .textarea:-moz-placeholder, html.theme--documenter-dark .input:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:-ms-input-placeholder, html.theme--documenter-dark .textarea:-ms-input-placeholder, html.theme--documenter-dark .input:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:hover, html.theme--documenter-dark .textarea:hover, html.theme--documenter-dark .input:hover, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:hover, html.theme--documenter-dark .select select.is-hovered, html.theme--documenter-dark .is-hovered.textarea, html.theme--documenter-dark .is-hovered.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-hovered { + border-color: #8c9b9d; } + html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + border-color: #1abc9c; + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + background-color: #8c9b9d; + border-color: #282f2f; + box-shadow: none; + color: white; } + html.theme--documenter-dark .select select[disabled]::-moz-placeholder, html.theme--documenter-dark .textarea[disabled]::-moz-placeholder, html.theme--documenter-dark .input[disabled]::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]:-moz-placeholder, html.theme--documenter-dark .textarea[disabled]:-moz-placeholder, html.theme--documenter-dark .input[disabled]:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder, html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder, html.theme--documenter-dark .input[disabled]:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; } + html.theme--documenter-dark .textarea[readonly], html.theme--documenter-dark .input[readonly], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[readonly] { + box-shadow: none; } + html.theme--documenter-dark .is-white.textarea, html.theme--documenter-dark .is-white.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white { + border-color: white; } + html.theme--documenter-dark .is-white.textarea:focus, html.theme--documenter-dark .is-white.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:focus, html.theme--documenter-dark .is-white.is-focused.textarea, html.theme--documenter-dark .is-white.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-white.textarea:active, html.theme--documenter-dark .is-white.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:active, html.theme--documenter-dark .is-white.is-active.textarea, html.theme--documenter-dark .is-white.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .is-black.textarea, html.theme--documenter-dark .is-black.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black { + border-color: #0a0a0a; } + html.theme--documenter-dark .is-black.textarea:focus, html.theme--documenter-dark .is-black.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:focus, html.theme--documenter-dark .is-black.is-focused.textarea, html.theme--documenter-dark .is-black.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-black.textarea:active, html.theme--documenter-dark .is-black.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:active, html.theme--documenter-dark .is-black.is-active.textarea, html.theme--documenter-dark .is-black.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .is-light.textarea, html.theme--documenter-dark .is-light.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light { + border-color: #ecf0f1; } + html.theme--documenter-dark .is-light.textarea:focus, html.theme--documenter-dark .is-light.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:focus, html.theme--documenter-dark .is-light.is-focused.textarea, html.theme--documenter-dark .is-light.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-light.textarea:active, html.theme--documenter-dark .is-light.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:active, html.theme--documenter-dark .is-light.is-active.textarea, html.theme--documenter-dark .is-light.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .is-dark.textarea, html.theme--documenter-dark .content kbd.textarea, html.theme--documenter-dark .is-dark.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark, html.theme--documenter-dark .content kbd.input { + border-color: #282f2f; } + html.theme--documenter-dark .is-dark.textarea:focus, html.theme--documenter-dark .content kbd.textarea:focus, html.theme--documenter-dark .is-dark.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:focus, html.theme--documenter-dark .content kbd.input:focus, html.theme--documenter-dark .is-dark.is-focused.textarea, html.theme--documenter-dark .content kbd.is-focused.textarea, html.theme--documenter-dark .is-dark.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .content kbd.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-focused, html.theme--documenter-dark .is-dark.textarea:active, html.theme--documenter-dark .content kbd.textarea:active, html.theme--documenter-dark .is-dark.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:active, html.theme--documenter-dark .content kbd.input:active, html.theme--documenter-dark .is-dark.is-active.textarea, html.theme--documenter-dark .content kbd.is-active.textarea, html.theme--documenter-dark .is-dark.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .content kbd.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .is-primary.textarea, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink { + border-color: #375a7f; } + html.theme--documenter-dark .is-primary.textarea:focus, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:focus, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.is-focused.textarea, html.theme--documenter-dark .docstring > section > a.is-focused.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .docstring > section > a.is-focused.input.docs-sourcelink, html.theme--documenter-dark .is-primary.textarea:active, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:active, html.theme--documenter-dark .is-primary.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:active, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:active, html.theme--documenter-dark .is-primary.is-active.textarea, html.theme--documenter-dark .docstring > section > a.is-active.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .docstring > section > a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .is-link.textarea, html.theme--documenter-dark .is-link.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link { + border-color: #1abc9c; } + html.theme--documenter-dark .is-link.textarea:focus, html.theme--documenter-dark .is-link.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:focus, html.theme--documenter-dark .is-link.is-focused.textarea, html.theme--documenter-dark .is-link.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-link.textarea:active, html.theme--documenter-dark .is-link.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:active, html.theme--documenter-dark .is-link.is-active.textarea, html.theme--documenter-dark .is-link.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .is-info.textarea, html.theme--documenter-dark .is-info.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info { + border-color: #024c7d; } + html.theme--documenter-dark .is-info.textarea:focus, html.theme--documenter-dark .is-info.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:focus, html.theme--documenter-dark .is-info.is-focused.textarea, html.theme--documenter-dark .is-info.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-info.textarea:active, html.theme--documenter-dark .is-info.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:active, html.theme--documenter-dark .is-info.is-active.textarea, html.theme--documenter-dark .is-info.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .is-success.textarea, html.theme--documenter-dark .is-success.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success { + border-color: #008438; } + html.theme--documenter-dark .is-success.textarea:focus, html.theme--documenter-dark .is-success.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:focus, html.theme--documenter-dark .is-success.is-focused.textarea, html.theme--documenter-dark .is-success.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-success.textarea:active, html.theme--documenter-dark .is-success.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:active, html.theme--documenter-dark .is-success.is-active.textarea, html.theme--documenter-dark .is-success.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .is-warning.textarea, html.theme--documenter-dark .is-warning.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning { + border-color: #ad8100; } + html.theme--documenter-dark .is-warning.textarea:focus, html.theme--documenter-dark .is-warning.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:focus, html.theme--documenter-dark .is-warning.is-focused.textarea, html.theme--documenter-dark .is-warning.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-warning.textarea:active, html.theme--documenter-dark .is-warning.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:active, html.theme--documenter-dark .is-warning.is-active.textarea, html.theme--documenter-dark .is-warning.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .is-danger.textarea, html.theme--documenter-dark .is-danger.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger { + border-color: #9e1b0d; } + html.theme--documenter-dark .is-danger.textarea:focus, html.theme--documenter-dark .is-danger.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:focus, html.theme--documenter-dark .is-danger.is-focused.textarea, html.theme--documenter-dark .is-danger.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-danger.textarea:active, html.theme--documenter-dark .is-danger.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:active, html.theme--documenter-dark .is-danger.is-active.textarea, html.theme--documenter-dark .is-danger.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .is-small.textarea, html.theme--documenter-dark .is-small.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .is-medium.textarea, html.theme--documenter-dark .is-medium.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .is-large.textarea, html.theme--documenter-dark .is-large.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .is-fullwidth.textarea, html.theme--documenter-dark .is-fullwidth.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-fullwidth { + display: block; + width: 100%; } + html.theme--documenter-dark .is-inline.textarea, html.theme--documenter-dark .is-inline.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-inline { + display: inline; + width: auto; } + html.theme--documenter-dark .input.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .input.is-static, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + html.theme--documenter-dark .textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; } + html.theme--documenter-dark .textarea:not([rows]) { + max-height: 600px; + min-height: 120px; } + html.theme--documenter-dark .textarea[rows] { + height: initial; } + html.theme--documenter-dark .textarea.has-fixed-size { + resize: none; } + html.theme--documenter-dark .radio, html.theme--documenter-dark .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + html.theme--documenter-dark .radio input, html.theme--documenter-dark .checkbox input { + cursor: pointer; } + html.theme--documenter-dark .radio:hover, html.theme--documenter-dark .checkbox:hover { + color: #8c9b9d; } + html.theme--documenter-dark .radio[disabled], html.theme--documenter-dark .checkbox[disabled], fieldset[disabled] html.theme--documenter-dark .radio, fieldset[disabled] html.theme--documenter-dark .checkbox { + color: white; + cursor: not-allowed; } + html.theme--documenter-dark .radio + .radio { + margin-left: 0.5em; } + html.theme--documenter-dark .select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + html.theme--documenter-dark .select:not(.is-multiple) { + height: 2.25em; } + html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { + border-color: #1abc9c; + right: 1.125em; + z-index: 4; } + html.theme--documenter-dark .select.is-rounded select, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select select { + border-radius: 290486px; + padding-left: 1em; } + html.theme--documenter-dark .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + html.theme--documenter-dark .select select::-ms-expand { + display: none; } + html.theme--documenter-dark .select select[disabled]:hover, fieldset[disabled] html.theme--documenter-dark .select select:hover { + border-color: #282f2f; } + html.theme--documenter-dark .select select:not([multiple]) { + padding-right: 2.5em; } + html.theme--documenter-dark .select select[multiple] { + height: auto; + padding: 0; } + html.theme--documenter-dark .select select[multiple] option { + padding: 0.5em 1em; } + html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #8c9b9d; } + html.theme--documenter-dark .select.is-white:not(:hover)::after { + border-color: white; } + html.theme--documenter-dark .select.is-white select { + border-color: white; } + html.theme--documenter-dark .select.is-white select:hover, html.theme--documenter-dark .select.is-white select.is-hovered { + border-color: #f2f2f2; } + html.theme--documenter-dark .select.is-white select:focus, html.theme--documenter-dark .select.is-white select.is-focused, html.theme--documenter-dark .select.is-white select:active, html.theme--documenter-dark .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .select.is-black select { + border-color: #0a0a0a; } + html.theme--documenter-dark .select.is-black select:hover, html.theme--documenter-dark .select.is-black select.is-hovered { + border-color: black; } + html.theme--documenter-dark .select.is-black select:focus, html.theme--documenter-dark .select.is-black select.is-focused, html.theme--documenter-dark .select.is-black select:active, html.theme--documenter-dark .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .select.is-light:not(:hover)::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .select.is-light select { + border-color: #ecf0f1; } + html.theme--documenter-dark .select.is-light select:hover, html.theme--documenter-dark .select.is-light select.is-hovered { + border-color: #dde4e6; } + html.theme--documenter-dark .select.is-light select:focus, html.theme--documenter-dark .select.is-light select.is-focused, html.theme--documenter-dark .select.is-light select:active, html.theme--documenter-dark .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .select.is-dark:not(:hover)::after, html.theme--documenter-dark .content kbd.select:not(:hover)::after { + border-color: #282f2f; } + html.theme--documenter-dark .select.is-dark select, html.theme--documenter-dark .content kbd.select select { + border-color: #282f2f; } + html.theme--documenter-dark .select.is-dark select:hover, html.theme--documenter-dark .content kbd.select select:hover, html.theme--documenter-dark .select.is-dark select.is-hovered, html.theme--documenter-dark .content kbd.select select.is-hovered { + border-color: #1d2122; } + html.theme--documenter-dark .select.is-dark select:focus, html.theme--documenter-dark .content kbd.select select:focus, html.theme--documenter-dark .select.is-dark select.is-focused, html.theme--documenter-dark .content kbd.select select.is-focused, html.theme--documenter-dark .select.is-dark select:active, html.theme--documenter-dark .content kbd.select select:active, html.theme--documenter-dark .select.is-dark select.is-active, html.theme--documenter-dark .content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .select.is-primary:not(:hover)::after, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink:not(:hover)::after { + border-color: #375a7f; } + html.theme--documenter-dark .select.is-primary select, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select { + border-color: #375a7f; } + html.theme--documenter-dark .select.is-primary select:hover, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:hover, html.theme--documenter-dark .select.is-primary select.is-hovered, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-hovered { + border-color: #2f4d6d; } + html.theme--documenter-dark .select.is-primary select:focus, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:focus, html.theme--documenter-dark .select.is-primary select.is-focused, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-focused, html.theme--documenter-dark .select.is-primary select:active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:active, html.theme--documenter-dark .select.is-primary select.is-active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .select.is-link:not(:hover)::after { + border-color: #1abc9c; } + html.theme--documenter-dark .select.is-link select { + border-color: #1abc9c; } + html.theme--documenter-dark .select.is-link select:hover, html.theme--documenter-dark .select.is-link select.is-hovered { + border-color: #17a689; } + html.theme--documenter-dark .select.is-link select:focus, html.theme--documenter-dark .select.is-link select.is-focused, html.theme--documenter-dark .select.is-link select:active, html.theme--documenter-dark .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .select.is-info:not(:hover)::after { + border-color: #024c7d; } + html.theme--documenter-dark .select.is-info select { + border-color: #024c7d; } + html.theme--documenter-dark .select.is-info select:hover, html.theme--documenter-dark .select.is-info select.is-hovered { + border-color: #023d64; } + html.theme--documenter-dark .select.is-info select:focus, html.theme--documenter-dark .select.is-info select.is-focused, html.theme--documenter-dark .select.is-info select:active, html.theme--documenter-dark .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .select.is-success:not(:hover)::after { + border-color: #008438; } + html.theme--documenter-dark .select.is-success select { + border-color: #008438; } + html.theme--documenter-dark .select.is-success select:hover, html.theme--documenter-dark .select.is-success select.is-hovered { + border-color: #006b2d; } + html.theme--documenter-dark .select.is-success select:focus, html.theme--documenter-dark .select.is-success select.is-focused, html.theme--documenter-dark .select.is-success select:active, html.theme--documenter-dark .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .select.is-warning:not(:hover)::after { + border-color: #ad8100; } + html.theme--documenter-dark .select.is-warning select { + border-color: #ad8100; } + html.theme--documenter-dark .select.is-warning select:hover, html.theme--documenter-dark .select.is-warning select.is-hovered { + border-color: #946e00; } + html.theme--documenter-dark .select.is-warning select:focus, html.theme--documenter-dark .select.is-warning select.is-focused, html.theme--documenter-dark .select.is-warning select:active, html.theme--documenter-dark .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .select.is-danger:not(:hover)::after { + border-color: #9e1b0d; } + html.theme--documenter-dark .select.is-danger select { + border-color: #9e1b0d; } + html.theme--documenter-dark .select.is-danger select:hover, html.theme--documenter-dark .select.is-danger select.is-hovered { + border-color: #86170b; } + html.theme--documenter-dark .select.is-danger select:focus, html.theme--documenter-dark .select.is-danger select.is-focused, html.theme--documenter-dark .select.is-danger select:active, html.theme--documenter-dark .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .select.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .select.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .select.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .select.is-disabled::after { + border-color: white; } + html.theme--documenter-dark .select.is-fullwidth { + width: 100%; } + html.theme--documenter-dark .select.is-fullwidth select { + width: 100%; } + html.theme--documenter-dark .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + html.theme--documenter-dark .select.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.85em; } + html.theme--documenter-dark .select.is-loading.is-medium:after { + font-size: 1.25rem; } + html.theme--documenter-dark .select.is-loading.is-large:after { + font-size: 1.5rem; } + html.theme--documenter-dark .file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + html.theme--documenter-dark .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:hover .file-cta, html.theme--documenter-dark .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:focus .file-cta, html.theme--documenter-dark .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:active .file-cta, html.theme--documenter-dark .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-black:hover .file-cta, html.theme--documenter-dark .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-black:focus .file-cta, html.theme--documenter-dark .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + html.theme--documenter-dark .file.is-black:active .file-cta, html.theme--documenter-dark .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-light .file-cta { + background-color: #ecf0f1; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-light:hover .file-cta, html.theme--documenter-dark .file.is-light.is-hovered .file-cta { + background-color: #e5eaec; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-light:focus .file-cta, html.theme--documenter-dark .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(236, 240, 241, 0.25); + color: #282f2f; } + html.theme--documenter-dark .file.is-light:active .file-cta, html.theme--documenter-dark .file.is-light.is-active .file-cta { + background-color: #dde4e6; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-dark .file-cta, html.theme--documenter-dark .content kbd.file .file-cta { + background-color: #282f2f; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:hover .file-cta, html.theme--documenter-dark .content kbd.file:hover .file-cta, html.theme--documenter-dark .file.is-dark.is-hovered .file-cta, html.theme--documenter-dark .content kbd.file.is-hovered .file-cta { + background-color: #232829; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:focus .file-cta, html.theme--documenter-dark .content kbd.file:focus .file-cta, html.theme--documenter-dark .file.is-dark.is-focused .file-cta, html.theme--documenter-dark .content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(40, 47, 47, 0.25); + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:active .file-cta, html.theme--documenter-dark .content kbd.file:active .file-cta, html.theme--documenter-dark .file.is-dark.is-active .file-cta, html.theme--documenter-dark .content kbd.file.is-active .file-cta { + background-color: #1d2122; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-primary .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink .file-cta { + background-color: #375a7f; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-primary:hover .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:hover .file-cta, html.theme--documenter-dark .file.is-primary.is-hovered .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #335476; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-primary:focus .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:focus .file-cta, html.theme--documenter-dark .file.is-primary.is-focused .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(55, 90, 127, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-primary:active .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:active .file-cta, html.theme--documenter-dark .file.is-primary.is-active .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-active.docs-sourcelink .file-cta { + background-color: #2f4d6d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link .file-cta { + background-color: #1abc9c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link:hover .file-cta, html.theme--documenter-dark .file.is-link.is-hovered .file-cta { + background-color: #18b193; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link:focus .file-cta, html.theme--documenter-dark .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(26, 188, 156, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-link:active .file-cta, html.theme--documenter-dark .file.is-link.is-active .file-cta { + background-color: #17a689; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info .file-cta { + background-color: #024c7d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info:hover .file-cta, html.theme--documenter-dark .file.is-info.is-hovered .file-cta { + background-color: #024470; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info:focus .file-cta, html.theme--documenter-dark .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(2, 76, 125, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-info:active .file-cta, html.theme--documenter-dark .file.is-info.is-active .file-cta { + background-color: #023d64; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success .file-cta { + background-color: #008438; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success:hover .file-cta, html.theme--documenter-dark .file.is-success.is-hovered .file-cta { + background-color: #007733; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success:focus .file-cta, html.theme--documenter-dark .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0, 132, 56, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-success:active .file-cta, html.theme--documenter-dark .file.is-success.is-active .file-cta { + background-color: #006b2d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning .file-cta { + background-color: #ad8100; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning:hover .file-cta, html.theme--documenter-dark .file.is-warning.is-hovered .file-cta { + background-color: #a07700; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning:focus .file-cta, html.theme--documenter-dark .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(173, 129, 0, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-warning:active .file-cta, html.theme--documenter-dark .file.is-warning.is-active .file-cta { + background-color: #946e00; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger .file-cta { + background-color: #9e1b0d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger:hover .file-cta, html.theme--documenter-dark .file.is-danger.is-hovered .file-cta { + background-color: #92190c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger:focus .file-cta, html.theme--documenter-dark .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(158, 27, 13, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-danger:active .file-cta, html.theme--documenter-dark .file.is-danger.is-active .file-cta { + background-color: #86170b; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.file { + font-size: 0.85em; } + html.theme--documenter-dark .file.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .file.is-medium .file-icon .fa { + font-size: 21px; } + html.theme--documenter-dark .file.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .file.is-large .file-icon .fa { + font-size: 28px; } + html.theme--documenter-dark .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .file.has-name.is-empty .file-cta { + border-radius: 0.4em; } + html.theme--documenter-dark .file.has-name.is-empty .file-name { + display: none; } + html.theme--documenter-dark .file.is-boxed .file-label { + flex-direction: column; } + html.theme--documenter-dark .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + html.theme--documenter-dark .file.is-boxed .file-name { + border-width: 0 1px 1px; } + html.theme--documenter-dark .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + html.theme--documenter-dark .file.is-boxed .file-icon .fa { + font-size: 21px; } + html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { + font-size: 14px; } + html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + html.theme--documenter-dark .file.is-boxed.has-name .file-cta { + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .file.is-boxed.has-name .file-name { + border-radius: 0 0 0.4em 0.4em; + border-width: 0 1px 1px; } + html.theme--documenter-dark .file.is-centered { + justify-content: center; } + html.theme--documenter-dark .file.is-fullwidth .file-label { + width: 100%; } + html.theme--documenter-dark .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + html.theme--documenter-dark .file.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .file.is-right .file-cta { + border-radius: 0 0.4em 0.4em 0; } + html.theme--documenter-dark .file.is-right .file-name { + border-radius: 0.4em 0 0 0.4em; + border-width: 1px 0 1px 1px; + order: -1; } + html.theme--documenter-dark .file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + html.theme--documenter-dark .file-label:hover .file-cta { + background-color: #e5eaec; + color: #282f2f; } + html.theme--documenter-dark .file-label:hover .file-name { + border-color: #596668; } + html.theme--documenter-dark .file-label:active .file-cta { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .file-label:active .file-name { + border-color: #535f61; } + html.theme--documenter-dark .file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + html.theme--documenter-dark .file-cta, + html.theme--documenter-dark .file-name { + border-color: #5e6d6f; + border-radius: 0.4em; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + html.theme--documenter-dark .file-cta { + background-color: #ecf0f1; + color: #343c3d; } + html.theme--documenter-dark .file-name { + border-color: #5e6d6f; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; } + html.theme--documenter-dark .file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + html.theme--documenter-dark .file-icon .fa { + font-size: 14px; } + html.theme--documenter-dark .label { + color: #282f2f; + display: block; + font-size: 15px; + font-weight: 700; } + html.theme--documenter-dark .label:not(:last-child) { + margin-bottom: 0.5em; } + html.theme--documenter-dark .label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.label { + font-size: 0.85em; } + html.theme--documenter-dark .label.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .label.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .help { + display: block; + font-size: 0.85em; + margin-top: 0.25rem; } + html.theme--documenter-dark .help.is-white { + color: white; } + html.theme--documenter-dark .help.is-black { + color: #0a0a0a; } + html.theme--documenter-dark .help.is-light { + color: #ecf0f1; } + html.theme--documenter-dark .help.is-dark, html.theme--documenter-dark .content kbd.help { + color: #282f2f; } + html.theme--documenter-dark .help.is-primary, html.theme--documenter-dark .docstring > section > a.help.docs-sourcelink { + color: #375a7f; } + html.theme--documenter-dark .help.is-link { + color: #1abc9c; } + html.theme--documenter-dark .help.is-info { + color: #024c7d; } + html.theme--documenter-dark .help.is-success { + color: #008438; } + html.theme--documenter-dark .help.is-warning { + color: #ad8100; } + html.theme--documenter-dark .help.is-danger { + color: #9e1b0d; } + html.theme--documenter-dark .field:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .field.has-addons { + display: flex; + justify-content: flex-start; } + html.theme--documenter-dark .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]), html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; } + html.theme--documenter-dark .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .field.has-addons.has-addons-centered { + justify-content: center; } + html.theme--documenter-dark .field.has-addons.has-addons-right { + justify-content: flex-end; } + html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .field.is-grouped { + display: flex; + justify-content: flex-start; } + html.theme--documenter-dark .field.is-grouped > .control { + flex-shrink: 0; } + html.theme--documenter-dark .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + html.theme--documenter-dark .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .field.is-grouped.is-grouped-centered { + justify-content: center; } + html.theme--documenter-dark .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:last-child, html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field.is-horizontal { + display: flex; } } + html.theme--documenter-dark .field-label .label { + font-size: inherit; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .field-label { + margin-bottom: 0.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + html.theme--documenter-dark .field-label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.field-label { + font-size: 0.85em; + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-normal { + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + html.theme--documenter-dark .field-body .field .field { + margin-bottom: 0; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + html.theme--documenter-dark .field-body .field { + margin-bottom: 0; } + html.theme--documenter-dark .field-body > .field { + flex-shrink: 1; } + html.theme--documenter-dark .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + html.theme--documenter-dark .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + html.theme--documenter-dark .control { + box-sizing: border-box; + clear: both; + font-size: 15px; + position: relative; + text-align: left; } + html.theme--documenter-dark .control.has-icons-left .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select:focus ~ .icon { + color: #5e6d6f; } + html.theme--documenter-dark .control.has-icons-left .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.85em; } + html.theme--documenter-dark .control.has-icons-left .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + html.theme--documenter-dark .control.has-icons-left .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + html.theme--documenter-dark .control.has-icons-left .icon, html.theme--documenter-dark .control.has-icons-right .icon { + color: #dbdee0; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; } + html.theme--documenter-dark .control.has-icons-left .input, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, + html.theme--documenter-dark .control.has-icons-left .select select { + padding-left: 2.25em; } + html.theme--documenter-dark .control.has-icons-left .icon.is-left { + left: 0; } + html.theme--documenter-dark .control.has-icons-right .input, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, + html.theme--documenter-dark .control.has-icons-right .select select { + padding-right: 2.25em; } + html.theme--documenter-dark .control.has-icons-right .icon.is-right { + right: 0; } + html.theme--documenter-dark .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + html.theme--documenter-dark .control.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.85em; } + html.theme--documenter-dark .control.is-loading.is-medium:after { + font-size: 1.25rem; } + html.theme--documenter-dark .control.is-loading.is-large:after { + font-size: 1.5rem; } + html.theme--documenter-dark .breadcrumb { + font-size: 15px; + white-space: nowrap; } + html.theme--documenter-dark .breadcrumb a { + align-items: center; + color: #1abc9c; + display: flex; + justify-content: center; + padding: 0 0.75em; } + html.theme--documenter-dark .breadcrumb a:hover { + color: #1dd2af; } + html.theme--documenter-dark .breadcrumb li { + align-items: center; + display: flex; } + html.theme--documenter-dark .breadcrumb li:first-child a { + padding-left: 0; } + html.theme--documenter-dark .breadcrumb li.is-active a { + color: #f2f2f2; + cursor: default; + pointer-events: none; } + html.theme--documenter-dark .breadcrumb li + li::before { + color: #8c9b9d; + content: "\0002f"; } + html.theme--documenter-dark .breadcrumb ul, + html.theme--documenter-dark .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .breadcrumb .icon:first-child { + margin-right: 0.5em; } + html.theme--documenter-dark .breadcrumb .icon:last-child { + margin-left: 0.5em; } + html.theme--documenter-dark .breadcrumb.is-centered ol, + html.theme--documenter-dark .breadcrumb.is-centered ul { + justify-content: center; } + html.theme--documenter-dark .breadcrumb.is-right ol, + html.theme--documenter-dark .breadcrumb.is-right ul { + justify-content: flex-end; } + html.theme--documenter-dark .breadcrumb.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.breadcrumb { + font-size: 0.85em; } + html.theme--documenter-dark .breadcrumb.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .breadcrumb.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + html.theme--documenter-dark .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + html.theme--documenter-dark .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + html.theme--documenter-dark .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + html.theme--documenter-dark .card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #fff; + max-width: 100%; + position: relative; } + html.theme--documenter-dark .card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; } + html.theme--documenter-dark .card-header-title { + align-items: center; + color: #f2f2f2; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; } + html.theme--documenter-dark .card-header-title.is-centered { + justify-content: center; } + html.theme--documenter-dark .card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; } + html.theme--documenter-dark .card-image { + display: block; + position: relative; } + html.theme--documenter-dark .card-content { + background-color: transparent; + padding: 1.5rem; } + html.theme--documenter-dark .card-footer { + background-color: transparent; + border-top: 1px solid #5e6d6f; + align-items: stretch; + display: flex; } + html.theme--documenter-dark .card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + html.theme--documenter-dark .card-footer-item:not(:last-child) { + border-right: 1px solid #5e6d6f; } + html.theme--documenter-dark .card .media:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + html.theme--documenter-dark .dropdown.is-active .dropdown-menu, html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + html.theme--documenter-dark .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + html.theme--documenter-dark .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + html.theme--documenter-dark .dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + html.theme--documenter-dark .dropdown-content { + background-color: #282f2f; + border-radius: 0.4em; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + html.theme--documenter-dark .dropdown-item { + color: #fff; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + html.theme--documenter-dark a.dropdown-item, + html.theme--documenter-dark button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; } + html.theme--documenter-dark a.dropdown-item:hover, + html.theme--documenter-dark button.dropdown-item:hover { + background-color: #282f2f; + color: #0a0a0a; } + html.theme--documenter-dark a.dropdown-item.is-active, + html.theme--documenter-dark button.dropdown-item.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .dropdown-divider { + background-color: #5e6d6f; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + html.theme--documenter-dark .level { + align-items: center; + justify-content: space-between; } + html.theme--documenter-dark .level code { + border-radius: 0.4em; } + html.theme--documenter-dark .level img { + display: inline-block; + vertical-align: top; } + html.theme--documenter-dark .level.is-mobile { + display: flex; } + html.theme--documenter-dark .level.is-mobile .level-left, + html.theme--documenter-dark .level.is-mobile .level-right { + display: flex; } + html.theme--documenter-dark .level.is-mobile .level-left + .level-right { + margin-top: 0; } + html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level { + display: flex; } + html.theme--documenter-dark .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } + html.theme--documenter-dark .level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + html.theme--documenter-dark .level-item .title, + html.theme--documenter-dark .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } + html.theme--documenter-dark .level-left, + html.theme--documenter-dark .level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .level-left .level-item.is-flexible, + html.theme--documenter-dark .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-left .level-item:not(:last-child), + html.theme--documenter-dark .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } + html.theme--documenter-dark .level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-left { + display: flex; } } + html.theme--documenter-dark .level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-right { + display: flex; } } + html.theme--documenter-dark .list { + background-color: white; + border-radius: 0.4em; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .list-item { + display: block; + padding: 0.5em 1em; } + html.theme--documenter-dark .list-item:not(a) { + color: #fff; } + html.theme--documenter-dark .list-item:first-child { + border-top-left-radius: 0.4em; + border-top-right-radius: 0.4em; } + html.theme--documenter-dark .list-item:last-child { + border-bottom-left-radius: 0.4em; + border-bottom-right-radius: 0.4em; } + html.theme--documenter-dark .list-item:not(:last-child) { + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .list-item.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark a.list-item { + background-color: #282f2f; + cursor: pointer; } + html.theme--documenter-dark .media { + align-items: flex-start; + display: flex; + text-align: left; } + html.theme--documenter-dark .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .media .media { + border-top: 1px solid rgba(94, 109, 111, 0.5); + display: flex; + padding-top: 0.75rem; } + html.theme--documenter-dark .media .media .content:not(:last-child), + html.theme--documenter-dark .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .media .media .media { + padding-top: 0.5rem; } + html.theme--documenter-dark .media .media .media + .media { + margin-top: 0.5rem; } + html.theme--documenter-dark .media + .media { + border-top: 1px solid rgba(94, 109, 111, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + html.theme--documenter-dark .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + html.theme--documenter-dark .media-left, + html.theme--documenter-dark .media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .media-left { + margin-right: 1rem; } + html.theme--documenter-dark .media-right { + margin-left: 1rem; } + html.theme--documenter-dark .media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .media-content { + overflow-x: auto; } } + html.theme--documenter-dark .menu { + font-size: 15px; } + html.theme--documenter-dark .menu.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.menu { + font-size: 0.85em; } + html.theme--documenter-dark .menu.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .menu.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .menu-list { + line-height: 1.25; } + html.theme--documenter-dark .menu-list a { + border-radius: 3px; + color: #fff; + display: block; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .menu-list a:hover { + background-color: #282f2f; + color: #f2f2f2; } + html.theme--documenter-dark .menu-list a.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .menu-list li ul { + border-left: 1px solid #5e6d6f; + margin: 0.75em; + padding-left: 0.75em; } + html.theme--documenter-dark .menu-label { + color: white; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + html.theme--documenter-dark .menu-label:not(:first-child) { + margin-top: 1em; } + html.theme--documenter-dark .menu-label:not(:last-child) { + margin-bottom: 1em; } + html.theme--documenter-dark .message { + background-color: #282f2f; + border-radius: 0.4em; + font-size: 15px; } + html.theme--documenter-dark .message strong { + color: currentColor; } + html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + html.theme--documenter-dark .message.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.message { + font-size: 0.85em; } + html.theme--documenter-dark .message.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .message.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .message.is-white { + background-color: white; } + html.theme--documenter-dark .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .message.is-white .message-body { + border-color: white; + color: #4d4d4d; } + html.theme--documenter-dark .message.is-black { + background-color: #fafafa; } + html.theme--documenter-dark .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; } + html.theme--documenter-dark .message.is-light { + background-color: #f9fafb; } + html.theme--documenter-dark .message.is-light .message-header { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .message.is-light .message-body { + border-color: #ecf0f1; + color: #505050; } + html.theme--documenter-dark .message.is-dark, html.theme--documenter-dark .content kbd.message { + background-color: #f9fafa; } + html.theme--documenter-dark .message.is-dark .message-header, html.theme--documenter-dark .content kbd.message .message-header { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .message.is-dark .message-body, html.theme--documenter-dark .content kbd.message .message-body { + border-color: #282f2f; + color: #212526; } + html.theme--documenter-dark .message.is-primary, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink { + background-color: #f8fafc; } + html.theme--documenter-dark .message.is-primary .message-header, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-header { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .message.is-primary .message-body, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-body { + border-color: #375a7f; + color: #2b4159; } + html.theme--documenter-dark .message.is-link { + background-color: #f6fefc; } + html.theme--documenter-dark .message.is-link .message-header { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .message.is-link .message-body { + border-color: #1abc9c; + color: #0b2f28; } + html.theme--documenter-dark .message.is-info { + background-color: #f5fbff; } + html.theme--documenter-dark .message.is-info .message-header { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .message.is-info .message-body { + border-color: #024c7d; + color: #033659; } + html.theme--documenter-dark .message.is-success { + background-color: #f5fff9; } + html.theme--documenter-dark .message.is-success .message-header { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .message.is-success .message-body { + border-color: #008438; + color: #023518; } + html.theme--documenter-dark .message.is-warning { + background-color: #fffcf5; } + html.theme--documenter-dark .message.is-warning .message-header { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .message.is-warning .message-body { + border-color: #ad8100; + color: #3d2e03; } + html.theme--documenter-dark .message.is-danger { + background-color: #fef6f6; } + html.theme--documenter-dark .message.is-danger .message-header { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .message.is-danger .message-body { + border-color: #9e1b0d; + color: #7a170c; } + html.theme--documenter-dark .message-header { + align-items: center; + background-color: #fff; + border-radius: 0.4em 0.4em 0 0; + color: rgba(0, 0, 0, 0.7); + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + html.theme--documenter-dark .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + html.theme--documenter-dark .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .message-body { + border-color: #5e6d6f; + border-radius: 0.4em; + border-style: solid; + border-width: 0 0 0 4px; + color: #fff; + padding: 1.25em 1.5em; } + html.theme--documenter-dark .message-body code, + html.theme--documenter-dark .message-body pre { + background-color: white; } + html.theme--documenter-dark .message-body pre code { + background-color: transparent; } + html.theme--documenter-dark .modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + html.theme--documenter-dark .modal.is-active { + display: flex; } + html.theme--documenter-dark .modal-background { + background-color: rgba(10, 10, 10, 0.86); } + html.theme--documenter-dark .modal-content, + html.theme--documenter-dark .modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .modal-content, + html.theme--documenter-dark .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } + html.theme--documenter-dark .modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + html.theme--documenter-dark .modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + html.theme--documenter-dark .modal-card-head, + html.theme--documenter-dark .modal-card-foot { + align-items: center; + background-color: #282f2f; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + html.theme--documenter-dark .modal-card-head { + border-bottom: 1px solid #5e6d6f; + border-top-left-radius: 8px; + border-top-right-radius: 8px; } + html.theme--documenter-dark .modal-card-title { + color: #f2f2f2; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + html.theme--documenter-dark .modal-card-foot { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + html.theme--documenter-dark .modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + html.theme--documenter-dark .navbar { + background-color: #375a7f; + min-height: 4rem; + position: relative; + z-index: 30; } + html.theme--documenter-dark .navbar.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-white .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + html.theme--documenter-dark .navbar.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link { + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-black .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link { + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + html.theme--documenter-dark .navbar.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link { + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after { + border-color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-burger { + color: #282f2f; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-light .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link { + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after { + border-color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #ecf0f1; + color: #282f2f; } } + html.theme--documenter-dark .navbar.is-dark, html.theme--documenter-dark .content kbd.navbar { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link { + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-burger, html.theme--documenter-dark .content kbd.navbar .navbar-burger { + color: #ecf0f1; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-dark .navbar-start > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-end > .navbar-item, + html.theme--documenter-dark .content kbd.navbar .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link { + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #282f2f; + color: #ecf0f1; } } + html.theme--documenter-dark .navbar.is-primary, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-burger, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-primary .navbar-start > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-end > .navbar-item, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #375a7f; + color: #fff; } } + html.theme--documenter-dark .navbar.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-link .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #1abc9c; + color: #fff; } } + html.theme--documenter-dark .navbar.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-info .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #024c7d; + color: #fff; } } + html.theme--documenter-dark .navbar.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-success .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #008438; + color: #fff; } } + html.theme--documenter-dark .navbar.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-warning .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ad8100; + color: #fff; } } + html.theme--documenter-dark .navbar.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-danger .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #9e1b0d; + color: #fff; } } + html.theme--documenter-dark .navbar > .container { + align-items: stretch; + display: flex; + min-height: 4rem; + width: 100%; } + html.theme--documenter-dark .navbar.has-shadow { + box-shadow: 0 2px 0 0 #282f2f; } + html.theme--documenter-dark .navbar.is-fixed-bottom, html.theme--documenter-dark .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #282f2f; } + html.theme--documenter-dark .navbar.is-fixed-top { + top: 0; } + html.theme--documenter-dark html.has-navbar-fixed-top, + html.theme--documenter-dark body.has-navbar-fixed-top { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom, + html.theme--documenter-dark body.has-navbar-fixed-bottom { + padding-bottom: 4rem; } + html.theme--documenter-dark .navbar-brand, + html.theme--documenter-dark .navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 4rem; } + html.theme--documenter-dark .navbar-brand a.navbar-item:focus, html.theme--documenter-dark .navbar-brand a.navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + html.theme--documenter-dark .navbar-burger { + color: #fff; + cursor: pointer; + display: block; + height: 4rem; + position: relative; + width: 4rem; + margin-left: auto; } + html.theme--documenter-dark .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + html.theme--documenter-dark .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + html.theme--documenter-dark .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + html.theme--documenter-dark .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + html.theme--documenter-dark .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + html.theme--documenter-dark .navbar-menu { + display: none; } + html.theme--documenter-dark .navbar-item, + html.theme--documenter-dark .navbar-link { + color: #fff; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + html.theme--documenter-dark .navbar-item .icon:only-child, + html.theme--documenter-dark .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + html.theme--documenter-dark a.navbar-item, + html.theme--documenter-dark .navbar-link { + cursor: pointer; } + html.theme--documenter-dark a.navbar-item:focus, html.theme--documenter-dark a.navbar-item:focus-within, html.theme--documenter-dark a.navbar-item:hover, html.theme--documenter-dark a.navbar-item.is-active, + html.theme--documenter-dark .navbar-link:focus, + html.theme--documenter-dark .navbar-link:focus-within, + html.theme--documenter-dark .navbar-link:hover, + html.theme--documenter-dark .navbar-link.is-active { + background-color: transparent; + color: #1abc9c; } + html.theme--documenter-dark .navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .navbar-item img { + max-height: 1.75rem; } + html.theme--documenter-dark .navbar-item.has-dropdown { + padding: 0; } + html.theme--documenter-dark .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 4rem; + padding-bottom: calc(0.5rem - 1px); } + html.theme--documenter-dark .navbar-item.is-tab:focus, html.theme--documenter-dark .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #1abc9c; } + html.theme--documenter-dark .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #1abc9c; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #1abc9c; + padding-bottom: calc(0.5rem - 3px); } + html.theme--documenter-dark .navbar-content { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after { + border-color: #fff; + margin-top: -0.375em; + right: 1.125em; } + html.theme--documenter-dark .navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + html.theme--documenter-dark .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + html.theme--documenter-dark .navbar-divider { + background-color: rgba(0, 0, 0, 0.2); + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .navbar > .container { + display: block; } + html.theme--documenter-dark .navbar-brand .navbar-item, + html.theme--documenter-dark .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + html.theme--documenter-dark .navbar-link::after { + display: none; } + html.theme--documenter-dark .navbar-menu { + background-color: #375a7f; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + html.theme--documenter-dark .navbar-menu.is-active { + display: block; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch, html.theme--documenter-dark .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .navbar.is-fixed-top-touch { + top: 0; } + html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu, html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 4rem); + overflow: auto; } + html.theme--documenter-dark html.has-navbar-fixed-top-touch, + html.theme--documenter-dark body.has-navbar-fixed-top-touch { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom-touch, + html.theme--documenter-dark body.has-navbar-fixed-bottom-touch { + padding-bottom: 4rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar, + html.theme--documenter-dark .navbar-menu, + html.theme--documenter-dark .navbar-start, + html.theme--documenter-dark .navbar-end { + align-items: stretch; + display: flex; } + html.theme--documenter-dark .navbar { + min-height: 4rem; } + html.theme--documenter-dark .navbar.is-spaced { + padding: 1rem 2rem; } + html.theme--documenter-dark .navbar.is-spaced .navbar-start, + html.theme--documenter-dark .navbar.is-spaced .navbar-end { + align-items: center; } + html.theme--documenter-dark .navbar.is-spaced a.navbar-item, + html.theme--documenter-dark .navbar.is-spaced .navbar-link { + border-radius: 0.4em; } + html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover, html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus, + html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover, + html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: transparent; + color: #dbdee0; } + html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: transparent; + color: #1abc9c; } + html.theme--documenter-dark .navbar-burger { + display: none; } + html.theme--documenter-dark .navbar-item, + html.theme--documenter-dark .navbar-link { + align-items: center; + display: flex; } + html.theme--documenter-dark .navbar-item { + display: flex; } + html.theme--documenter-dark .navbar-item.has-dropdown { + align-items: stretch; } + html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 8px 8px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + html.theme--documenter-dark .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .navbar-start { + justify-content: flex-start; + margin-right: auto; } + html.theme--documenter-dark .navbar-end { + justify-content: flex-end; + margin-left: auto; } + html.theme--documenter-dark .navbar-dropdown { + background-color: #375a7f; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + border-top: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + html.theme--documenter-dark .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover { + background-color: transparent; + color: #dbdee0; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active { + background-color: transparent; + color: #1abc9c; } + .navbar.is-spaced html.theme--documenter-dark .navbar-dropdown, html.theme--documenter-dark .navbar-dropdown.is-boxed { + border-radius: 8px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + html.theme--documenter-dark .navbar-dropdown.is-right { + left: auto; + right: 0; } + html.theme--documenter-dark .navbar-divider { + display: block; } + html.theme--documenter-dark .navbar > .container .navbar-brand, + html.theme--documenter-dark .container > .navbar .navbar-brand { + margin-left: -.75rem; } + html.theme--documenter-dark .navbar > .container .navbar-menu, + html.theme--documenter-dark .container > .navbar .navbar-menu { + margin-right: -.75rem; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop, html.theme--documenter-dark .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .navbar.is-fixed-top-desktop { + top: 0; } + html.theme--documenter-dark html.has-navbar-fixed-top-desktop, + html.theme--documenter-dark body.has-navbar-fixed-top-desktop { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop, + html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop { + padding-bottom: 4rem; } + html.theme--documenter-dark html.has-spaced-navbar-fixed-top, + html.theme--documenter-dark body.has-spaced-navbar-fixed-top { + padding-top: 6rem; } + html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom, + html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom { + padding-bottom: 6rem; } + html.theme--documenter-dark a.navbar-item.is-active, + html.theme--documenter-dark .navbar-link.is-active { + color: #1abc9c; } + html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover), + html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: transparent; } } + html.theme--documenter-dark .hero.is-fullheight-with-navbar { + min-height: calc(100vh - 4rem); } + html.theme--documenter-dark .pagination { + font-size: 15px; + margin: -0.25rem; } + html.theme--documenter-dark .pagination.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination { + font-size: 0.85em; } + html.theme--documenter-dark .pagination.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .pagination.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .pagination.is-rounded .pagination-previous, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, + html.theme--documenter-dark .pagination.is-rounded .pagination-next, + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; } + html.theme--documenter-dark .pagination.is-rounded .pagination-link, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { + border-radius: 290486px; } + html.theme--documenter-dark .pagination, + html.theme--documenter-dark .pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-link { + border-color: #5e6d6f; + color: #1abc9c; + min-width: 2.25em; } + html.theme--documenter-dark .pagination-previous:hover, + html.theme--documenter-dark .pagination-next:hover, + html.theme--documenter-dark .pagination-link:hover { + border-color: #8c9b9d; + color: #1dd2af; } + html.theme--documenter-dark .pagination-previous:focus, + html.theme--documenter-dark .pagination-next:focus, + html.theme--documenter-dark .pagination-link:focus { + border-color: #8c9b9d; } + html.theme--documenter-dark .pagination-previous:active, + html.theme--documenter-dark .pagination-next:active, + html.theme--documenter-dark .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + html.theme--documenter-dark .pagination-previous[disabled], + html.theme--documenter-dark .pagination-next[disabled], + html.theme--documenter-dark .pagination-link[disabled] { + background-color: #dbdee0; + border-color: #dbdee0; + box-shadow: none; + color: #5e6d6f; + opacity: 0.5; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + html.theme--documenter-dark .pagination-link.is-current { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .pagination-ellipsis { + color: #8c9b9d; + pointer-events: none; } + html.theme--documenter-dark .pagination-list { + flex-wrap: wrap; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .pagination { + flex-wrap: wrap; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + html.theme--documenter-dark .pagination-previous { + order: 2; } + html.theme--documenter-dark .pagination-next { + order: 3; } + html.theme--documenter-dark .pagination { + justify-content: space-between; } + html.theme--documenter-dark .pagination.is-centered .pagination-previous { + order: 1; } + html.theme--documenter-dark .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + html.theme--documenter-dark .pagination.is-centered .pagination-next { + order: 3; } + html.theme--documenter-dark .pagination.is-right .pagination-previous { + order: 1; } + html.theme--documenter-dark .pagination.is-right .pagination-next { + order: 2; } + html.theme--documenter-dark .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + html.theme--documenter-dark .panel { + font-size: 15px; } + html.theme--documenter-dark .panel:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .panel-heading, + html.theme--documenter-dark .panel-tabs, + html.theme--documenter-dark .panel-block { + border-bottom: 1px solid #5e6d6f; + border-left: 1px solid #5e6d6f; + border-right: 1px solid #5e6d6f; } + html.theme--documenter-dark .panel-heading:first-child, + html.theme--documenter-dark .panel-tabs:first-child, + html.theme--documenter-dark .panel-block:first-child { + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark .panel-heading { + background-color: #282f2f; + border-radius: 0.4em 0.4em 0 0; + color: #f2f2f2; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + html.theme--documenter-dark .panel-tabs a { + border-bottom: 1px solid #5e6d6f; + margin-bottom: -1px; + padding: 0.5em; } + html.theme--documenter-dark .panel-tabs a.is-active { + border-bottom-color: #343c3d; + color: #17a689; } + html.theme--documenter-dark .panel-list a { + color: #fff; } + html.theme--documenter-dark .panel-list a:hover { + color: #1abc9c; } + html.theme--documenter-dark .panel-block { + align-items: center; + color: #f2f2f2; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + html.theme--documenter-dark .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + html.theme--documenter-dark .panel-block.is-wrapped { + flex-wrap: wrap; } + html.theme--documenter-dark .panel-block.is-active { + border-left-color: #1abc9c; + color: #17a689; } + html.theme--documenter-dark .panel-block.is-active .panel-icon { + color: #1abc9c; } + html.theme--documenter-dark a.panel-block, + html.theme--documenter-dark label.panel-block { + cursor: pointer; } + html.theme--documenter-dark a.panel-block:hover, + html.theme--documenter-dark label.panel-block:hover { + background-color: #282f2f; } + html.theme--documenter-dark .panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: white; + margin-right: 0.75em; } + html.theme--documenter-dark .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + html.theme--documenter-dark .tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 15px; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + html.theme--documenter-dark .tabs a { + align-items: center; + border-bottom-color: #5e6d6f; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #fff; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + html.theme--documenter-dark .tabs a:hover { + border-bottom-color: #f2f2f2; + color: #f2f2f2; } + html.theme--documenter-dark .tabs li { + display: block; } + html.theme--documenter-dark .tabs li.is-active a { + border-bottom-color: #1abc9c; + color: #1abc9c; } + html.theme--documenter-dark .tabs ul { + align-items: center; + border-bottom-color: #5e6d6f; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + html.theme--documenter-dark .tabs ul.is-left { + padding-right: 0.75em; } + html.theme--documenter-dark .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + html.theme--documenter-dark .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + html.theme--documenter-dark .tabs .icon:first-child { + margin-right: 0.5em; } + html.theme--documenter-dark .tabs .icon:last-child { + margin-left: 0.5em; } + html.theme--documenter-dark .tabs.is-centered ul { + justify-content: center; } + html.theme--documenter-dark .tabs.is-right ul { + justify-content: flex-end; } + html.theme--documenter-dark .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .tabs.is-boxed a:hover { + background-color: #282f2f; + border-bottom-color: #5e6d6f; } + html.theme--documenter-dark .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #5e6d6f; + border-bottom-color: transparent !important; } + html.theme--documenter-dark .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .tabs.is-toggle a { + border-color: #5e6d6f; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + html.theme--documenter-dark .tabs.is-toggle a:hover { + background-color: #282f2f; + border-color: #8c9b9d; + z-index: 2; } + html.theme--documenter-dark .tabs.is-toggle li + li { + margin-left: -1px; } + html.theme--documenter-dark .tabs.is-toggle li:first-child a { + border-radius: 0.4em 0 0 0.4em; } + html.theme--documenter-dark .tabs.is-toggle li:last-child a { + border-radius: 0 0.4em 0.4em 0; } + html.theme--documenter-dark .tabs.is-toggle li.is-active a { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; + z-index: 1; } + html.theme--documenter-dark .tabs.is-toggle ul { + border-bottom: none; } + html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; } + html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; } + html.theme--documenter-dark .tabs.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.tabs { + font-size: 0.85em; } + html.theme--documenter-dark .tabs.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .tabs.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > html.theme--documenter-dark .column.is-narrow { + flex: none; } + .columns.is-mobile > html.theme--documenter-dark .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-1 { + flex: none; + width: 8.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-1 { + margin-left: 8.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-2 { + flex: none; + width: 16.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-2 { + margin-left: 16.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-4 { + flex: none; + width: 33.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-4 { + margin-left: 33.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-5 { + flex: none; + width: 41.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-5 { + margin-left: 41.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-7 { + flex: none; + width: 58.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-7 { + margin-left: 58.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-8 { + flex: none; + width: 66.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-8 { + margin-left: 66.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-10 { + flex: none; + width: 83.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-10 { + margin-left: 83.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-11 { + flex: none; + width: 91.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-11 { + margin-left: 91.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .column.is-narrow-mobile { + flex: none; } + html.theme--documenter-dark .column.is-full-mobile { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-mobile { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-mobile { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-mobile { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-mobile { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-mobile { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-mobile { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-mobile { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-mobile { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-mobile { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-mobile { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-mobile { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-mobile { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-mobile { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-mobile { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-mobile { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-mobile { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-mobile { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-mobile { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-mobile { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-mobile { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-mobile { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-mobile { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-mobile { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-mobile { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-mobile { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-mobile { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-mobile { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .column.is-narrow, html.theme--documenter-dark .column.is-narrow-tablet { + flex: none; } + html.theme--documenter-dark .column.is-full, html.theme--documenter-dark .column.is-full-tablet { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters, html.theme--documenter-dark .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds, html.theme--documenter-dark .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half, html.theme--documenter-dark .column.is-half-tablet { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third, html.theme--documenter-dark .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter, html.theme--documenter-dark .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth, html.theme--documenter-dark .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths, html.theme--documenter-dark .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths, html.theme--documenter-dark .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths, html.theme--documenter-dark .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters, html.theme--documenter-dark .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds, html.theme--documenter-dark .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half, html.theme--documenter-dark .column.is-offset-half-tablet { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third, html.theme--documenter-dark .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter, html.theme--documenter-dark .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth, html.theme--documenter-dark .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths, html.theme--documenter-dark .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths, html.theme--documenter-dark .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths, html.theme--documenter-dark .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0, html.theme--documenter-dark .column.is-0-tablet { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0, html.theme--documenter-dark .column.is-offset-0-tablet { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1, html.theme--documenter-dark .column.is-1-tablet { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1, html.theme--documenter-dark .column.is-offset-1-tablet { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2, html.theme--documenter-dark .column.is-2-tablet { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2, html.theme--documenter-dark .column.is-offset-2-tablet { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3, html.theme--documenter-dark .column.is-3-tablet { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3, html.theme--documenter-dark .column.is-offset-3-tablet { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4, html.theme--documenter-dark .column.is-4-tablet { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4, html.theme--documenter-dark .column.is-offset-4-tablet { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5, html.theme--documenter-dark .column.is-5-tablet { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5, html.theme--documenter-dark .column.is-offset-5-tablet { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6, html.theme--documenter-dark .column.is-6-tablet { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6, html.theme--documenter-dark .column.is-offset-6-tablet { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7, html.theme--documenter-dark .column.is-7-tablet { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7, html.theme--documenter-dark .column.is-offset-7-tablet { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8, html.theme--documenter-dark .column.is-8-tablet { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8, html.theme--documenter-dark .column.is-offset-8-tablet { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9, html.theme--documenter-dark .column.is-9-tablet { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9, html.theme--documenter-dark .column.is-offset-9-tablet { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10, html.theme--documenter-dark .column.is-10-tablet { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10, html.theme--documenter-dark .column.is-offset-10-tablet { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11, html.theme--documenter-dark .column.is-11-tablet { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11, html.theme--documenter-dark .column.is-offset-11-tablet { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12, html.theme--documenter-dark .column.is-12-tablet { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12, html.theme--documenter-dark .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .column.is-narrow-touch { + flex: none; } + html.theme--documenter-dark .column.is-full-touch { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-touch { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-touch { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-touch { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-touch { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-touch { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-touch { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-touch { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-touch { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-touch { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-touch { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-touch { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-touch { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-touch { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-touch { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-touch { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-touch { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-touch { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-touch { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-touch { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-touch { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-touch { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-touch { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-touch { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-touch { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-touch { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-touch { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-touch { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-touch { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-touch { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-touch { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-touch { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-touch { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-touch { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-touch { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-touch { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-touch { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-touch { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-touch { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-touch { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .column.is-narrow-desktop { + flex: none; } + html.theme--documenter-dark .column.is-full-desktop { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-desktop { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-desktop { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-desktop { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-desktop { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-desktop { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-desktop { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-desktop { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-desktop { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-desktop { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-desktop { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-desktop { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-desktop { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-desktop { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-desktop { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-desktop { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-desktop { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-desktop { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-desktop { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-desktop { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-desktop { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-desktop { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-desktop { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-desktop { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-desktop { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-desktop { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-desktop { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-desktop { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .column.is-narrow-widescreen { + flex: none; } + html.theme--documenter-dark .column.is-full-widescreen { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-widescreen { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-widescreen { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-widescreen { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-widescreen { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-widescreen { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-widescreen { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-widescreen { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-widescreen { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-widescreen { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-widescreen { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-widescreen { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .column.is-narrow-fullhd { + flex: none; } + html.theme--documenter-dark .column.is-full-fullhd { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-fullhd { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-fullhd { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-fullhd { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-fullhd { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-fullhd { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-fullhd { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-fullhd { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-fullhd { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-fullhd { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-fullhd { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-fullhd { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-fullhd { + margin-left: 100%; } } + html.theme--documenter-dark .columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + html.theme--documenter-dark .columns:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + html.theme--documenter-dark .columns.is-centered { + justify-content: center; } + html.theme--documenter-dark .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + html.theme--documenter-dark .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + html.theme--documenter-dark .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .columns.is-gapless:last-child { + margin-bottom: 0; } + html.theme--documenter-dark .columns.is-mobile { + display: flex; } + html.theme--documenter-dark .columns.is-multiline { + flex-wrap: wrap; } + html.theme--documenter-dark .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-desktop { + display: flex; } } + html.theme--documenter-dark .columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + html.theme--documenter-dark .columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + html.theme--documenter-dark .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + html.theme--documenter-dark .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + html.theme--documenter-dark .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + html.theme--documenter-dark .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + html.theme--documenter-dark .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + html.theme--documenter-dark .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + html.theme--documenter-dark .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + html.theme--documenter-dark .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + html.theme--documenter-dark .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } + html.theme--documenter-dark .tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + html.theme--documenter-dark .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + html.theme--documenter-dark .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .tile.is-child { + margin: 0 !important; } + html.theme--documenter-dark .tile.is-parent { + padding: 0.75rem; } + html.theme--documenter-dark .tile.is-vertical { + flex-direction: column; } + html.theme--documenter-dark .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .tile:not(.is-child) { + display: flex; } + html.theme--documenter-dark .tile.is-1 { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .tile.is-2 { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .tile.is-3 { + flex: none; + width: 25%; } + html.theme--documenter-dark .tile.is-4 { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .tile.is-5 { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .tile.is-6 { + flex: none; + width: 50%; } + html.theme--documenter-dark .tile.is-7 { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .tile.is-8 { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .tile.is-9 { + flex: none; + width: 75%; } + html.theme--documenter-dark .tile.is-10 { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .tile.is-11 { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .tile.is-12 { + flex: none; + width: 100%; } } + html.theme--documenter-dark .hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + html.theme--documenter-dark .hero .navbar { + background: none; } + html.theme--documenter-dark .hero .tabs ul { + border-bottom: none; } + html.theme--documenter-dark .hero.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-white strong { + color: inherit; } + html.theme--documenter-dark .hero.is-white .title { + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + html.theme--documenter-dark .hero.is-white .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-white .navbar-menu { + background-color: white; } } + html.theme--documenter-dark .hero.is-white .navbar-item, + html.theme--documenter-dark .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + html.theme--documenter-dark .hero.is-white a.navbar-item:hover, html.theme--documenter-dark .hero.is-white a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-white .navbar-link:hover, + html.theme--documenter-dark .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-white .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-white .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + html.theme--documenter-dark .hero.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-black strong { + color: inherit; } + html.theme--documenter-dark .hero.is-black .title { + color: white; } + html.theme--documenter-dark .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-black .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + html.theme--documenter-dark .hero.is-black .navbar-item, + html.theme--documenter-dark .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-black a.navbar-item:hover, html.theme--documenter-dark .hero.is-black a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-black .navbar-link:hover, + html.theme--documenter-dark .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-black .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-black .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a { + color: white; } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + html.theme--documenter-dark .hero.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-light strong { + color: inherit; } + html.theme--documenter-dark .hero.is-light .title { + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .subtitle { + color: rgba(40, 47, 47, 0.9); } + html.theme--documenter-dark .hero.is-light .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-light .subtitle strong { + color: #282f2f; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-light .navbar-menu { + background-color: #ecf0f1; } } + html.theme--documenter-dark .hero.is-light .navbar-item, + html.theme--documenter-dark .hero.is-light .navbar-link { + color: rgba(40, 47, 47, 0.7); } + html.theme--documenter-dark .hero.is-light a.navbar-item:hover, html.theme--documenter-dark .hero.is-light a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-light .navbar-link:hover, + html.theme--documenter-dark .hero.is-light .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .tabs a { + color: #282f2f; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-light .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-light .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a { + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } } + html.theme--documenter-dark .hero.is-dark, html.theme--documenter-dark .content kbd.hero { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-dark strong, + html.theme--documenter-dark .content kbd.hero strong { + color: inherit; } + html.theme--documenter-dark .hero.is-dark .title, html.theme--documenter-dark .content kbd.hero .title { + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .subtitle, html.theme--documenter-dark .content kbd.hero .subtitle { + color: rgba(236, 240, 241, 0.9); } + html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button), html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-dark .subtitle strong, + html.theme--documenter-dark .content kbd.hero .subtitle strong { + color: #ecf0f1; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-dark .navbar-menu, html.theme--documenter-dark .content kbd.hero .navbar-menu { + background-color: #282f2f; } } + html.theme--documenter-dark .hero.is-dark .navbar-item, html.theme--documenter-dark .content kbd.hero .navbar-item, + html.theme--documenter-dark .hero.is-dark .navbar-link, + html.theme--documenter-dark .content kbd.hero .navbar-link { + color: rgba(236, 240, 241, 0.7); } + html.theme--documenter-dark .hero.is-dark a.navbar-item:hover, html.theme--documenter-dark .content kbd.hero a.navbar-item:hover, html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active, html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-dark .navbar-link:hover, + html.theme--documenter-dark .content kbd.hero .navbar-link:hover, + html.theme--documenter-dark .hero.is-dark .navbar-link.is-active, + html.theme--documenter-dark .content kbd.hero .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .tabs a, html.theme--documenter-dark .content kbd.hero .tabs a { + color: #ecf0f1; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-dark .tabs a:hover, html.theme--documenter-dark .content kbd.hero .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-dark .tabs li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a { + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .hero.is-dark.is-bold, html.theme--documenter-dark .content kbd.hero.is-bold { + background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu, html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } } + html.theme--documenter-dark .hero.is-primary, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-primary strong, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink strong { + color: inherit; } + html.theme--documenter-dark .hero.is-primary .title, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .title { + color: #fff; } + html.theme--documenter-dark .hero.is-primary .subtitle, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-primary .subtitle strong, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-primary .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-menu { + background-color: #375a7f; } } + html.theme--documenter-dark .hero.is-primary .navbar-item, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-item, + html.theme--documenter-dark .hero.is-primary .navbar-link, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-primary a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-primary .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, + html.theme--documenter-dark .hero.is-primary .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .hero.is-primary .tabs a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-primary .tabs a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-primary .tabs li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .hero.is-primary.is-bold, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } } + html.theme--documenter-dark .hero.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-link strong { + color: inherit; } + html.theme--documenter-dark .hero.is-link .title { + color: #fff; } + html.theme--documenter-dark .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-link .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-link .navbar-menu { + background-color: #1abc9c; } } + html.theme--documenter-dark .hero.is-link .navbar-item, + html.theme--documenter-dark .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-link a.navbar-item:hover, html.theme--documenter-dark .hero.is-link a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-link .navbar-link:hover, + html.theme--documenter-dark .hero.is-link .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-link .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-link .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } } + html.theme--documenter-dark .hero.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-info strong { + color: inherit; } + html.theme--documenter-dark .hero.is-info .title { + color: #fff; } + html.theme--documenter-dark .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-info .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-info .navbar-menu { + background-color: #024c7d; } } + html.theme--documenter-dark .hero.is-info .navbar-item, + html.theme--documenter-dark .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-info a.navbar-item:hover, html.theme--documenter-dark .hero.is-info a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-info .navbar-link:hover, + html.theme--documenter-dark .hero.is-info .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-info .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-info .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } } + html.theme--documenter-dark .hero.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-success strong { + color: inherit; } + html.theme--documenter-dark .hero.is-success .title { + color: #fff; } + html.theme--documenter-dark .hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-success .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-success .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-success .navbar-menu { + background-color: #008438; } } + html.theme--documenter-dark .hero.is-success .navbar-item, + html.theme--documenter-dark .hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-success a.navbar-item:hover, html.theme--documenter-dark .hero.is-success a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-success .navbar-link:hover, + html.theme--documenter-dark .hero.is-success .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .hero.is-success .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-success .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-success .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #008438; } + html.theme--documenter-dark .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } } + html.theme--documenter-dark .hero.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-warning strong { + color: inherit; } + html.theme--documenter-dark .hero.is-warning .title { + color: #fff; } + html.theme--documenter-dark .hero.is-warning .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-warning .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-warning .navbar-menu { + background-color: #ad8100; } } + html.theme--documenter-dark .hero.is-warning .navbar-item, + html.theme--documenter-dark .hero.is-warning .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-warning a.navbar-item:hover, html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-warning .navbar-link:hover, + html.theme--documenter-dark .hero.is-warning .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .hero.is-warning .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-warning .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-warning .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } } + html.theme--documenter-dark .hero.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-danger strong { + color: inherit; } + html.theme--documenter-dark .hero.is-danger .title { + color: #fff; } + html.theme--documenter-dark .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-danger .navbar-menu { + background-color: #9e1b0d; } } + html.theme--documenter-dark .hero.is-danger .navbar-item, + html.theme--documenter-dark .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-danger a.navbar-item:hover, html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-danger .navbar-link:hover, + html.theme--documenter-dark .hero.is-danger .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-danger .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-danger .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } } + html.theme--documenter-dark .hero.is-small .hero-body, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; } } + html.theme--documenter-dark .hero.is-halfheight .hero-body, html.theme--documenter-dark .hero.is-fullheight .hero-body, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + html.theme--documenter-dark .hero.is-halfheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .hero.is-halfheight { + min-height: 50vh; } + html.theme--documenter-dark .hero.is-fullheight { + min-height: 100vh; } + html.theme--documenter-dark .hero-video { + overflow: hidden; } + html.theme--documenter-dark .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + html.theme--documenter-dark .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero-video { + display: none; } } + html.theme--documenter-dark .hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero-buttons .button { + display: flex; } + html.theme--documenter-dark .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero-buttons { + display: flex; + justify-content: center; } + html.theme--documenter-dark .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } + html.theme--documenter-dark .hero-head, + html.theme--documenter-dark .hero-foot { + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + html.theme--documenter-dark .section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .section.is-medium { + padding: 9rem 1.5rem; } + html.theme--documenter-dark .section.is-large { + padding: 18rem 1.5rem; } } + html.theme--documenter-dark .footer { + background-color: #282f2f; + padding: 3rem 1.5rem 6rem; } + html.theme--documenter-dark hr { + height: 1px; } + html.theme--documenter-dark h6 { + text-transform: uppercase; + letter-spacing: 0.5px; } + html.theme--documenter-dark .hero { + background-color: #343c3d; } + html.theme--documenter-dark a { + transition: all 200ms ease; } + html.theme--documenter-dark .button { + transition: all 200ms ease; + border-width: 1px; + color: white; } + html.theme--documenter-dark .button.is-active, html.theme--documenter-dark .button.is-focused, html.theme--documenter-dark .button:active, html.theme--documenter-dark .button:focus { + box-shadow: 0 0 0 2px rgba(140, 155, 157, 0.5); } + html.theme--documenter-dark .button.is-white.is-hovered, html.theme--documenter-dark .button.is-white:hover { + background-color: white; } + html.theme--documenter-dark .button.is-white.is-active, html.theme--documenter-dark .button.is-white.is-focused, html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white:focus { + border-color: white; + box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); } + html.theme--documenter-dark .button.is-black.is-hovered, html.theme--documenter-dark .button.is-black:hover { + background-color: #1d1d1d; } + html.theme--documenter-dark .button.is-black.is-active, html.theme--documenter-dark .button.is-black.is-focused, html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black:focus { + border-color: #0a0a0a; + box-shadow: 0 0 0 2px rgba(10, 10, 10, 0.5); } + html.theme--documenter-dark .button.is-light.is-hovered, html.theme--documenter-dark .button.is-light:hover { + background-color: white; } + html.theme--documenter-dark .button.is-light.is-active, html.theme--documenter-dark .button.is-light.is-focused, html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light:focus { + border-color: #ecf0f1; + box-shadow: 0 0 0 2px rgba(236, 240, 241, 0.5); } + html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered, html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover { + background-color: #3a4344; } + html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused, html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus { + border-color: #282f2f; + box-shadow: 0 0 0 2px rgba(40, 47, 47, 0.5); } + html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover { + background-color: #436d9a; } + html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink, html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus { + border-color: #375a7f; + box-shadow: 0 0 0 2px rgba(55, 90, 127, 0.5); } + html.theme--documenter-dark .button.is-link.is-hovered, html.theme--documenter-dark .button.is-link:hover { + background-color: #1fdeb8; } + html.theme--documenter-dark .button.is-link.is-active, html.theme--documenter-dark .button.is-link.is-focused, html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link:focus { + border-color: #1abc9c; + box-shadow: 0 0 0 2px rgba(26, 188, 156, 0.5); } + html.theme--documenter-dark .button.is-info.is-hovered, html.theme--documenter-dark .button.is-info:hover { + background-color: #0363a3; } + html.theme--documenter-dark .button.is-info.is-active, html.theme--documenter-dark .button.is-info.is-focused, html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info:focus { + border-color: #024c7d; + box-shadow: 0 0 0 2px rgba(2, 76, 125, 0.5); } + html.theme--documenter-dark .button.is-success.is-hovered, html.theme--documenter-dark .button.is-success:hover { + background-color: #00aa48; } + html.theme--documenter-dark .button.is-success.is-active, html.theme--documenter-dark .button.is-success.is-focused, html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success:focus { + border-color: #008438; + box-shadow: 0 0 0 2px rgba(0, 132, 56, 0.5); } + html.theme--documenter-dark .button.is-warning.is-hovered, html.theme--documenter-dark .button.is-warning:hover { + background-color: #d39e00; } + html.theme--documenter-dark .button.is-warning.is-active, html.theme--documenter-dark .button.is-warning.is-focused, html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning:focus { + border-color: #ad8100; + box-shadow: 0 0 0 2px rgba(173, 129, 0, 0.5); } + html.theme--documenter-dark .button.is-danger.is-hovered, html.theme--documenter-dark .button.is-danger:hover { + background-color: #c12110; } + html.theme--documenter-dark .button.is-danger.is-active, html.theme--documenter-dark .button.is-danger.is-focused, html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger:focus { + border-color: #9e1b0d; + box-shadow: 0 0 0 2px rgba(158, 27, 13, 0.5); } + html.theme--documenter-dark .label { + color: #dbdee0; } + html.theme--documenter-dark .button, + html.theme--documenter-dark .control.has-icons-left .icon, + html.theme--documenter-dark .control.has-icons-right .icon, + html.theme--documenter-dark .input, + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark .pagination-ellipsis, + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .select, + html.theme--documenter-dark .select select, + html.theme--documenter-dark .textarea { + height: 2.5em; } + html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark .textarea { + transition: all 200ms ease; + box-shadow: none; + border-width: 1px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .select:after, + html.theme--documenter-dark .select select { + border-width: 1px; } + html.theme--documenter-dark .control.has-addons .button, + html.theme--documenter-dark .control.has-addons .input, + html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search > input, + html.theme--documenter-dark .control.has-addons .select { + margin-right: -1px; } + html.theme--documenter-dark .notification { + background-color: #343c3d; } + html.theme--documenter-dark .card { + box-shadow: none; + border: 1px solid #343c3d; + background-color: #282f2f; + border-radius: 0.4em; } + html.theme--documenter-dark .card .card-image img { + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .card .card-header { + box-shadow: none; + background-color: rgba(18, 18, 18, 0.2); + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .card .card-footer { + background-color: rgba(18, 18, 18, 0.2); } + html.theme--documenter-dark .card .card-footer, + html.theme--documenter-dark .card .card-footer-item { + border-width: 1px; + border-color: #343c3d; } + html.theme--documenter-dark .notification.is-white a:not(.button) { + color: #0a0a0a; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-black a:not(.button) { + color: white; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-light a:not(.button) { + color: #282f2f; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-dark a:not(.button), html.theme--documenter-dark .content kbd.notification a:not(.button) { + color: #ecf0f1; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-primary a:not(.button), html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-link a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-info a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-success a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-warning a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-danger a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .tag, html.theme--documenter-dark .content kbd, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + border-radius: 0.4em; } + html.theme--documenter-dark .menu-list a { + transition: all 300ms ease; } + html.theme--documenter-dark .modal-card-body { + background-color: #282f2f; } + html.theme--documenter-dark .modal-card-foot, + html.theme--documenter-dark .modal-card-head { + border-color: #343c3d; } + html.theme--documenter-dark .message-header { + font-weight: 700; + background-color: #343c3d; + color: white; } + html.theme--documenter-dark .message-body { + border-width: 1px; + border-color: #343c3d; } + html.theme--documenter-dark .navbar { + border-radius: 0.4em; } + html.theme--documenter-dark .navbar.is-transparent { + background: none; } + html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #1abc9c; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .navbar .navbar-menu { + background-color: #375a7f; + border-radius: 0 0 0.4em 0.4em; } } + html.theme--documenter-dark .hero .navbar, + html.theme--documenter-dark body > .navbar { + border-radius: 0; } + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-previous { + border-width: 1px; } + html.theme--documenter-dark .panel-block, + html.theme--documenter-dark .panel-heading, + html.theme--documenter-dark .panel-tabs { + border-width: 1px; } + html.theme--documenter-dark .panel-block:first-child, + html.theme--documenter-dark .panel-heading:first-child, + html.theme--documenter-dark .panel-tabs:first-child { + border-top-width: 1px; } + html.theme--documenter-dark .panel-heading { + font-weight: 700; } + html.theme--documenter-dark .panel-tabs a { + border-width: 1px; + margin-bottom: -1px; } + html.theme--documenter-dark .panel-tabs a.is-active { + border-bottom-color: #17a689; } + html.theme--documenter-dark .panel-block:hover { + color: #1dd2af; } + html.theme--documenter-dark .panel-block:hover .panel-icon { + color: #1dd2af; } + html.theme--documenter-dark .panel-block.is-active .panel-icon { + color: #17a689; } + html.theme--documenter-dark .tabs a { + border-bottom-width: 1px; + margin-bottom: -1px; } + html.theme--documenter-dark .tabs ul { + border-bottom-width: 1px; } + html.theme--documenter-dark .tabs.is-boxed a { + border-width: 1px; } + html.theme--documenter-dark .tabs.is-boxed li.is-active a { + background-color: #1f2424; } + html.theme--documenter-dark .tabs.is-toggle li a { + border-width: 1px; + margin-bottom: 0; } + html.theme--documenter-dark .tabs.is-toggle li + li { + margin-left: -1px; } + html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark h1 .docs-heading-anchor, html.theme--documenter-dark h1 .docs-heading-anchor:hover, html.theme--documenter-dark h1 .docs-heading-anchor:visited, html.theme--documenter-dark h2 .docs-heading-anchor, html.theme--documenter-dark h2 .docs-heading-anchor:hover, html.theme--documenter-dark h2 .docs-heading-anchor:visited, html.theme--documenter-dark h3 .docs-heading-anchor, html.theme--documenter-dark h3 .docs-heading-anchor:hover, html.theme--documenter-dark h3 .docs-heading-anchor:visited, html.theme--documenter-dark h4 .docs-heading-anchor, html.theme--documenter-dark h4 .docs-heading-anchor:hover, html.theme--documenter-dark h4 .docs-heading-anchor:visited, html.theme--documenter-dark h5 .docs-heading-anchor, html.theme--documenter-dark h5 .docs-heading-anchor:hover, html.theme--documenter-dark h5 .docs-heading-anchor:visited, html.theme--documenter-dark h6 .docs-heading-anchor, html.theme--documenter-dark h6 .docs-heading-anchor:hover, html.theme--documenter-dark h6 .docs-heading-anchor:visited { + color: #f2f2f2; } + html.theme--documenter-dark h1 .docs-heading-anchor-permalink, html.theme--documenter-dark h2 .docs-heading-anchor-permalink, html.theme--documenter-dark h3 .docs-heading-anchor-permalink, html.theme--documenter-dark h4 .docs-heading-anchor-permalink, html.theme--documenter-dark h5 .docs-heading-anchor-permalink, html.theme--documenter-dark h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; } + html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; } + html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink { + visibility: visible; } + html.theme--documenter-dark .docs-light-only { + display: none !important; } + html.theme--documenter-dark pre { + position: relative; + overflow: hidden; } + html.theme--documenter-dark pre code, html.theme--documenter-dark pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; } + html.theme--documenter-dark pre code:first-of-type, html.theme--documenter-dark pre code.hljs:first-of-type { + padding-top: 0.5rem !important; } + html.theme--documenter-dark pre code:last-of-type, html.theme--documenter-dark pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; } + html.theme--documenter-dark pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #fff; + cursor: pointer; + text-align: center; } + html.theme--documenter-dark pre .copy-button:focus, html.theme--documenter-dark pre .copy-button:hover { + opacity: 1; + background: rgba(255, 255, 255, 0.1); + color: #1abc9c; } + html.theme--documenter-dark pre .copy-button.success { + color: #259a12; + opacity: 1; } + html.theme--documenter-dark pre .copy-button.error { + color: #cb3c33; + opacity: 1; } + html.theme--documenter-dark pre:hover .copy-button { + opacity: 1; } + html.theme--documenter-dark .admonition { + background-color: #282f2f; + border-style: solid; + border-width: 1px; + border-color: #5e6d6f; + border-radius: 0.4em; + font-size: 15px; } + html.theme--documenter-dark .admonition strong { + color: currentColor; } + html.theme--documenter-dark .admonition.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.admonition { + font-size: 0.85em; } + html.theme--documenter-dark .admonition.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .admonition.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .admonition.is-default { + background-color: #282f2f; + border-color: #5e6d6f; } + html.theme--documenter-dark .admonition.is-default > .admonition-header { + background-color: #5e6d6f; } + html.theme--documenter-dark .admonition.is-info { + background-color: #282f2f; + border-color: #024c7d; } + html.theme--documenter-dark .admonition.is-info > .admonition-header { + background-color: #024c7d; } + html.theme--documenter-dark .admonition.is-success { + background-color: #282f2f; + border-color: #008438; } + html.theme--documenter-dark .admonition.is-success > .admonition-header { + background-color: #008438; } + html.theme--documenter-dark .admonition.is-warning { + background-color: #282f2f; + border-color: #ad8100; } + html.theme--documenter-dark .admonition.is-warning > .admonition-header { + background-color: #ad8100; } + html.theme--documenter-dark .admonition.is-danger { + background-color: #282f2f; + border-color: #9e1b0d; } + html.theme--documenter-dark .admonition.is-danger > .admonition-header { + background-color: #9e1b0d; } + html.theme--documenter-dark .admonition.is-compat { + background-color: #282f2f; + border-color: #137886; } + html.theme--documenter-dark .admonition.is-compat > .admonition-header { + background-color: #137886; } + html.theme--documenter-dark .admonition-header { + background-color: #5e6d6f; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; } + html.theme--documenter-dark .admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; } + html.theme--documenter-dark .admonition-body { + color: #fff; + padding: 0.5rem 0.75rem; } + html.theme--documenter-dark .admonition-body pre { + background-color: #282f2f; } + html.theme--documenter-dark .admonition-body code { + background-color: rgba(255, 255, 255, 0.05); } + html.theme--documenter-dark .docstring { + margin-bottom: 1em; + background-color: transparent; + border: 1px solid #5e6d6f; + box-shadow: none; + max-width: 100%; } + html.theme--documenter-dark .docstring > header { + display: flex; + flex-grow: 1; + align-items: stretch; + padding: 0.5rem 0.75rem; + background-color: #282f2f; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .docstring > header code { + background-color: transparent; } + html.theme--documenter-dark .docstring > header .docstring-binding { + margin-right: 0.3em; } + html.theme--documenter-dark .docstring > header .docstring-category { + margin-left: 0.3em; } + html.theme--documenter-dark .docstring > section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .docstring > section:last-child { + border-bottom: none; } + html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; } + html.theme--documenter-dark .docstring > section > a.docs-sourcelink:focus { + opacity: 1 !important; } + html.theme--documenter-dark .docstring:hover > section > a.docs-sourcelink { + opacity: 0.2; } + html.theme--documenter-dark .docstring:focus-within > section > a.docs-sourcelink { + opacity: 0.2; } + html.theme--documenter-dark .docstring > section:hover a.docs-sourcelink { + opacity: 1; } + html.theme--documenter-dark .documenter-example-output { + background-color: #1f2424; } + html.theme--documenter-dark .outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #282f2f; + border-bottom: 3px solid #9e1b0d; + padding: 10px 35px; + text-align: center; + font-size: 15px; } + html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; } + html.theme--documenter-dark .outdated-warning-overlay a { + color: #1abc9c; } + html.theme--documenter-dark .outdated-warning-overlay a:hover { + color: #1dd2af; } + html.theme--documenter-dark .content pre { + border: 1px solid #5e6d6f; } + html.theme--documenter-dark .content code { + font-weight: inherit; } + html.theme--documenter-dark .content a code { + color: #1abc9c; } + html.theme--documenter-dark .content h1 code, html.theme--documenter-dark .content h2 code, html.theme--documenter-dark .content h3 code, html.theme--documenter-dark .content h4 code, html.theme--documenter-dark .content h5 code, html.theme--documenter-dark .content h6 code { + color: #f2f2f2; } + html.theme--documenter-dark .content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; } + html.theme--documenter-dark .content blockquote > ul:first-child, html.theme--documenter-dark .content blockquote > ol:first-child, html.theme--documenter-dark .content .admonition-body > ul:first-child, html.theme--documenter-dark .content .admonition-body > ol:first-child { + margin-top: 0; } + html.theme--documenter-dark pre, html.theme--documenter-dark code { + font-variant-ligatures: no-contextual; } + html.theme--documenter-dark .breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; } + html.theme--documenter-dark .breadcrumb a.is-disabled, html.theme--documenter-dark .breadcrumb a.is-disabled:hover { + color: #f2f2f2; } + html.theme--documenter-dark .hljs { + background: initial !important; } + html.theme--documenter-dark .katex .katex-mathml { + top: 0; + right: 0; } + html.theme--documenter-dark .katex-display, html.theme--documenter-dark mjx-container, html.theme--documenter-dark .MathJax_Display { + margin: 0.5em 0 !important; } + html.theme--documenter-dark html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; } + html.theme--documenter-dark li.no-marker { + list-style: none; } + html.theme--documenter-dark #documenter .docs-main > article { + overflow-wrap: break-word; } + html.theme--documenter-dark #documenter .docs-main > article .math-container { + overflow-x: auto; + overflow-y: hidden; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-main { + max-width: 52rem; + margin-left: 20rem; + padding-right: 1rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main { + width: 100%; } + html.theme--documenter-dark #documenter .docs-main > article { + max-width: 52rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; } + html.theme--documenter-dark #documenter .docs-main > header, html.theme--documenter-dark #documenter .docs-main > nav { + max-width: 100%; + width: 100%; + margin: 0; } } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar { + background-color: #1f2424; + border-bottom: 1px solid #5e6d6f; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar > * { + margin: auto 0; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + /* For Headroom.js */ + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + /* Safari */ + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + /* Safari */ } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #171717; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } } + html.theme--documenter-dark #documenter .docs-main section.footnotes { + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child, html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; } + html.theme--documenter-dark #documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #5e6d6f; + padding-top: 1rem; + padding-bottom: 1rem; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; } } + html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage, html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; } + html.theme--documenter-dark #documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #fff; + background-color: #282f2f; + border-right: 1px solid #5e6d6f; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 15px; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; + /* Setting up a nicer theme style for the scrollbar */ } + html.theme--documenter-dark #documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #171717; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar.visible { + box-shadow: none; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar { + left: 0; + top: 0; } } + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { + max-height: 6rem; + margin: auto; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a, html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover { + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #5e6d6f; + display: none; + padding: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible { + display: flex; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #5e6d6f; + padding-bottom: 1.5rem; + /* Managing collapsible submenus */ } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li > .tocitem { + font-weight: bold; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li li { + font-size: 14.25px; + margin-left: 1em; + border-left: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { + display: block; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 11.25px; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { + content: "\f078"; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #fff; + background: #282f2f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #fff; + background-color: #32393a; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #5e6d6f; + border-bottom: 1px solid #5e6d6f; + background-color: #1f2424; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: #1f2424; + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #32393a; + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { + border-top: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 12.75px; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; } + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + width: 14.4rem; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: .3rem; + background: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #3b4445; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #4e5a5c; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar { + width: .3rem; + background: none; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #3b4445; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #4e5a5c; } } + html.theme--documenter-dark #documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results li { + margin-left: 2rem; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; } + html.theme--documenter-dark { + background-color: #1f2424; + font-size: 16px; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + html.theme--documenter-dark .ansi span.sgr1 { + font-weight: bolder; } + html.theme--documenter-dark .ansi span.sgr2 { + font-weight: lighter; } + html.theme--documenter-dark .ansi span.sgr3 { + font-style: italic; } + html.theme--documenter-dark .ansi span.sgr4 { + text-decoration: underline; } + html.theme--documenter-dark .ansi span.sgr7 { + color: #1f2424; + background-color: #fff; } + html.theme--documenter-dark .ansi span.sgr8 { + color: transparent; } + html.theme--documenter-dark .ansi span.sgr8 span { + color: transparent; } + html.theme--documenter-dark .ansi span.sgr9 { + text-decoration: line-through; } + html.theme--documenter-dark .ansi span.sgr30 { + color: #242424; } + html.theme--documenter-dark .ansi span.sgr31 { + color: #f6705f; } + html.theme--documenter-dark .ansi span.sgr32 { + color: #4fb43a; } + html.theme--documenter-dark .ansi span.sgr33 { + color: #f4c72f; } + html.theme--documenter-dark .ansi span.sgr34 { + color: #7587f0; } + html.theme--documenter-dark .ansi span.sgr35 { + color: #bc89d3; } + html.theme--documenter-dark .ansi span.sgr36 { + color: #49b6ca; } + html.theme--documenter-dark .ansi span.sgr37 { + color: #b3bdbe; } + html.theme--documenter-dark .ansi span.sgr40 { + background-color: #242424; } + html.theme--documenter-dark .ansi span.sgr41 { + background-color: #f6705f; } + html.theme--documenter-dark .ansi span.sgr42 { + background-color: #4fb43a; } + html.theme--documenter-dark .ansi span.sgr43 { + background-color: #f4c72f; } + html.theme--documenter-dark .ansi span.sgr44 { + background-color: #7587f0; } + html.theme--documenter-dark .ansi span.sgr45 { + background-color: #bc89d3; } + html.theme--documenter-dark .ansi span.sgr46 { + background-color: #49b6ca; } + html.theme--documenter-dark .ansi span.sgr47 { + background-color: #b3bdbe; } + html.theme--documenter-dark .ansi span.sgr90 { + color: #92a0a2; } + html.theme--documenter-dark .ansi span.sgr91 { + color: #ff8674; } + html.theme--documenter-dark .ansi span.sgr92 { + color: #79d462; } + html.theme--documenter-dark .ansi span.sgr93 { + color: #ffe76b; } + html.theme--documenter-dark .ansi span.sgr94 { + color: #8a98ff; } + html.theme--documenter-dark .ansi span.sgr95 { + color: #d2a4e6; } + html.theme--documenter-dark .ansi span.sgr96 { + color: #6bc8db; } + html.theme--documenter-dark .ansi span.sgr97 { + color: #ecf0f1; } + html.theme--documenter-dark .ansi span.sgr100 { + background-color: #92a0a2; } + html.theme--documenter-dark .ansi span.sgr101 { + background-color: #ff8674; } + html.theme--documenter-dark .ansi span.sgr102 { + background-color: #79d462; } + html.theme--documenter-dark .ansi span.sgr103 { + background-color: #ffe76b; } + html.theme--documenter-dark .ansi span.sgr104 { + background-color: #8a98ff; } + html.theme--documenter-dark .ansi span.sgr105 { + background-color: #d2a4e6; } + html.theme--documenter-dark .ansi span.sgr106 { + background-color: #6bc8db; } + html.theme--documenter-dark .ansi span.sgr107 { + background-color: #ecf0f1; } + html.theme--documenter-dark code.language-julia-repl > span.hljs-meta { + color: #4fb43a; + font-weight: bolder; } + html.theme--documenter-dark .hljs { + background: #2b2b2b; + color: #f8f8f2; } + html.theme--documenter-dark .hljs-comment, + html.theme--documenter-dark .hljs-quote { + color: #d4d0ab; } + html.theme--documenter-dark .hljs-variable, + html.theme--documenter-dark .hljs-template-variable, + html.theme--documenter-dark .hljs-tag, + html.theme--documenter-dark .hljs-name, + html.theme--documenter-dark .hljs-selector-id, + html.theme--documenter-dark .hljs-selector-class, + html.theme--documenter-dark .hljs-regexp, + html.theme--documenter-dark .hljs-deletion { + color: #ffa07a; } + html.theme--documenter-dark .hljs-number, + html.theme--documenter-dark .hljs-built_in, + html.theme--documenter-dark .hljs-literal, + html.theme--documenter-dark .hljs-type, + html.theme--documenter-dark .hljs-params, + html.theme--documenter-dark .hljs-meta, + html.theme--documenter-dark .hljs-link { + color: #f5ab35; } + html.theme--documenter-dark .hljs-attribute { + color: #ffd700; } + html.theme--documenter-dark .hljs-string, + html.theme--documenter-dark .hljs-symbol, + html.theme--documenter-dark .hljs-bullet, + html.theme--documenter-dark .hljs-addition { + color: #abe338; } + html.theme--documenter-dark .hljs-title, + html.theme--documenter-dark .hljs-section { + color: #00e0e0; } + html.theme--documenter-dark .hljs-keyword, + html.theme--documenter-dark .hljs-selector-tag { + color: #dcc6e0; } + html.theme--documenter-dark .hljs-emphasis { + font-style: italic; } + html.theme--documenter-dark .hljs-strong { + font-weight: bold; } + @media screen and (-ms-high-contrast: active) { + html.theme--documenter-dark .hljs-addition, + html.theme--documenter-dark .hljs-attribute, + html.theme--documenter-dark .hljs-built_in, + html.theme--documenter-dark .hljs-bullet, + html.theme--documenter-dark .hljs-comment, + html.theme--documenter-dark .hljs-link, + html.theme--documenter-dark .hljs-literal, + html.theme--documenter-dark .hljs-meta, + html.theme--documenter-dark .hljs-number, + html.theme--documenter-dark .hljs-params, + html.theme--documenter-dark .hljs-string, + html.theme--documenter-dark .hljs-symbol, + html.theme--documenter-dark .hljs-type, + html.theme--documenter-dark .hljs-quote { + color: highlight; } + html.theme--documenter-dark .hljs-keyword, + html.theme--documenter-dark .hljs-selector-tag { + font-weight: bold; } } + html.theme--documenter-dark .hljs-subst { + color: #f8f8f2; } diff --git a/v0.15.1/assets/themes/documenter-light.css b/v0.15.1/assets/themes/documenter-light.css new file mode 100644 index 00000000..9595d5b8 --- /dev/null +++ b/v0.15.1/assets/themes/documenter-light.css @@ -0,0 +1,7738 @@ +@charset "UTF-8"; +/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +.tabs, .pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .breadcrumb, .file, .button, .is-unselectable, .modal-close, .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +.admonition:not(:last-child), .tabs:not(:last-child), .message:not(:last-child), .list:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .highlight:not(:last-child), .block:not(:last-child), .title:not(:last-child), +.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { + margin-bottom: 1.5rem; } + +.modal-close, .delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + .modal-close::before, .delete::before, .modal-close::after, .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .modal-close::before, .delete::before { + height: 2px; + width: 50%; } + .modal-close::after, .delete::after { + height: 50%; + width: 2px; } + .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + .modal-close:active, .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + .is-small.modal-close, #documenter .docs-sidebar form.docs-search > input.modal-close, .is-small.delete, #documenter .docs-sidebar form.docs-search > input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + .is-medium.modal-close, .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + .is-large.modal-close, .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +.hero-video, .modal-background, .modal, .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, +.image.is-square .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, +.image.is-1by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, +.image.is-5by4 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, +.image.is-4by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, +.image.is-3by2 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, +.image.is-5by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, +.image.is-16by9 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, +.image.is-2by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, +.image.is-3by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, +.image.is-4by5 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, +.image.is-3by4 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, +.image.is-2by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, +.image.is-3by5 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, +.image.is-9by16 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, +.image.is-1by2 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, +.image.is-1by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .file-cta, +.file-name, .select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input, .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus, + .pagination-ellipsis:focus, .file-cta:focus, + .file-name:focus, .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .button:focus, .is-focused.pagination-previous, + .is-focused.pagination-next, + .is-focused.pagination-link, + .is-focused.pagination-ellipsis, .is-focused.file-cta, + .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-focused.button, .pagination-previous:active, + .pagination-next:active, + .pagination-link:active, + .pagination-ellipsis:active, .file-cta:active, + .file-name:active, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .button:active, .is-active.pagination-previous, + .is-active.pagination-next, + .is-active.pagination-link, + .is-active.pagination-ellipsis, .is-active.file-cta, + .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .is-active.button { + outline: none; } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled], + .pagination-ellipsis[disabled], .file-cta[disabled], + .file-name[disabled], .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], .button[disabled], fieldset[disabled] .pagination-previous, + fieldset[disabled] .pagination-next, + fieldset[disabled] .pagination-link, + fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, + fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] .button { + cursor: not-allowed; } + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; } + +audio { + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: left; } + +html { + background-color: white; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; } + +body, +button, +input, +select, +textarea { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } + +body { + color: #222222; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + +a { + color: #2e63b8; + cursor: pointer; + text-decoration: none; } + a strong { + color: currentColor; } + a:hover { + color: #363636; } + +code { + background-color: rgba(0, 0, 0, 0.05); + color: #000000; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; } + +hr { + background-color: whitesmoke; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + +img { + height: auto; + max-width: 100%; } + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; } + +small { + font-size: 0.875em; } + +span { + font-style: inherit; + font-weight: inherit; } + +strong { + color: #222222; + font-weight: 700; } + +fieldset { + border: none; } + +pre { + -webkit-overflow-scrolling: touch; + background-color: whitesmoke; + color: #222222; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + +table td, +table th { + vertical-align: top; } + table td:not([align]), + table th:not([align]) { + text-align: left; } + +table th { + color: #222222; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 1rem !important; } + +.is-size-7, .docstring > section > a.docs-sourcelink { + font-size: 0.75rem !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 1rem !important; } + .is-size-7-mobile { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 1rem !important; } + .is-size-7-tablet { + font-size: 0.75rem !important; } } + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 1rem !important; } + .is-size-7-touch { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 1rem !important; } + .is-size-7-desktop { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 1rem !important; } + .is-size-7-widescreen { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 1rem !important; } + .is-size-7-fullhd { + font-size: 0.75rem !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: whitesmoke !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #dbdbdb !important; } + +.has-background-light { + background-color: whitesmoke !important; } + +.has-text-dark { + color: #363636 !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #1c1c1c !important; } + +.has-background-dark { + background-color: #363636 !important; } + +.has-text-primary { + color: #4eb5de !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #27a1d2 !important; } + +.has-background-primary { + background-color: #4eb5de !important; } + +.has-text-link { + color: #2e63b8 !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #244d8f !important; } + +.has-background-link { + background-color: #2e63b8 !important; } + +.has-text-info { + color: #209cee !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #1081cb !important; } + +.has-background-info { + background-color: #209cee !important; } + +.has-text-success { + color: #22c35b !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #1a9847 !important; } + +.has-background-success { + background-color: #22c35b !important; } + +.has-text-warning { + color: #ffdd57 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #ffd324 !important; } + +.has-background-warning { + background-color: #ffdd57 !important; } + +.has-text-danger { + color: #da0b00 !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #a70800 !important; } + +.has-background-danger { + background-color: #da0b00 !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #363636 !important; } + +.has-background-grey-darker { + background-color: #363636 !important; } + +.has-text-grey-dark { + color: #4a4a4a !important; } + +.has-background-grey-dark { + background-color: #4a4a4a !important; } + +.has-text-grey { + color: #6b6b6b !important; } + +.has-background-grey { + background-color: #6b6b6b !important; } + +.has-text-grey-light { + color: #b5b5b5 !important; } + +.has-background-grey-light { + background-color: #b5b5b5 !important; } + +.has-text-grey-lighter { + color: #dbdbdb !important; } + +.has-background-grey-lighter { + background-color: #dbdbdb !important; } + +.has-text-white-ter { + color: whitesmoke !important; } + +.has-background-white-ter { + background-color: whitesmoke !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-family-code { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-relative { + position: relative !important; } + +.box { + background-color: white; + border-radius: 6px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222222; + display: block; + padding: 1.25rem; } + +a.box:hover, a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; } + +a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; } + +.button { + background-color: white; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; } + .button strong { + color: inherit; } + .button .icon, .button .icon.is-small, .button #documenter .docs-sidebar form.docs-search > input.icon, #documenter .docs-sidebar .button form.docs-search > input.icon, .button .icon.is-medium, .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; } + .button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); } + .button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); } + .button:hover, .button.is-hovered { + border-color: #b5b5b5; + color: #363636; } + .button:focus, .button.is-focused { + border-color: #3c5dcd; + color: #363636; } + .button:focus:not(:active), .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .button:active, .button.is-active { + border-color: #4a4a4a; + color: #363636; } + .button.is-text { + background-color: transparent; + border-color: transparent; + color: #222222; + text-decoration: underline; } + .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { + background-color: whitesmoke; + color: #222222; } + .button.is-text:active, .button.is-text.is-active { + background-color: #e8e8e8; + color: #222222; } + .button.is-text[disabled], fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:hover, .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .button.is-white:active, .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .button.is-white[disabled], fieldset[disabled] .button.is-white { + background-color: white; + border-color: transparent; + box-shadow: none; } + .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { + background-color: black; } + .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .button.is-black:hover, .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + .button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + color: white; } + .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black[disabled], fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-light { + background-color: whitesmoke; + border-color: transparent; + color: #363636; } + .button.is-light:hover, .button.is-light.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: #363636; } + .button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + color: #363636; } + .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .button.is-light:active, .button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; } + .button.is-light[disabled], fieldset[disabled] .button.is-light { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; } + .button.is-light.is-inverted { + background-color: #363636; + color: whitesmoke; } + .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { + background-color: #292929; } + .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark, .content kbd.button { + background-color: #363636; + border-color: transparent; + color: whitesmoke; } + .button.is-dark:hover, .content kbd.button:hover, .button.is-dark.is-hovered, .content kbd.button.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; } + .button.is-dark:focus, .content kbd.button:focus, .button.is-dark.is-focused, .content kbd.button.is-focused { + border-color: transparent; + color: whitesmoke; } + .button.is-dark:focus:not(:active), .content kbd.button:focus:not(:active), .button.is-dark.is-focused:not(:active), .content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .button.is-dark:active, .content kbd.button:active, .button.is-dark.is-active, .content kbd.button.is-active { + background-color: #292929; + border-color: transparent; + color: whitesmoke; } + .button.is-dark[disabled], .content kbd.button[disabled], fieldset[disabled] .button.is-dark, fieldset[disabled] .content kbd.button, .content fieldset[disabled] kbd.button { + background-color: #363636; + border-color: transparent; + box-shadow: none; } + .button.is-dark.is-inverted, .content kbd.button.is-inverted { + background-color: whitesmoke; + color: #363636; } + .button.is-dark.is-inverted:hover, .content kbd.button.is-inverted:hover, .button.is-dark.is-inverted.is-hovered, .content kbd.button.is-inverted.is-hovered { + background-color: #e8e8e8; } + .button.is-dark.is-inverted[disabled], .content kbd.button.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted, fieldset[disabled] .content kbd.button.is-inverted, .content fieldset[disabled] kbd.button.is-inverted { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; + color: #363636; } + .button.is-dark.is-loading::after, .content kbd.button.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-dark.is-outlined, .content kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-dark.is-outlined:hover, .content kbd.button.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .content kbd.button.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .content kbd.button.is-outlined:focus, .button.is-dark.is-outlined.is-focused, .content kbd.button.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .button.is-dark.is-outlined.is-loading::after, .content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-outlined.is-loading:hover::after, .content kbd.button.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .content kbd.button.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after, .content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-dark.is-outlined[disabled], .content kbd.button.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined, fieldset[disabled] .content kbd.button.is-outlined, .content fieldset[disabled] kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark.is-inverted.is-outlined, .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-dark.is-inverted.is-outlined:hover, .content kbd.button.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .content kbd.button.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .content kbd.button.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused, .content kbd.button.is-inverted.is-outlined.is-focused { + background-color: whitesmoke; + color: #363636; } + .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-inverted.is-outlined[disabled], .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined, fieldset[disabled] .content kbd.button.is-inverted.is-outlined, .content fieldset[disabled] kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-primary, .docstring > section > a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + color: #fff; } + .button.is-primary:hover, .docstring > section > a.button.docs-sourcelink:hover, .button.is-primary.is-hovered, .docstring > section > a.button.is-hovered.docs-sourcelink { + background-color: #43b1dc; + border-color: transparent; + color: #fff; } + .button.is-primary:focus, .docstring > section > a.button.docs-sourcelink:focus, .button.is-primary.is-focused, .docstring > section > a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; } + .button.is-primary:focus:not(:active), .docstring > section > a.button.docs-sourcelink:focus:not(:active), .button.is-primary.is-focused:not(:active), .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .button.is-primary:active, .docstring > section > a.button.docs-sourcelink:active, .button.is-primary.is-active, .docstring > section > a.button.is-active.docs-sourcelink { + background-color: #39acda; + border-color: transparent; + color: #fff; } + .button.is-primary[disabled], .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary, fieldset[disabled] .docstring > section > a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + box-shadow: none; } + .button.is-primary.is-inverted, .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #4eb5de; } + .button.is-primary.is-inverted:hover, .docstring > section > a.button.is-inverted.docs-sourcelink:hover, .button.is-primary.is-inverted.is-hovered, .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; } + .button.is-primary.is-inverted[disabled], .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted, fieldset[disabled] .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #4eb5de; } + .button.is-primary.is-loading::after, .docstring > section > a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined, .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + color: #4eb5de; } + .button.is-primary.is-outlined:hover, .docstring > section > a.button.is-outlined.docs-sourcelink:hover, .button.is-primary.is-outlined.is-hovered, .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-outlined:focus, .docstring > section > a.button.is-outlined.docs-sourcelink:focus, .button.is-primary.is-outlined.is-focused, .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; } + .button.is-primary.is-outlined.is-loading::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; } + .button.is-primary.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined[disabled], .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-outlined, fieldset[disabled] .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + box-shadow: none; + color: #4eb5de; } + .button.is-primary.is-inverted.is-outlined, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-primary.is-inverted.is-outlined:hover, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-inverted.is-outlined:focus, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, .button.is-primary.is-inverted.is-outlined.is-focused, .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #4eb5de; } + .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; } + .button.is-primary.is-inverted.is-outlined[disabled], .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined, fieldset[disabled] .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-link { + background-color: #2e63b8; + border-color: transparent; + color: #fff; } + .button.is-link:hover, .button.is-link.is-hovered { + background-color: #2b5eae; + border-color: transparent; + color: #fff; } + .button.is-link:focus, .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .button.is-link:active, .button.is-link.is-active { + background-color: #2958a4; + border-color: transparent; + color: #fff; } + .button.is-link[disabled], fieldset[disabled] .button.is-link { + background-color: #2e63b8; + border-color: transparent; + box-shadow: none; } + .button.is-link.is-inverted { + background-color: #fff; + color: #2e63b8; } + .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #2e63b8; } + .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + color: #2e63b8; } + .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; } + .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + box-shadow: none; + color: #2e63b8; } + .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #2e63b8; } + .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; } + .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-info { + background-color: #209cee; + border-color: transparent; + color: #fff; } + .button.is-info:hover, .button.is-info.is-hovered { + background-color: #1497ed; + border-color: transparent; + color: #fff; } + .button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .button.is-info:active, .button.is-info.is-active { + background-color: #1190e3; + border-color: transparent; + color: #fff; } + .button.is-info[disabled], fieldset[disabled] .button.is-info { + background-color: #209cee; + border-color: transparent; + box-shadow: none; } + .button.is-info.is-inverted { + background-color: #fff; + color: #209cee; } + .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #209cee; } + .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + color: #209cee; } + .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { + background-color: #209cee; + border-color: #209cee; + color: #fff; } + .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #209cee #209cee !important; } + .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + box-shadow: none; + color: #209cee; } + .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #209cee; } + .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #209cee #209cee !important; } + .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-success { + background-color: #22c35b; + border-color: transparent; + color: #fff; } + .button.is-success:hover, .button.is-success.is-hovered { + background-color: #20b856; + border-color: transparent; + color: #fff; } + .button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + color: #fff; } + .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .button.is-success:active, .button.is-success.is-active { + background-color: #1ead51; + border-color: transparent; + color: #fff; } + .button.is-success[disabled], fieldset[disabled] .button.is-success { + background-color: #22c35b; + border-color: transparent; + box-shadow: none; } + .button.is-success.is-inverted { + background-color: #fff; + color: #22c35b; } + .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #22c35b; } + .button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + color: #22c35b; } + .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; } + .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #22c35b #22c35b !important; } + .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + box-shadow: none; + color: #22c35b; } + .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #22c35b; } + .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #22c35b #22c35b !important; } + .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .button.is-warning:active, .button.is-warning.is-active { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning[disabled], fieldset[disabled] .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; } + .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; } + .button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; } + .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; } + .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; } + .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; } + .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-danger { + background-color: #da0b00; + border-color: transparent; + color: #fff; } + .button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #cd0a00; + border-color: transparent; + color: #fff; } + .button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .button.is-danger:active, .button.is-danger.is-active { + background-color: #c10a00; + border-color: transparent; + color: #fff; } + .button.is-danger[disabled], fieldset[disabled] .button.is-danger { + background-color: #da0b00; + border-color: transparent; + box-shadow: none; } + .button.is-danger.is-inverted { + background-color: #fff; + color: #da0b00; } + .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #da0b00; } + .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + color: #da0b00; } + .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; } + .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #da0b00 #da0b00 !important; } + .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + box-shadow: none; + color: #da0b00; } + .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #da0b00; } + .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #da0b00 #da0b00 !important; } + .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-small, #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 2px; + font-size: 0.75rem; } + .button.is-normal { + font-size: 1rem; } + .button.is-medium { + font-size: 1.25rem; } + .button.is-large { + font-size: 1.5rem; } + .button[disabled], fieldset[disabled] .button { + background-color: white; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; } + .button.is-fullwidth { + display: flex; + width: 100%; } + .button.is-loading { + color: transparent !important; + pointer-events: none; } + .button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; } + .button.is-static { + background-color: whitesmoke; + border-color: #dbdbdb; + color: #6b6b6b; + box-shadow: none; + pointer-events: none; } + .button.is-rounded, #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .buttons .button { + margin-bottom: 0.5rem; } + .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + .buttons:last-child { + margin-bottom: -0.5rem; } + .buttons:not(:last-child) { + margin-bottom: 1rem; } + .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 2px; + font-size: 0.75rem; } + .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + .buttons.has-addons .button:last-child { + margin-right: 0; } + .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { + z-index: 2; } + .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { + z-index: 3; } + .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .buttons.is-centered { + justify-content: center; } + .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + .buttons.is-right { + justify-content: flex-end; } + .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + @media screen and (min-width: 1056px) { + .container { + max-width: 992px; } + .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; } } + @media screen and (max-width: 1215px) { + .container.is-widescreen { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + .container.is-fullhd { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + .container { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + .container { + max-width: 1344px; } } +.content li + li { + margin-top: 0.25em; } + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; } + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #222222; + font-weight: 600; + line-height: 1.125; } + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + .content h1:not(:first-child) { + margin-top: 1em; } + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + .content h2:not(:first-child) { + margin-top: 1.1428em; } + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + .content h3:not(:first-child) { + margin-top: 1.3333em; } + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + +.content h6 { + font-size: 1em; + margin-bottom: 1em; } + +.content blockquote { + background-color: whitesmoke; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; } + +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + .content ol:not([type]) { + list-style-type: decimal; } + .content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; } + .content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; } + .content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; } + .content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; } + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + .content ul ul ul { + list-style-type: square; } + +.content dd { + margin-left: 2em; } + +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + .content figure:not(:first-child) { + margin-top: 2em; } + .content figure:not(:last-child) { + margin-bottom: 2em; } + .content figure img { + display: inline-block; } + .content figure figcaption { + font-style: italic; } + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; } + +.content sup, +.content sub { + font-size: 75%; } + +.content table { + width: 100%; } + .content table td, + .content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .content table th { + color: #222222; } + .content table th:not([align]) { + text-align: left; } + .content table thead td, + .content table thead th { + border-width: 0 0 2px; + color: #222222; } + .content table tfoot td, + .content table tfoot th { + border-width: 2px 0 0; + color: #222222; } + .content table tbody tr:last-child td, + .content table tbody tr:last-child th { + border-bottom-width: 0; } + +.content .tabs li + li { + margin-top: 0; } + +.content.is-small, #documenter .docs-sidebar form.docs-search > input.content { + font-size: 0.75rem; } + +.content.is-medium { + font-size: 1.25rem; } + +.content.is-large { + font-size: 1.5rem; } + +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + .icon.is-small, #documenter .docs-sidebar form.docs-search > input.icon { + height: 1rem; + width: 1rem; } + .icon.is-medium { + height: 2rem; + width: 2rem; } + .icon.is-large { + height: 3rem; + width: 3rem; } + +.image, #documenter .docs-sidebar .docs-logo > img { + display: block; + position: relative; } + .image img, #documenter .docs-sidebar .docs-logo > img img { + display: block; + height: auto; + width: 100%; } + .image img.is-rounded, #documenter .docs-sidebar .docs-logo > img img.is-rounded { + border-radius: 290486px; } + .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, + .image.is-square .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, + .image.is-1by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, + .image.is-5by4 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, + .image.is-4by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, + .image.is-3by2 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, + .image.is-5by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, + .image.is-16by9 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, + .image.is-2by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, + .image.is-3by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, + .image.is-4by5 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, + .image.is-3by4 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, + .image.is-2by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, + .image.is-3by5 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, + .image.is-9by16 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, + .image.is-1by2 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, + .image.is-1by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + .image.is-square, #documenter .docs-sidebar .docs-logo > img.is-square, .image.is-1by1, #documenter .docs-sidebar .docs-logo > img.is-1by1 { + padding-top: 100%; } + .image.is-5by4, #documenter .docs-sidebar .docs-logo > img.is-5by4 { + padding-top: 80%; } + .image.is-4by3, #documenter .docs-sidebar .docs-logo > img.is-4by3 { + padding-top: 75%; } + .image.is-3by2, #documenter .docs-sidebar .docs-logo > img.is-3by2 { + padding-top: 66.6666%; } + .image.is-5by3, #documenter .docs-sidebar .docs-logo > img.is-5by3 { + padding-top: 60%; } + .image.is-16by9, #documenter .docs-sidebar .docs-logo > img.is-16by9 { + padding-top: 56.25%; } + .image.is-2by1, #documenter .docs-sidebar .docs-logo > img.is-2by1 { + padding-top: 50%; } + .image.is-3by1, #documenter .docs-sidebar .docs-logo > img.is-3by1 { + padding-top: 33.3333%; } + .image.is-4by5, #documenter .docs-sidebar .docs-logo > img.is-4by5 { + padding-top: 125%; } + .image.is-3by4, #documenter .docs-sidebar .docs-logo > img.is-3by4 { + padding-top: 133.3333%; } + .image.is-2by3, #documenter .docs-sidebar .docs-logo > img.is-2by3 { + padding-top: 150%; } + .image.is-3by5, #documenter .docs-sidebar .docs-logo > img.is-3by5 { + padding-top: 166.6666%; } + .image.is-9by16, #documenter .docs-sidebar .docs-logo > img.is-9by16 { + padding-top: 177.7777%; } + .image.is-1by2, #documenter .docs-sidebar .docs-logo > img.is-1by2 { + padding-top: 200%; } + .image.is-1by3, #documenter .docs-sidebar .docs-logo > img.is-1by3 { + padding-top: 300%; } + .image.is-16x16, #documenter .docs-sidebar .docs-logo > img.is-16x16 { + height: 16px; + width: 16px; } + .image.is-24x24, #documenter .docs-sidebar .docs-logo > img.is-24x24 { + height: 24px; + width: 24px; } + .image.is-32x32, #documenter .docs-sidebar .docs-logo > img.is-32x32 { + height: 32px; + width: 32px; } + .image.is-48x48, #documenter .docs-sidebar .docs-logo > img.is-48x48 { + height: 48px; + width: 48px; } + .image.is-64x64, #documenter .docs-sidebar .docs-logo > img.is-64x64 { + height: 64px; + width: 64px; } + .image.is-96x96, #documenter .docs-sidebar .docs-logo > img.is-96x96 { + height: 96px; + width: 96px; } + .image.is-128x128, #documenter .docs-sidebar .docs-logo > img.is-128x128 { + height: 128px; + width: 128px; } + +.notification { + background-color: whitesmoke; + border-radius: 4px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; } + .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .notification strong { + color: currentColor; } + .notification code, + .notification pre { + background: white; } + .notification pre code { + background: transparent; } + .notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; } + .notification .title, + .notification .subtitle, + .notification .content { + color: currentColor; } + .notification.is-white { + background-color: white; + color: #0a0a0a; } + .notification.is-black { + background-color: #0a0a0a; + color: white; } + .notification.is-light { + background-color: whitesmoke; + color: #363636; } + .notification.is-dark, .content kbd.notification { + background-color: #363636; + color: whitesmoke; } + .notification.is-primary, .docstring > section > a.notification.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .notification.is-link { + background-color: #2e63b8; + color: #fff; } + .notification.is-info { + background-color: #209cee; + color: #fff; } + .notification.is-success { + background-color: #22c35b; + color: #fff; } + .notification.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .notification.is-danger { + background-color: #da0b00; + color: #fff; } + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; } + .progress::-webkit-progress-bar { + background-color: #dbdbdb; } + .progress::-webkit-progress-value { + background-color: #222222; } + .progress::-moz-progress-bar { + background-color: #222222; } + .progress::-ms-fill { + background-color: #222222; + border: none; } + .progress.is-white::-webkit-progress-value { + background-color: white; } + .progress.is-white::-moz-progress-bar { + background-color: white; } + .progress.is-white::-ms-fill { + background-color: white; } + .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); } + .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); } + .progress.is-light::-webkit-progress-value { + background-color: whitesmoke; } + .progress.is-light::-moz-progress-bar { + background-color: whitesmoke; } + .progress.is-light::-ms-fill { + background-color: whitesmoke; } + .progress.is-light:indeterminate { + background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); } + .progress.is-dark::-webkit-progress-value, .content kbd.progress::-webkit-progress-value { + background-color: #363636; } + .progress.is-dark::-moz-progress-bar, .content kbd.progress::-moz-progress-bar { + background-color: #363636; } + .progress.is-dark::-ms-fill, .content kbd.progress::-ms-fill { + background-color: #363636; } + .progress.is-dark:indeterminate, .content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); } + .progress.is-primary::-webkit-progress-value, .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #4eb5de; } + .progress.is-primary::-moz-progress-bar, .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #4eb5de; } + .progress.is-primary::-ms-fill, .docstring > section > a.progress.docs-sourcelink::-ms-fill { + background-color: #4eb5de; } + .progress.is-primary:indeterminate, .docstring > section > a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); } + .progress.is-link::-webkit-progress-value { + background-color: #2e63b8; } + .progress.is-link::-moz-progress-bar { + background-color: #2e63b8; } + .progress.is-link::-ms-fill { + background-color: #2e63b8; } + .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); } + .progress.is-info::-webkit-progress-value { + background-color: #209cee; } + .progress.is-info::-moz-progress-bar { + background-color: #209cee; } + .progress.is-info::-ms-fill { + background-color: #209cee; } + .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); } + .progress.is-success::-webkit-progress-value { + background-color: #22c35b; } + .progress.is-success::-moz-progress-bar { + background-color: #22c35b; } + .progress.is-success::-ms-fill { + background-color: #22c35b; } + .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); } + .progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; } + .progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; } + .progress.is-warning::-ms-fill { + background-color: #ffdd57; } + .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); } + .progress.is-danger::-webkit-progress-value { + background-color: #da0b00; } + .progress.is-danger::-moz-progress-bar { + background-color: #da0b00; } + .progress.is-danger::-ms-fill { + background-color: #da0b00; } + .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); } + .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #dbdbdb; + background-image: linear-gradient(to right, #222222 30%, #dbdbdb 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + .progress.is-small, #documenter .docs-sidebar form.docs-search > input.progress { + height: 0.75rem; } + .progress.is-medium { + height: 1.25rem; } + .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + +.table { + background-color: white; + color: #363636; } + .table td, + .table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .table td.is-white, + .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + .table td.is-black, + .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .table td.is-light, + .table th.is-light { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .table td.is-dark, + .table th.is-dark { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .table td.is-primary, + .table th.is-primary { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; } + .table td.is-link, + .table th.is-link { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + .table td.is-info, + .table th.is-info { + background-color: #209cee; + border-color: #209cee; + color: #fff; } + .table td.is-success, + .table th.is-success { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; } + .table td.is-warning, + .table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .table td.is-danger, + .table th.is-danger { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; } + .table td.is-narrow, + .table th.is-narrow { + white-space: nowrap; + width: 1%; } + .table td.is-selected, + .table th.is-selected { + background-color: #4eb5de; + color: #fff; } + .table td.is-selected a, + .table td.is-selected strong, + .table th.is-selected a, + .table th.is-selected strong { + color: currentColor; } + .table th { + color: #222222; } + .table th:not([align]) { + text-align: left; } + .table tr.is-selected { + background-color: #4eb5de; + color: #fff; } + .table tr.is-selected a, + .table tr.is-selected strong { + color: currentColor; } + .table tr.is-selected td, + .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + .table thead { + background-color: transparent; } + .table thead td, + .table thead th { + border-width: 0 0 2px; + color: #222222; } + .table tfoot { + background-color: transparent; } + .table tfoot td, + .table tfoot th { + border-width: 2px 0 0; + color: #222222; } + .table tbody { + background-color: transparent; } + .table tbody tr:last-child td, + .table tbody tr:last-child th { + border-bottom-width: 0; } + .table.is-bordered td, + .table.is-bordered th { + border-width: 1px; } + .table.is-bordered tr:last-child td, + .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + .table.is-fullwidth { + width: 100%; } + .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: whitesmoke; } + .table.is-narrow td, + .table.is-narrow th { + padding: 0.25em 0.5em; } + .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; } + +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .tags .tag, .tags .content kbd, .content .tags kbd, .tags .docstring > section > a.docs-sourcelink { + margin-bottom: 0.5rem; } + .tags .tag:not(:last-child), .tags .content kbd:not(:last-child), .content .tags kbd:not(:last-child), .tags .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; } + .tags:last-child { + margin-bottom: -0.5rem; } + .tags:not(:last-child) { + margin-bottom: 1rem; } + .tags.are-medium .tag:not(.is-normal):not(.is-large), .tags.are-medium .content kbd:not(.is-normal):not(.is-large), .content .tags.are-medium kbd:not(.is-normal):not(.is-large), .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 1rem; } + .tags.are-large .tag:not(.is-normal):not(.is-medium), .tags.are-large .content kbd:not(.is-normal):not(.is-medium), .content .tags.are-large kbd:not(.is-normal):not(.is-medium), .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + .tags.is-centered { + justify-content: center; } + .tags.is-centered .tag, .tags.is-centered .content kbd, .content .tags.is-centered kbd, .tags.is-centered .docstring > section > a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; } + .tags.is-right { + justify-content: flex-end; } + .tags.is-right .tag:not(:first-child), .tags.is-right .content kbd:not(:first-child), .content .tags.is-right kbd:not(:first-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; } + .tags.is-right .tag:not(:last-child), .tags.is-right .content kbd:not(:last-child), .content .tags.is-right kbd:not(:last-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0; } + .tags.has-addons .tag, .tags.has-addons .content kbd, .content .tags.has-addons kbd, .tags.has-addons .docstring > section > a.docs-sourcelink { + margin-right: 0; } + .tags.has-addons .tag:not(:first-child), .tags.has-addons .content kbd:not(:first-child), .content .tags.has-addons kbd:not(:first-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .tags.has-addons .tag:not(:last-child), .tags.has-addons .content kbd:not(:last-child), .content .tags.has-addons kbd:not(:last-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.tag:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink:not(body) { + align-items: center; + background-color: whitesmoke; + border-radius: 4px; + color: #222222; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + .tag:not(body) .delete, .content kbd:not(body) .delete, .docstring > section > a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + .tag.is-white:not(body), .content kbd.is-white:not(body), .docstring > section > a.docs-sourcelink.is-white:not(body) { + background-color: white; + color: #0a0a0a; } + .tag.is-black:not(body), .content kbd.is-black:not(body), .docstring > section > a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: white; } + .tag.is-light:not(body), .content kbd.is-light:not(body), .docstring > section > a.docs-sourcelink.is-light:not(body) { + background-color: whitesmoke; + color: #363636; } + .tag.is-dark:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink.is-dark:not(body), .content .docstring > section > kbd:not(body) { + background-color: #363636; + color: whitesmoke; } + .tag.is-primary:not(body), .content kbd.is-primary:not(body), .docstring > section > a.docs-sourcelink:not(body) { + background-color: #4eb5de; + color: #fff; } + .tag.is-link:not(body), .content kbd.is-link:not(body), .docstring > section > a.docs-sourcelink.is-link:not(body) { + background-color: #2e63b8; + color: #fff; } + .tag.is-info:not(body), .content kbd.is-info:not(body), .docstring > section > a.docs-sourcelink.is-info:not(body) { + background-color: #209cee; + color: #fff; } + .tag.is-success:not(body), .content kbd.is-success:not(body), .docstring > section > a.docs-sourcelink.is-success:not(body) { + background-color: #22c35b; + color: #fff; } + .tag.is-warning:not(body), .content kbd.is-warning:not(body), .docstring > section > a.docs-sourcelink.is-warning:not(body) { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .tag.is-danger:not(body), .content kbd.is-danger:not(body), .docstring > section > a.docs-sourcelink.is-danger:not(body) { + background-color: #da0b00; + color: #fff; } + .tag.is-normal:not(body), .content kbd.is-normal:not(body), .docstring > section > a.docs-sourcelink.is-normal:not(body) { + font-size: 0.75rem; } + .tag.is-medium:not(body), .content kbd.is-medium:not(body), .docstring > section > a.docs-sourcelink.is-medium:not(body) { + font-size: 1rem; } + .tag.is-large:not(body), .content kbd.is-large:not(body), .docstring > section > a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; } + .tag:not(body) .icon:first-child:not(:last-child), .content kbd:not(body) .icon:first-child:not(:last-child), .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + .tag:not(body) .icon:last-child:not(:first-child), .content kbd:not(body) .icon:last-child:not(:first-child), .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + .tag:not(body) .icon:first-child:last-child, .content kbd:not(body) .icon:first-child:last-child, .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + .tag.is-delete:not(body), .content kbd.is-delete:not(body), .docstring > section > a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; } + .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; } + .tag.is-delete:not(body):hover, .content kbd.is-delete:not(body):hover, .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, .tag.is-delete:not(body):focus, .content kbd.is-delete:not(body):focus, .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { + background-color: #e8e8e8; } + .tag.is-delete:not(body):active, .content kbd.is-delete:not(body):active, .docstring > section > a.docs-sourcelink.is-delete:not(body):active { + background-color: #dbdbdb; } + .tag.is-rounded:not(body), #documenter .docs-sidebar form.docs-search > input:not(body), .content kbd.is-rounded:not(body), #documenter .docs-sidebar .content form.docs-search > input:not(body), .docstring > section > a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; } + +a.tag:hover, .docstring > section > a.docs-sourcelink:hover { + text-decoration: underline; } + +.title, +.subtitle { + word-break: break-word; } + .title em, + .title span, + .subtitle em, + .subtitle span { + font-weight: inherit; } + .title sub, + .subtitle sub { + font-size: 0.75em; } + .title sup, + .subtitle sup { + font-size: 0.75em; } + .title .tag, .title .content kbd, .content .title kbd, .title .docstring > section > a.docs-sourcelink, + .subtitle .tag, + .subtitle .content kbd, + .content .subtitle kbd, + .subtitle .docstring > section > a.docs-sourcelink { + vertical-align: middle; } + +.title { + color: #363636; + font-size: 2rem; + font-weight: 600; + line-height: 1.125; } + .title strong { + color: inherit; + font-weight: inherit; } + .title + .highlight { + margin-top: -0.75rem; } + .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + .title.is-1 { + font-size: 3rem; } + .title.is-2 { + font-size: 2.5rem; } + .title.is-3 { + font-size: 2rem; } + .title.is-4 { + font-size: 1.5rem; } + .title.is-5 { + font-size: 1.25rem; } + .title.is-6 { + font-size: 1rem; } + .title.is-7 { + font-size: 0.75rem; } + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + .subtitle strong { + color: #363636; + font-weight: 600; } + .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + .subtitle.is-1 { + font-size: 3rem; } + .subtitle.is-2 { + font-size: 2.5rem; } + .subtitle.is-3 { + font-size: 2rem; } + .subtitle.is-4 { + font-size: 1.5rem; } + .subtitle.is-5 { + font-size: 1.25rem; } + .subtitle.is-6 { + font-size: 1rem; } + .subtitle.is-7 { + font-size: 0.75rem; } + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; } + .highlight pre { + overflow: auto; + max-width: 100%; } + +.number { + align-items: center; + background-color: whitesmoke; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + +.select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input { + background-color: white; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; } + .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:hover, .textarea:hover, .input:hover, #documenter .docs-sidebar form.docs-search > input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input, #documenter .docs-sidebar form.docs-search > input.is-hovered { + border-color: #b5b5b5; } + .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + border-color: #2e63b8; + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; + color: #6b6b6b; } + .select select[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .input[disabled]::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-moz-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .input[disabled]::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-webkit-input-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .input[disabled]:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-moz-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .input[disabled]:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-ms-input-placeholder { + color: rgba(107, 107, 107, 0.3); } + +.textarea, .input, #documenter .docs-sidebar form.docs-search > input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; } + .textarea[readonly], .input[readonly], #documenter .docs-sidebar form.docs-search > input[readonly] { + box-shadow: none; } + .is-white.textarea, .is-white.input, #documenter .docs-sidebar form.docs-search > input.is-white { + border-color: white; } + .is-white.textarea:focus, .is-white.input:focus, #documenter .docs-sidebar form.docs-search > input.is-white:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-white.textarea:active, .is-white.input:active, #documenter .docs-sidebar form.docs-search > input.is-white:active, .is-white.is-active.textarea, .is-white.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .is-black.textarea, .is-black.input, #documenter .docs-sidebar form.docs-search > input.is-black { + border-color: #0a0a0a; } + .is-black.textarea:focus, .is-black.input:focus, #documenter .docs-sidebar form.docs-search > input.is-black:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-black.textarea:active, .is-black.input:active, #documenter .docs-sidebar form.docs-search > input.is-black:active, .is-black.is-active.textarea, .is-black.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .is-light.textarea, .is-light.input, #documenter .docs-sidebar form.docs-search > input.is-light { + border-color: whitesmoke; } + .is-light.textarea:focus, .is-light.input:focus, #documenter .docs-sidebar form.docs-search > input.is-light:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-light.textarea:active, .is-light.input:active, #documenter .docs-sidebar form.docs-search > input.is-light:active, .is-light.is-active.textarea, .is-light.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .is-dark.textarea, .content kbd.textarea, .is-dark.input, #documenter .docs-sidebar form.docs-search > input.is-dark, .content kbd.input { + border-color: #363636; } + .is-dark.textarea:focus, .content kbd.textarea:focus, .is-dark.input:focus, #documenter .docs-sidebar form.docs-search > input.is-dark:focus, .content kbd.input:focus, .is-dark.is-focused.textarea, .content kbd.is-focused.textarea, .is-dark.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .content kbd.is-focused.input, #documenter .docs-sidebar .content form.docs-search > input.is-focused, .is-dark.textarea:active, .content kbd.textarea:active, .is-dark.input:active, #documenter .docs-sidebar form.docs-search > input.is-dark:active, .content kbd.input:active, .is-dark.is-active.textarea, .content kbd.is-active.textarea, .is-dark.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .content kbd.is-active.input, #documenter .docs-sidebar .content form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .is-primary.textarea, .docstring > section > a.textarea.docs-sourcelink, .is-primary.input, #documenter .docs-sidebar form.docs-search > input.is-primary, .docstring > section > a.input.docs-sourcelink { + border-color: #4eb5de; } + .is-primary.textarea:focus, .docstring > section > a.textarea.docs-sourcelink:focus, .is-primary.input:focus, #documenter .docs-sidebar form.docs-search > input.is-primary:focus, .docstring > section > a.input.docs-sourcelink:focus, .is-primary.is-focused.textarea, .docstring > section > a.is-focused.textarea.docs-sourcelink, .is-primary.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .docstring > section > a.is-focused.input.docs-sourcelink, .is-primary.textarea:active, .docstring > section > a.textarea.docs-sourcelink:active, .is-primary.input:active, #documenter .docs-sidebar form.docs-search > input.is-primary:active, .docstring > section > a.input.docs-sourcelink:active, .is-primary.is-active.textarea, .docstring > section > a.is-active.textarea.docs-sourcelink, .is-primary.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .docstring > section > a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .is-link.textarea, .is-link.input, #documenter .docs-sidebar form.docs-search > input.is-link { + border-color: #2e63b8; } + .is-link.textarea:focus, .is-link.input:focus, #documenter .docs-sidebar form.docs-search > input.is-link:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-link.textarea:active, .is-link.input:active, #documenter .docs-sidebar form.docs-search > input.is-link:active, .is-link.is-active.textarea, .is-link.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .is-info.textarea, .is-info.input, #documenter .docs-sidebar form.docs-search > input.is-info { + border-color: #209cee; } + .is-info.textarea:focus, .is-info.input:focus, #documenter .docs-sidebar form.docs-search > input.is-info:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-info.textarea:active, .is-info.input:active, #documenter .docs-sidebar form.docs-search > input.is-info:active, .is-info.is-active.textarea, .is-info.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .is-success.textarea, .is-success.input, #documenter .docs-sidebar form.docs-search > input.is-success { + border-color: #22c35b; } + .is-success.textarea:focus, .is-success.input:focus, #documenter .docs-sidebar form.docs-search > input.is-success:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-success.textarea:active, .is-success.input:active, #documenter .docs-sidebar form.docs-search > input.is-success:active, .is-success.is-active.textarea, .is-success.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .is-warning.textarea, .is-warning.input, #documenter .docs-sidebar form.docs-search > input.is-warning { + border-color: #ffdd57; } + .is-warning.textarea:focus, .is-warning.input:focus, #documenter .docs-sidebar form.docs-search > input.is-warning:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-warning.textarea:active, .is-warning.input:active, #documenter .docs-sidebar form.docs-search > input.is-warning:active, .is-warning.is-active.textarea, .is-warning.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .is-danger.textarea, .is-danger.input, #documenter .docs-sidebar form.docs-search > input.is-danger { + border-color: #da0b00; } + .is-danger.textarea:focus, .is-danger.input:focus, #documenter .docs-sidebar form.docs-search > input.is-danger:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-danger.textarea:active, .is-danger.input:active, #documenter .docs-sidebar form.docs-search > input.is-danger:active, .is-danger.is-active.textarea, .is-danger.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .is-small.textarea, .is-small.input, #documenter .docs-sidebar form.docs-search > input { + border-radius: 2px; + font-size: 0.75rem; } + .is-medium.textarea, .is-medium.input, #documenter .docs-sidebar form.docs-search > input.is-medium { + font-size: 1.25rem; } + .is-large.textarea, .is-large.input, #documenter .docs-sidebar form.docs-search > input.is-large { + font-size: 1.5rem; } + .is-fullwidth.textarea, .is-fullwidth.input, #documenter .docs-sidebar form.docs-search > input.is-fullwidth { + display: block; + width: 100%; } + .is-inline.textarea, .is-inline.input, #documenter .docs-sidebar form.docs-search > input.is-inline { + display: inline; + width: auto; } + +.input.is-rounded, #documenter .docs-sidebar form.docs-search > input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + +.input.is-static, #documenter .docs-sidebar form.docs-search > input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; } + .textarea:not([rows]) { + max-height: 600px; + min-height: 120px; } + .textarea[rows] { + height: initial; } + .textarea.has-fixed-size { + resize: none; } + +.radio, .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + .radio input, .checkbox input { + cursor: pointer; } + .radio:hover, .checkbox:hover { + color: #363636; } + .radio[disabled], .checkbox[disabled], fieldset[disabled] .radio, fieldset[disabled] .checkbox { + color: #6b6b6b; + cursor: not-allowed; } + +.radio + .radio { + margin-left: 0.5em; } + +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + .select:not(.is-multiple) { + height: 2.25em; } + .select:not(.is-multiple):not(.is-loading)::after { + border-color: #2e63b8; + right: 1.125em; + z-index: 4; } + .select.is-rounded select, #documenter .docs-sidebar form.docs-search > input.select select { + border-radius: 290486px; + padding-left: 1em; } + .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + .select select::-ms-expand { + display: none; } + .select select[disabled]:hover, fieldset[disabled] .select select:hover { + border-color: whitesmoke; } + .select select:not([multiple]) { + padding-right: 2.5em; } + .select select[multiple] { + height: auto; + padding: 0; } + .select select[multiple] option { + padding: 0.5em 1em; } + .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; } + .select.is-white:not(:hover)::after { + border-color: white; } + .select.is-white select { + border-color: white; } + .select.is-white select:hover, .select.is-white select.is-hovered { + border-color: #f2f2f2; } + .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + .select.is-black select { + border-color: #0a0a0a; } + .select.is-black select:hover, .select.is-black select.is-hovered { + border-color: black; } + .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .select.is-light:not(:hover)::after { + border-color: whitesmoke; } + .select.is-light select { + border-color: whitesmoke; } + .select.is-light select:hover, .select.is-light select.is-hovered { + border-color: #e8e8e8; } + .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .select.is-dark:not(:hover)::after, .content kbd.select:not(:hover)::after { + border-color: #363636; } + .select.is-dark select, .content kbd.select select { + border-color: #363636; } + .select.is-dark select:hover, .content kbd.select select:hover, .select.is-dark select.is-hovered, .content kbd.select select.is-hovered { + border-color: #292929; } + .select.is-dark select:focus, .content kbd.select select:focus, .select.is-dark select.is-focused, .content kbd.select select.is-focused, .select.is-dark select:active, .content kbd.select select:active, .select.is-dark select.is-active, .content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .select.is-primary:not(:hover)::after, .docstring > section > a.select.docs-sourcelink:not(:hover)::after { + border-color: #4eb5de; } + .select.is-primary select, .docstring > section > a.select.docs-sourcelink select { + border-color: #4eb5de; } + .select.is-primary select:hover, .docstring > section > a.select.docs-sourcelink select:hover, .select.is-primary select.is-hovered, .docstring > section > a.select.docs-sourcelink select.is-hovered { + border-color: #39acda; } + .select.is-primary select:focus, .docstring > section > a.select.docs-sourcelink select:focus, .select.is-primary select.is-focused, .docstring > section > a.select.docs-sourcelink select.is-focused, .select.is-primary select:active, .docstring > section > a.select.docs-sourcelink select:active, .select.is-primary select.is-active, .docstring > section > a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .select.is-link:not(:hover)::after { + border-color: #2e63b8; } + .select.is-link select { + border-color: #2e63b8; } + .select.is-link select:hover, .select.is-link select.is-hovered { + border-color: #2958a4; } + .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .select.is-info:not(:hover)::after { + border-color: #209cee; } + .select.is-info select { + border-color: #209cee; } + .select.is-info select:hover, .select.is-info select.is-hovered { + border-color: #1190e3; } + .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .select.is-success:not(:hover)::after { + border-color: #22c35b; } + .select.is-success select { + border-color: #22c35b; } + .select.is-success select:hover, .select.is-success select.is-hovered { + border-color: #1ead51; } + .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .select.is-warning:not(:hover)::after { + border-color: #ffdd57; } + .select.is-warning select { + border-color: #ffdd57; } + .select.is-warning select:hover, .select.is-warning select.is-hovered { + border-color: #ffd83e; } + .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .select.is-danger:not(:hover)::after { + border-color: #da0b00; } + .select.is-danger select { + border-color: #da0b00; } + .select.is-danger select:hover, .select.is-danger select.is-hovered { + border-color: #c10a00; } + .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .select.is-small, #documenter .docs-sidebar form.docs-search > input.select { + border-radius: 2px; + font-size: 0.75rem; } + .select.is-medium { + font-size: 1.25rem; } + .select.is-large { + font-size: 1.5rem; } + .select.is-disabled::after { + border-color: #6b6b6b; } + .select.is-fullwidth { + width: 100%; } + .select.is-fullwidth select { + width: 100%; } + .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + .select.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.75rem; } + .select.is-loading.is-medium:after { + font-size: 1.25rem; } + .select.is-loading.is-large:after { + font-size: 1.5rem; } + +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + .file.is-light .file-cta { + background-color: whitesmoke; + border-color: transparent; + color: #363636; } + .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { + background-color: #eeeeee; + border-color: transparent; + color: #363636; } + .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: #363636; } + .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; } + .file.is-dark .file-cta, .content kbd.file .file-cta { + background-color: #363636; + border-color: transparent; + color: whitesmoke; } + .file.is-dark:hover .file-cta, .content kbd.file:hover .file-cta, .file.is-dark.is-hovered .file-cta, .content kbd.file.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; } + .file.is-dark:focus .file-cta, .content kbd.file:focus .file-cta, .file.is-dark.is-focused .file-cta, .content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: whitesmoke; } + .file.is-dark:active .file-cta, .content kbd.file:active .file-cta, .file.is-dark.is-active .file-cta, .content kbd.file.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: whitesmoke; } + .file.is-primary .file-cta, .docstring > section > a.file.docs-sourcelink .file-cta { + background-color: #4eb5de; + border-color: transparent; + color: #fff; } + .file.is-primary:hover .file-cta, .docstring > section > a.file.docs-sourcelink:hover .file-cta, .file.is-primary.is-hovered .file-cta, .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #43b1dc; + border-color: transparent; + color: #fff; } + .file.is-primary:focus .file-cta, .docstring > section > a.file.docs-sourcelink:focus .file-cta, .file.is-primary.is-focused .file-cta, .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); + color: #fff; } + .file.is-primary:active .file-cta, .docstring > section > a.file.docs-sourcelink:active .file-cta, .file.is-primary.is-active .file-cta, .docstring > section > a.file.is-active.docs-sourcelink .file-cta { + background-color: #39acda; + border-color: transparent; + color: #fff; } + .file.is-link .file-cta { + background-color: #2e63b8; + border-color: transparent; + color: #fff; } + .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { + background-color: #2b5eae; + border-color: transparent; + color: #fff; } + .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); + color: #fff; } + .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { + background-color: #2958a4; + border-color: transparent; + color: #fff; } + .file.is-info .file-cta { + background-color: #209cee; + border-color: transparent; + color: #fff; } + .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { + background-color: #1497ed; + border-color: transparent; + color: #fff; } + .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); + color: #fff; } + .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { + background-color: #1190e3; + border-color: transparent; + color: #fff; } + .file.is-success .file-cta { + background-color: #22c35b; + border-color: transparent; + color: #fff; } + .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { + background-color: #20b856; + border-color: transparent; + color: #fff; } + .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); + color: #fff; } + .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { + background-color: #1ead51; + border-color: transparent; + color: #fff; } + .file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-danger .file-cta { + background-color: #da0b00; + border-color: transparent; + color: #fff; } + .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { + background-color: #cd0a00; + border-color: transparent; + color: #fff; } + .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); + color: #fff; } + .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { + background-color: #c10a00; + border-color: transparent; + color: #fff; } + .file.is-small, #documenter .docs-sidebar form.docs-search > input.file { + font-size: 0.75rem; } + .file.is-medium { + font-size: 1.25rem; } + .file.is-medium .file-icon .fa { + font-size: 21px; } + .file.is-large { + font-size: 1.5rem; } + .file.is-large .file-icon .fa { + font-size: 28px; } + .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .file.has-name.is-empty .file-cta { + border-radius: 4px; } + .file.has-name.is-empty .file-name { + display: none; } + .file.is-boxed .file-label { + flex-direction: column; } + .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + .file.is-boxed .file-name { + border-width: 0 1px 1px; } + .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + .file.is-boxed .file-icon .fa { + font-size: 21px; } + .file.is-boxed.is-small .file-icon .fa, #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { + font-size: 14px; } + .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + .file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; } + .file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; } + .file.is-centered { + justify-content: center; } + .file.is-fullwidth .file-label { + width: 100%; } + .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + .file.is-right { + justify-content: flex-end; } + .file.is-right .file-cta { + border-radius: 0 4px 4px 0; } + .file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; } + +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + .file-label:hover .file-cta { + background-color: #eeeeee; + color: #363636; } + .file-label:hover .file-name { + border-color: #d5d5d5; } + .file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; } + .file-label:active .file-name { + border-color: #cfcfcf; } + +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + +.file-cta { + background-color: whitesmoke; + color: #4a4a4a; } + +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; } + +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + .file-icon .fa { + font-size: 14px; } + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; } + .label:not(:last-child) { + margin-bottom: 0.5em; } + .label.is-small, #documenter .docs-sidebar form.docs-search > input.label { + font-size: 0.75rem; } + .label.is-medium { + font-size: 1.25rem; } + .label.is-large { + font-size: 1.5rem; } + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; } + .help.is-white { + color: white; } + .help.is-black { + color: #0a0a0a; } + .help.is-light { + color: whitesmoke; } + .help.is-dark, .content kbd.help { + color: #363636; } + .help.is-primary, .docstring > section > a.help.docs-sourcelink { + color: #4eb5de; } + .help.is-link { + color: #2e63b8; } + .help.is-info { + color: #209cee; } + .help.is-success { + color: #22c35b; } + .help.is-warning { + color: #ffdd57; } + .help.is-danger { + color: #da0b00; } + +.field:not(:last-child) { + margin-bottom: 0.75rem; } + +.field.has-addons { + display: flex; + justify-content: flex-start; } + .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + .field.has-addons .control:not(:first-child):not(:last-child) .button, + .field.has-addons .control:not(:first-child):not(:last-child) .input, + .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, + .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + .field.has-addons .control:first-child:not(:only-child) .button, + .field.has-addons .control:first-child:not(:only-child) .input, + .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, + .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .field.has-addons .control:last-child:not(:only-child) .button, + .field.has-addons .control:last-child:not(:only-child) .input, + .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, + .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button.is-hovered:not([disabled]), + .field.has-addons .control .input:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, + .field.has-addons .control .input.is-hovered:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), + .field.has-addons .control .select select:not([disabled]):hover, + .field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; } + .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button.is-focused:not([disabled]), .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button.is-active:not([disabled]), + .field.has-addons .control .input:not([disabled]):focus, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, + .field.has-addons .control .input.is-focused:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), + .field.has-addons .control .input:not([disabled]):active, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, + .field.has-addons .control .input.is-active:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), + .field.has-addons .control .select select:not([disabled]):focus, + .field.has-addons .control .select select.is-focused:not([disabled]), + .field.has-addons .control .select select:not([disabled]):active, + .field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; } + .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button.is-focused:not([disabled]):hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button.is-active:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]):focus:hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, + .field.has-addons .control .input.is-focused:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]):active:hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, + .field.has-addons .control .input.is-active:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]):focus:hover, + .field.has-addons .control .select select.is-focused:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]):active:hover, + .field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; } + .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.has-addons.has-addons-centered { + justify-content: center; } + .field.has-addons.has-addons-right { + justify-content: flex-end; } + .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + +.field.is-grouped { + display: flex; + justify-content: flex-start; } + .field.is-grouped > .control { + flex-shrink: 0; } + .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.is-grouped.is-grouped-centered { + justify-content: center; } + .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; } } + +.field-label .label { + font-size: inherit; } + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; } } + +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + .field-label.is-small, #documenter .docs-sidebar form.docs-search > input.field-label { + font-size: 0.75rem; + padding-top: 0.375em; } + .field-label.is-normal { + padding-top: 0.375em; } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + +.field-body .field .field { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + .field-body .field { + margin-bottom: 0; } + .field-body > .field { + flex-shrink: 1; } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; } + .control.has-icons-left .input:focus ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, + .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, + .control.has-icons-right .select:focus ~ .icon { + color: #6b6b6b; } + .control.has-icons-left .input.is-small ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, + .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, + .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; } + .control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, + .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, + .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + .control.has-icons-left .input.is-large ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, + .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, + .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + .control.has-icons-left .icon, .control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; } + .control.has-icons-left .input, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, + .control.has-icons-left .select select { + padding-left: 2.25em; } + .control.has-icons-left .icon.is-left { + left: 0; } + .control.has-icons-right .input, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, + .control.has-icons-right .select select { + padding-right: 2.25em; } + .control.has-icons-right .icon.is-right { + right: 0; } + .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + .control.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.75rem; } + .control.is-loading.is-medium:after { + font-size: 1.25rem; } + .control.is-loading.is-large:after { + font-size: 1.5rem; } + +.breadcrumb { + font-size: 1rem; + white-space: nowrap; } + .breadcrumb a { + align-items: center; + color: #2e63b8; + display: flex; + justify-content: center; + padding: 0 0.75em; } + .breadcrumb a:hover { + color: #363636; } + .breadcrumb li { + align-items: center; + display: flex; } + .breadcrumb li:first-child a { + padding-left: 0; } + .breadcrumb li.is-active a { + color: #222222; + cursor: default; + pointer-events: none; } + .breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; } + .breadcrumb ul, + .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .breadcrumb .icon:first-child { + margin-right: 0.5em; } + .breadcrumb .icon:last-child { + margin-left: 0.5em; } + .breadcrumb.is-centered ol, + .breadcrumb.is-centered ul { + justify-content: center; } + .breadcrumb.is-right ol, + .breadcrumb.is-right ul { + justify-content: flex-end; } + .breadcrumb.is-small, #documenter .docs-sidebar form.docs-search > input.breadcrumb { + font-size: 0.75rem; } + .breadcrumb.is-medium { + font-size: 1.25rem; } + .breadcrumb.is-large { + font-size: 1.5rem; } + .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + +.card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222222; + max-width: 100%; + position: relative; } + +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; } + +.card-header-title { + align-items: center; + color: #222222; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; } + .card-header-title.is-centered { + justify-content: center; } + +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; } + +.card-image { + display: block; + position: relative; } + +.card-content { + background-color: transparent; + padding: 1.5rem; } + +.card-footer { + background-color: transparent; + border-top: 1px solid #dbdbdb; + align-items: stretch; + display: flex; } + +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + .card-footer-item:not(:last-child) { + border-right: 1px solid #dbdbdb; } + +.card .media:not(:last-child) { + margin-bottom: 1.5rem; } + +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + +.dropdown-content { + background-color: white; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; } + a.dropdown-item:hover, + button.dropdown-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + a.dropdown-item.is-active, + button.dropdown-item.is-active { + background-color: #2e63b8; + color: #fff; } + +.dropdown-divider { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + +.level { + align-items: center; + justify-content: space-between; } + .level code { + border-radius: 4px; } + .level img { + display: inline-block; + vertical-align: top; } + .level.is-mobile { + display: flex; } + .level.is-mobile .level-left, + .level.is-mobile .level-right { + display: flex; } + .level.is-mobile .level-left + .level-right { + margin-top: 0; } + .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level { + display: flex; } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + .level-item .title, + .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + .level-left .level-item.is-flexible, + .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } +.level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + .level-left { + display: flex; } } +.level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + .level-right { + display: flex; } } +.list { + background-color: white; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + +.list-item { + display: block; + padding: 0.5em 1em; } + .list-item:not(a) { + color: #222222; } + .list-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + .list-item:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + .list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; } + .list-item.is-active { + background-color: #2e63b8; + color: #fff; } + +a.list-item { + background-color: whitesmoke; + cursor: pointer; } + +.media { + align-items: flex-start; + display: flex; + text-align: left; } + .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + .media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: flex; + padding-top: 0.75rem; } + .media .media .content:not(:last-child), + .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + .media .media .media { + padding-top: 0.5rem; } + .media .media .media + .media { + margin-top: 0.5rem; } + .media + .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + +.media-left { + margin-right: 1rem; } + +.media-right { + margin-left: 1rem; } + +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; } + +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; } } + +.menu { + font-size: 1rem; } + .menu.is-small, #documenter .docs-sidebar form.docs-search > input.menu { + font-size: 0.75rem; } + .menu.is-medium { + font-size: 1.25rem; } + .menu.is-large { + font-size: 1.5rem; } + +.menu-list { + line-height: 1.25; } + .menu-list a { + border-radius: 2px; + color: #222222; + display: block; + padding: 0.5em 0.75em; } + .menu-list a:hover { + background-color: whitesmoke; + color: #222222; } + .menu-list a.is-active { + background-color: #2e63b8; + color: #fff; } + .menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; } + +.menu-label { + color: #6b6b6b; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + .menu-label:not(:first-child) { + margin-top: 1em; } + .menu-label:not(:last-child) { + margin-bottom: 1em; } + +.message { + background-color: whitesmoke; + border-radius: 4px; + font-size: 1rem; } + .message strong { + color: currentColor; } + .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .message.is-small, #documenter .docs-sidebar form.docs-search > input.message { + font-size: 0.75rem; } + .message.is-medium { + font-size: 1.25rem; } + .message.is-large { + font-size: 1.5rem; } + .message.is-white { + background-color: white; } + .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + .message.is-white .message-body { + border-color: white; + color: #4d4d4d; } + .message.is-black { + background-color: #fafafa; } + .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + .message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; } + .message.is-light { + background-color: #fafafa; } + .message.is-light .message-header { + background-color: whitesmoke; + color: #363636; } + .message.is-light .message-body { + border-color: whitesmoke; + color: #505050; } + .message.is-dark, .content kbd.message { + background-color: #fafafa; } + .message.is-dark .message-header, .content kbd.message .message-header { + background-color: #363636; + color: whitesmoke; } + .message.is-dark .message-body, .content kbd.message .message-body { + border-color: #363636; + color: #2a2a2a; } + .message.is-primary, .docstring > section > a.message.docs-sourcelink { + background-color: #f6fbfd; } + .message.is-primary .message-header, .docstring > section > a.message.docs-sourcelink .message-header { + background-color: #4eb5de; + color: #fff; } + .message.is-primary .message-body, .docstring > section > a.message.docs-sourcelink .message-body { + border-color: #4eb5de; + color: #1f556a; } + .message.is-link { + background-color: #f7f9fd; } + .message.is-link .message-header { + background-color: #2e63b8; + color: #fff; } + .message.is-link .message-body { + border-color: #2e63b8; + color: #264981; } + .message.is-info { + background-color: #f6fbfe; } + .message.is-info .message-header { + background-color: #209cee; + color: #fff; } + .message.is-info .message-body { + border-color: #209cee; + color: #12537d; } + .message.is-success { + background-color: #f6fdf9; } + .message.is-success .message-header { + background-color: #22c35b; + color: #fff; } + .message.is-success .message-body { + border-color: #22c35b; + color: #0f361d; } + .message.is-warning { + background-color: #fffdf5; } + .message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .message.is-warning .message-body { + border-color: #ffdd57; + color: #3c3108; } + .message.is-danger { + background-color: #fff5f5; } + .message.is-danger .message-header { + background-color: #da0b00; + color: #fff; } + .message.is-danger .message-body { + border-color: #da0b00; + color: #9b0c04; } + +.message-header { + align-items: center; + background-color: #222222; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #222222; + padding: 1.25em 1.5em; } + .message-body code, + .message-body pre { + background-color: white; } + .message-body pre code { + background-color: transparent; } + +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + .modal.is-active { + display: flex; } + +.modal-background { + background-color: rgba(10, 10, 10, 0.86); } + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: whitesmoke; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; } + +.modal-card-title { + color: #222222; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; } + .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + +.navbar { + background-color: white; + min-height: 3.25rem; + position: relative; + z-index: 30; } + .navbar.is-white { + background-color: white; + color: #0a0a0a; } + .navbar.is-white .navbar-brand > .navbar-item, + .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, + .navbar.is-white .navbar-brand .navbar-link:focus, + .navbar.is-white .navbar-brand .navbar-link:hover, + .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1056px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + .navbar.is-black { + background-color: #0a0a0a; + color: white; } + .navbar.is-black .navbar-brand > .navbar-item, + .navbar.is-black .navbar-brand .navbar-link { + color: white; } + .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, + .navbar.is-black .navbar-brand .navbar-link:focus, + .navbar.is-black .navbar-brand .navbar-link:hover, + .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1056px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: white; } + .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + .navbar.is-light { + background-color: whitesmoke; + color: #363636; } + .navbar.is-light .navbar-brand > .navbar-item, + .navbar.is-light .navbar-brand .navbar-link { + color: #363636; } + .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, + .navbar.is-light .navbar-brand .navbar-link:focus, + .navbar.is-light .navbar-brand .navbar-link:hover, + .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-brand .navbar-link::after { + border-color: #363636; } + .navbar.is-light .navbar-burger { + color: #363636; } + @media screen and (min-width: 1056px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: #363636; } + .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: #363636; } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #363636; } } + .navbar.is-dark, .content kbd.navbar { + background-color: #363636; + color: whitesmoke; } + .navbar.is-dark .navbar-brand > .navbar-item, .content kbd.navbar .navbar-brand > .navbar-item, + .navbar.is-dark .navbar-brand .navbar-link, + .content kbd.navbar .navbar-brand .navbar-link { + color: whitesmoke; } + .navbar.is-dark .navbar-brand > a.navbar-item:focus, .content kbd.navbar .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .content kbd.navbar .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, .content kbd.navbar .navbar-brand > a.navbar-item.is-active, + .navbar.is-dark .navbar-brand .navbar-link:focus, + .content kbd.navbar .navbar-brand .navbar-link:focus, + .navbar.is-dark .navbar-brand .navbar-link:hover, + .content kbd.navbar .navbar-brand .navbar-link:hover, + .navbar.is-dark .navbar-brand .navbar-link.is-active, + .content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-brand .navbar-link::after, .content kbd.navbar .navbar-brand .navbar-link::after { + border-color: whitesmoke; } + .navbar.is-dark .navbar-burger, .content kbd.navbar .navbar-burger { + color: whitesmoke; } + @media screen and (min-width: 1056px) { + .navbar.is-dark .navbar-start > .navbar-item, .content kbd.navbar .navbar-start > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .content kbd.navbar .navbar-start .navbar-link, + .navbar.is-dark .navbar-end > .navbar-item, + .content kbd.navbar .navbar-end > .navbar-item, + .navbar.is-dark .navbar-end .navbar-link, + .content kbd.navbar .navbar-end .navbar-link { + color: whitesmoke; } + .navbar.is-dark .navbar-start > a.navbar-item:focus, .content kbd.navbar .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .content kbd.navbar .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, .content kbd.navbar .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:focus, + .content kbd.navbar .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-start .navbar-link:hover, + .content kbd.navbar .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .content kbd.navbar .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .content kbd.navbar .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .content kbd.navbar .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .content kbd.navbar .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:focus, + .content kbd.navbar .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:hover, + .content kbd.navbar .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active, + .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-start .navbar-link::after, .content kbd.navbar .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after, + .content kbd.navbar .navbar-end .navbar-link::after { + border-color: whitesmoke; } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: whitesmoke; } } + .navbar.is-primary, .docstring > section > a.navbar.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .navbar.is-primary .navbar-brand > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, + .navbar.is-primary .navbar-brand .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-brand > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, + .navbar.is-primary .navbar-brand .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, + .navbar.is-primary .navbar-brand .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, + .navbar.is-primary .navbar-brand .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-brand .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-burger, .docstring > section > a.navbar.docs-sourcelink .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-primary .navbar-start > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, + .navbar.is-primary .navbar-end > .navbar-item, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, + .navbar.is-primary .navbar-end .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-start > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-start .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-start .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #4eb5de; + color: #fff; } } + .navbar.is-link { + background-color: #2e63b8; + color: #fff; } + .navbar.is-link .navbar-brand > .navbar-item, + .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, + .navbar.is-link .navbar-brand .navbar-link:focus, + .navbar.is-link .navbar-brand .navbar-link:hover, + .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #2e63b8; + color: #fff; } } + .navbar.is-info { + background-color: #209cee; + color: #fff; } + .navbar.is-info .navbar-brand > .navbar-item, + .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, + .navbar.is-info .navbar-brand .navbar-link:focus, + .navbar.is-info .navbar-brand .navbar-link:hover, + .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #209cee; + color: #fff; } } + .navbar.is-success { + background-color: #22c35b; + color: #fff; } + .navbar.is-success .navbar-brand > .navbar-item, + .navbar.is-success .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, + .navbar.is-success .navbar-brand .navbar-link:focus, + .navbar.is-success .navbar-brand .navbar-link:hover, + .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-success .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; } + .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #22c35b; + color: #fff; } } + .navbar.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > .navbar-item, + .navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + .navbar.is-warning .navbar-brand .navbar-link:focus, + .navbar.is-warning .navbar-brand .navbar-link:hover, + .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-burger { + color: rgba(0, 0, 0, 0.7); } + @media screen and (min-width: 1056px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } } + .navbar.is-danger { + background-color: #da0b00; + color: #fff; } + .navbar.is-danger .navbar-brand > .navbar-item, + .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + .navbar.is-danger .navbar-brand .navbar-link:focus, + .navbar.is-danger .navbar-brand .navbar-link:hover, + .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #da0b00; + color: #fff; } } + .navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; } + .navbar.has-shadow { + box-shadow: 0 2px 0 0 whitesmoke; } + .navbar.is-fixed-bottom, .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom { + bottom: 0; } + .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 whitesmoke; } + .navbar.is-fixed-top { + top: 0; } + +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; } + +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; } + +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; } + +.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { + background-color: transparent; } + +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + +.navbar-burger { + color: #4a4a4a; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; } + .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + +.navbar-menu { + display: none; } + +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + .navbar-item .icon:only-child, + .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + +a.navbar-item, +.navbar-link { + cursor: pointer; } + a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, + .navbar-link:focus, + .navbar-link:focus-within, + .navbar-link:hover, + .navbar-link.is-active { + background-color: #fafafa; + color: #2e63b8; } + +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; } + .navbar-item img { + max-height: 1.75rem; } + .navbar-item.has-dropdown { + padding: 0; } + .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); } + .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #2e63b8; } + .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #2e63b8; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #2e63b8; + padding-bottom: calc(0.5rem - 3px); } + +.navbar-content { + flex-grow: 1; + flex-shrink: 1; } + +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + .navbar-link:not(.is-arrowless)::after { + border-color: #2e63b8; + margin-top: -0.375em; + right: 1.125em; } + +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + +.navbar-divider { + background-color: whitesmoke; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + +@media screen and (max-width: 1055px) { + .navbar > .container { + display: block; } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + .navbar-link::after { + display: none; } + .navbar-menu { + background-color: white; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + .navbar-menu.is-active { + display: block; } + .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-touch { + bottom: 0; } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-touch { + top: 0; } + .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; } } + +@media screen and (min-width: 1056px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; } + .navbar { + min-height: 3.25rem; } + .navbar.is-spaced { + padding: 1rem 2rem; } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; } + .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #2e63b8; } + .navbar-burger { + display: none; } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; } + .navbar-item { + display: flex; } + .navbar-item.has-dropdown { + align-items: stretch; } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + .navbar-start { + justify-content: flex-start; + margin-right: auto; } + .navbar-end { + justify-content: flex-end; + margin-left: auto; } + .navbar-dropdown { + background-color: white; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #2e63b8; } + .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + .navbar-dropdown.is-right { + left: auto; + right: 0; } + .navbar-divider { + display: block; } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -.75rem; } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -.75rem; } + .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-desktop { + bottom: 0; } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-desktop { + top: 0; } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #0a0a0a; } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; } } + +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); } + +.pagination { + font-size: 1rem; + margin: -0.25rem; } + .pagination.is-small, #documenter .docs-sidebar form.docs-search > input.pagination { + font-size: 0.75rem; } + .pagination.is-medium { + font-size: 1.25rem; } + .pagination.is-large { + font-size: 1.5rem; } + .pagination.is-rounded .pagination-previous, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, + .pagination.is-rounded .pagination-next, + #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; } + .pagination.is-rounded .pagination-link, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { + border-radius: 290486px; } + +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.25em; } + .pagination-previous:hover, + .pagination-next:hover, + .pagination-link:hover { + border-color: #b5b5b5; + color: #363636; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus { + border-color: #3c5dcd; } + .pagination-previous:active, + .pagination-next:active, + .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #6b6b6b; + opacity: 0.5; } + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + +.pagination-link.is-current { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; } + +.pagination-list { + flex-wrap: wrap; } + +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + .pagination-previous { + order: 2; } + .pagination-next { + order: 3; } + .pagination { + justify-content: space-between; } + .pagination.is-centered .pagination-previous { + order: 1; } + .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + .pagination.is-centered .pagination-next { + order: 3; } + .pagination.is-right .pagination-previous { + order: 1; } + .pagination.is-right .pagination-next { + order: 2; } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + +.panel { + font-size: 1rem; } + .panel:not(:last-child) { + margin-bottom: 1.5rem; } + +.panel-heading, +.panel-tabs, +.panel-block { + border-bottom: 1px solid #dbdbdb; + border-left: 1px solid #dbdbdb; + border-right: 1px solid #dbdbdb; } + .panel-heading:first-child, + .panel-tabs:first-child, + .panel-block:first-child { + border-top: 1px solid #dbdbdb; } + +.panel-heading { + background-color: whitesmoke; + border-radius: 4px 4px 0 0; + color: #222222; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; } + +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + .panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; } + .panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; } + +.panel-list a { + color: #222222; } + .panel-list a:hover { + color: #2e63b8; } + +.panel-block { + align-items: center; + color: #222222; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + .panel-block.is-wrapped { + flex-wrap: wrap; } + .panel-block.is-active { + border-left-color: #2e63b8; + color: #363636; } + .panel-block.is-active .panel-icon { + color: #2e63b8; } + +a.panel-block, +label.panel-block { + cursor: pointer; } + a.panel-block:hover, + label.panel-block:hover { + background-color: whitesmoke; } + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #6b6b6b; + margin-right: 0.75em; } + .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + .tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #222222; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + .tabs a:hover { + border-bottom-color: #222222; + color: #222222; } + .tabs li { + display: block; } + .tabs li.is-active a { + border-bottom-color: #2e63b8; + color: #2e63b8; } + .tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + .tabs ul.is-left { + padding-right: 0.75em; } + .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + .tabs .icon:first-child { + margin-right: 0.5em; } + .tabs .icon:last-child { + margin-left: 0.5em; } + .tabs.is-centered ul { + justify-content: center; } + .tabs.is-right ul { + justify-content: flex-end; } + .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + .tabs.is-boxed a:hover { + background-color: whitesmoke; + border-bottom-color: #dbdbdb; } + .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #dbdbdb; + border-bottom-color: transparent !important; } + .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + .tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + .tabs.is-toggle a:hover { + background-color: whitesmoke; + border-color: #b5b5b5; + z-index: 2; } + .tabs.is-toggle li + li { + margin-left: -1px; } + .tabs.is-toggle li:first-child a { + border-radius: 4px 0 0 4px; } + .tabs.is-toggle li:last-child a { + border-radius: 0 4px 4px 0; } + .tabs.is-toggle li.is-active a { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; + z-index: 1; } + .tabs.is-toggle ul { + border-bottom: none; } + .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; } + .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; } + .tabs.is-small, #documenter .docs-sidebar form.docs-search > input.tabs { + font-size: 0.75rem; } + .tabs.is-medium { + font-size: 1.25rem; } + .tabs.is-large { + font-size: 1.5rem; } + +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > .column.is-narrow { + flex: none; } + .columns.is-mobile > .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > .column.is-1 { + flex: none; + width: 8.3333333333%; } + .columns.is-mobile > .column.is-offset-1 { + margin-left: 8.3333333333%; } + .columns.is-mobile > .column.is-2 { + flex: none; + width: 16.6666666667%; } + .columns.is-mobile > .column.is-offset-2 { + margin-left: 16.6666666667%; } + .columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > .column.is-4 { + flex: none; + width: 33.3333333333%; } + .columns.is-mobile > .column.is-offset-4 { + margin-left: 33.3333333333%; } + .columns.is-mobile > .column.is-5 { + flex: none; + width: 41.6666666667%; } + .columns.is-mobile > .column.is-offset-5 { + margin-left: 41.6666666667%; } + .columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > .column.is-7 { + flex: none; + width: 58.3333333333%; } + .columns.is-mobile > .column.is-offset-7 { + margin-left: 58.3333333333%; } + .columns.is-mobile > .column.is-8 { + flex: none; + width: 66.6666666667%; } + .columns.is-mobile > .column.is-offset-8 { + margin-left: 66.6666666667%; } + .columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > .column.is-10 { + flex: none; + width: 83.3333333333%; } + .columns.is-mobile > .column.is-offset-10 { + margin-left: 83.3333333333%; } + .columns.is-mobile > .column.is-11 { + flex: none; + width: 91.6666666667%; } + .columns.is-mobile > .column.is-offset-11 { + margin-left: 91.6666666667%; } + .columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; } + .column.is-full-mobile { + flex: none; + width: 100%; } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + .column.is-half-mobile { + flex: none; + width: 50%; } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + .column.is-offset-half-mobile { + margin-left: 50%; } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + .column.is-0-mobile { + flex: none; + width: 0%; } + .column.is-offset-0-mobile { + margin-left: 0%; } + .column.is-1-mobile { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-mobile { + margin-left: 8.3333333333%; } + .column.is-2-mobile { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-mobile { + margin-left: 16.6666666667%; } + .column.is-3-mobile { + flex: none; + width: 25%; } + .column.is-offset-3-mobile { + margin-left: 25%; } + .column.is-4-mobile { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-mobile { + margin-left: 33.3333333333%; } + .column.is-5-mobile { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-mobile { + margin-left: 41.6666666667%; } + .column.is-6-mobile { + flex: none; + width: 50%; } + .column.is-offset-6-mobile { + margin-left: 50%; } + .column.is-7-mobile { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-mobile { + margin-left: 58.3333333333%; } + .column.is-8-mobile { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-mobile { + margin-left: 66.6666666667%; } + .column.is-9-mobile { + flex: none; + width: 75%; } + .column.is-offset-9-mobile { + margin-left: 75%; } + .column.is-10-mobile { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-mobile { + margin-left: 83.3333333333%; } + .column.is-11-mobile { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-mobile { + margin-left: 91.6666666667%; } + .column.is-12-mobile { + flex: none; + width: 100%; } + .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + .column.is-narrow, .column.is-narrow-tablet { + flex: none; } + .column.is-full, .column.is-full-tablet { + flex: none; + width: 100%; } + .column.is-three-quarters, .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + .column.is-two-thirds, .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + .column.is-half, .column.is-half-tablet { + flex: none; + width: 50%; } + .column.is-one-third, .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + .column.is-one-quarter, .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + .column.is-one-fifth, .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + .column.is-two-fifths, .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + .column.is-three-fifths, .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + .column.is-four-fifths, .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + .column.is-offset-half, .column.is-offset-half-tablet { + margin-left: 50%; } + .column.is-offset-one-third, .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + .column.is-0, .column.is-0-tablet { + flex: none; + width: 0%; } + .column.is-offset-0, .column.is-offset-0-tablet { + margin-left: 0%; } + .column.is-1, .column.is-1-tablet { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1, .column.is-offset-1-tablet { + margin-left: 8.3333333333%; } + .column.is-2, .column.is-2-tablet { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2, .column.is-offset-2-tablet { + margin-left: 16.6666666667%; } + .column.is-3, .column.is-3-tablet { + flex: none; + width: 25%; } + .column.is-offset-3, .column.is-offset-3-tablet { + margin-left: 25%; } + .column.is-4, .column.is-4-tablet { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4, .column.is-offset-4-tablet { + margin-left: 33.3333333333%; } + .column.is-5, .column.is-5-tablet { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5, .column.is-offset-5-tablet { + margin-left: 41.6666666667%; } + .column.is-6, .column.is-6-tablet { + flex: none; + width: 50%; } + .column.is-offset-6, .column.is-offset-6-tablet { + margin-left: 50%; } + .column.is-7, .column.is-7-tablet { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7, .column.is-offset-7-tablet { + margin-left: 58.3333333333%; } + .column.is-8, .column.is-8-tablet { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8, .column.is-offset-8-tablet { + margin-left: 66.6666666667%; } + .column.is-9, .column.is-9-tablet { + flex: none; + width: 75%; } + .column.is-offset-9, .column.is-offset-9-tablet { + margin-left: 75%; } + .column.is-10, .column.is-10-tablet { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10, .column.is-offset-10-tablet { + margin-left: 83.3333333333%; } + .column.is-11, .column.is-11-tablet { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11, .column.is-offset-11-tablet { + margin-left: 91.6666666667%; } + .column.is-12, .column.is-12-tablet { + flex: none; + width: 100%; } + .column.is-offset-12, .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1055px) { + .column.is-narrow-touch { + flex: none; } + .column.is-full-touch { + flex: none; + width: 100%; } + .column.is-three-quarters-touch { + flex: none; + width: 75%; } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + .column.is-half-touch { + flex: none; + width: 50%; } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-touch { + flex: none; + width: 25%; } + .column.is-one-fifth-touch { + flex: none; + width: 20%; } + .column.is-two-fifths-touch { + flex: none; + width: 40%; } + .column.is-three-fifths-touch { + flex: none; + width: 60%; } + .column.is-four-fifths-touch { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-touch { + margin-left: 75%; } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + .column.is-offset-half-touch { + margin-left: 50%; } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-touch { + margin-left: 25%; } + .column.is-offset-one-fifth-touch { + margin-left: 20%; } + .column.is-offset-two-fifths-touch { + margin-left: 40%; } + .column.is-offset-three-fifths-touch { + margin-left: 60%; } + .column.is-offset-four-fifths-touch { + margin-left: 80%; } + .column.is-0-touch { + flex: none; + width: 0%; } + .column.is-offset-0-touch { + margin-left: 0%; } + .column.is-1-touch { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-touch { + margin-left: 8.3333333333%; } + .column.is-2-touch { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-touch { + margin-left: 16.6666666667%; } + .column.is-3-touch { + flex: none; + width: 25%; } + .column.is-offset-3-touch { + margin-left: 25%; } + .column.is-4-touch { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-touch { + margin-left: 33.3333333333%; } + .column.is-5-touch { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-touch { + margin-left: 41.6666666667%; } + .column.is-6-touch { + flex: none; + width: 50%; } + .column.is-offset-6-touch { + margin-left: 50%; } + .column.is-7-touch { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-touch { + margin-left: 58.3333333333%; } + .column.is-8-touch { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-touch { + margin-left: 66.6666666667%; } + .column.is-9-touch { + flex: none; + width: 75%; } + .column.is-offset-9-touch { + margin-left: 75%; } + .column.is-10-touch { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-touch { + margin-left: 83.3333333333%; } + .column.is-11-touch { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-touch { + margin-left: 91.6666666667%; } + .column.is-12-touch { + flex: none; + width: 100%; } + .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1056px) { + .column.is-narrow-desktop { + flex: none; } + .column.is-full-desktop { + flex: none; + width: 100%; } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + .column.is-half-desktop { + flex: none; + width: 50%; } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + .column.is-offset-half-desktop { + margin-left: 50%; } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + .column.is-0-desktop { + flex: none; + width: 0%; } + .column.is-offset-0-desktop { + margin-left: 0%; } + .column.is-1-desktop { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-desktop { + margin-left: 8.3333333333%; } + .column.is-2-desktop { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-desktop { + margin-left: 16.6666666667%; } + .column.is-3-desktop { + flex: none; + width: 25%; } + .column.is-offset-3-desktop { + margin-left: 25%; } + .column.is-4-desktop { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-desktop { + margin-left: 33.3333333333%; } + .column.is-5-desktop { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-desktop { + margin-left: 41.6666666667%; } + .column.is-6-desktop { + flex: none; + width: 50%; } + .column.is-offset-6-desktop { + margin-left: 50%; } + .column.is-7-desktop { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-desktop { + margin-left: 58.3333333333%; } + .column.is-8-desktop { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-desktop { + margin-left: 66.6666666667%; } + .column.is-9-desktop { + flex: none; + width: 75%; } + .column.is-offset-9-desktop { + margin-left: 75%; } + .column.is-10-desktop { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-desktop { + margin-left: 83.3333333333%; } + .column.is-11-desktop { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-desktop { + margin-left: 91.6666666667%; } + .column.is-12-desktop { + flex: none; + width: 100%; } + .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + .column.is-narrow-widescreen { + flex: none; } + .column.is-full-widescreen { + flex: none; + width: 100%; } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + .column.is-half-widescreen { + flex: none; + width: 50%; } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + .column.is-offset-half-widescreen { + margin-left: 50%; } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + .column.is-0-widescreen { + flex: none; + width: 0%; } + .column.is-offset-0-widescreen { + margin-left: 0%; } + .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; } + .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; } + .column.is-3-widescreen { + flex: none; + width: 25%; } + .column.is-offset-3-widescreen { + margin-left: 25%; } + .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; } + .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; } + .column.is-6-widescreen { + flex: none; + width: 50%; } + .column.is-offset-6-widescreen { + margin-left: 50%; } + .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; } + .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; } + .column.is-9-widescreen { + flex: none; + width: 75%; } + .column.is-offset-9-widescreen { + margin-left: 75%; } + .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; } + .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; } + .column.is-12-widescreen { + flex: none; + width: 100%; } + .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + .column.is-narrow-fullhd { + flex: none; } + .column.is-full-fullhd { + flex: none; + width: 100%; } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + .column.is-half-fullhd { + flex: none; + width: 50%; } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + .column.is-offset-half-fullhd { + margin-left: 50%; } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + .column.is-0-fullhd { + flex: none; + width: 0%; } + .column.is-offset-0-fullhd { + margin-left: 0%; } + .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; } + .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; } + .column.is-3-fullhd { + flex: none; + width: 25%; } + .column.is-offset-3-fullhd { + margin-left: 25%; } + .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; } + .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; } + .column.is-6-fullhd { + flex: none; + width: 50%; } + .column.is-offset-6-fullhd { + margin-left: 50%; } + .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; } + .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; } + .column.is-9-fullhd { + flex: none; + width: 75%; } + .column.is-offset-9-fullhd { + margin-left: 75%; } + .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; } + .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; } + .column.is-12-fullhd { + flex: none; + width: 100%; } + .column.is-offset-12-fullhd { + margin-left: 100%; } } +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .columns:last-child { + margin-bottom: -0.75rem; } + .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + .columns.is-centered { + justify-content: center; } + .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + .columns.is-gapless:last-child { + margin-bottom: 0; } + .columns.is-mobile { + display: flex; } + .columns.is-multiline { + flex-wrap: wrap; } + .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1056px) { + .columns.is-desktop { + display: flex; } } +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + .columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + .tile.is-child { + margin: 0 !important; } + .tile.is-parent { + padding: 0.75rem; } + .tile.is-vertical { + flex-direction: column; } + .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; } + .tile.is-1 { + flex: none; + width: 8.3333333333%; } + .tile.is-2 { + flex: none; + width: 16.6666666667%; } + .tile.is-3 { + flex: none; + width: 25%; } + .tile.is-4 { + flex: none; + width: 33.3333333333%; } + .tile.is-5 { + flex: none; + width: 41.6666666667%; } + .tile.is-6 { + flex: none; + width: 50%; } + .tile.is-7 { + flex: none; + width: 58.3333333333%; } + .tile.is-8 { + flex: none; + width: 66.6666666667%; } + .tile.is-9 { + flex: none; + width: 75%; } + .tile.is-10 { + flex: none; + width: 83.3333333333%; } + .tile.is-11 { + flex: none; + width: 91.6666666667%; } + .tile.is-12 { + flex: none; + width: 100%; } } +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + .hero .navbar { + background: none; } + .hero .tabs ul { + border-bottom: none; } + .hero.is-white { + background-color: white; + color: #0a0a0a; } + .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-white strong { + color: inherit; } + .hero.is-white .title { + color: #0a0a0a; } + .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + .hero.is-white .subtitle a:not(.button), + .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1055px) { + .hero.is-white .navbar-menu { + background-color: white; } } + .hero.is-white .navbar-item, + .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, + .hero.is-white .navbar-link:hover, + .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + .hero.is-white .tabs a:hover { + opacity: 1; } + .hero.is-white .tabs li.is-active a { + opacity: 1; } + .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + .hero.is-black { + background-color: #0a0a0a; + color: white; } + .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-black strong { + color: inherit; } + .hero.is-black .title { + color: white; } + .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-black .subtitle a:not(.button), + .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1055px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + .hero.is-black .navbar-item, + .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, + .hero.is-black .navbar-link:hover, + .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + .hero.is-black .tabs a:hover { + opacity: 1; } + .hero.is-black .tabs li.is-active a { + opacity: 1; } + .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { + color: white; } + .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + .hero.is-light { + background-color: whitesmoke; + color: #363636; } + .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-light strong { + color: inherit; } + .hero.is-light .title { + color: #363636; } + .hero.is-light .subtitle { + color: rgba(54, 54, 54, 0.9); } + .hero.is-light .subtitle a:not(.button), + .hero.is-light .subtitle strong { + color: #363636; } + @media screen and (max-width: 1055px) { + .hero.is-light .navbar-menu { + background-color: whitesmoke; } } + .hero.is-light .navbar-item, + .hero.is-light .navbar-link { + color: rgba(54, 54, 54, 0.7); } + .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, + .hero.is-light .navbar-link:hover, + .hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .hero.is-light .tabs a { + color: #363636; + opacity: 0.9; } + .hero.is-light .tabs a:hover { + opacity: 1; } + .hero.is-light .tabs li.is-active a { + opacity: 1; } + .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { + color: #363636; } + .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } + .hero.is-dark, .content kbd.hero { + background-color: #363636; + color: whitesmoke; } + .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-dark strong, + .content kbd.hero strong { + color: inherit; } + .hero.is-dark .title, .content kbd.hero .title { + color: whitesmoke; } + .hero.is-dark .subtitle, .content kbd.hero .subtitle { + color: rgba(245, 245, 245, 0.9); } + .hero.is-dark .subtitle a:not(.button), .content kbd.hero .subtitle a:not(.button), + .hero.is-dark .subtitle strong, + .content kbd.hero .subtitle strong { + color: whitesmoke; } + @media screen and (max-width: 1055px) { + .hero.is-dark .navbar-menu, .content kbd.hero .navbar-menu { + background-color: #363636; } } + .hero.is-dark .navbar-item, .content kbd.hero .navbar-item, + .hero.is-dark .navbar-link, + .content kbd.hero .navbar-link { + color: rgba(245, 245, 245, 0.7); } + .hero.is-dark a.navbar-item:hover, .content kbd.hero a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, .content kbd.hero a.navbar-item.is-active, + .hero.is-dark .navbar-link:hover, + .content kbd.hero .navbar-link:hover, + .hero.is-dark .navbar-link.is-active, + .content kbd.hero .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .hero.is-dark .tabs a, .content kbd.hero .tabs a { + color: whitesmoke; + opacity: 0.9; } + .hero.is-dark .tabs a:hover, .content kbd.hero .tabs a:hover { + opacity: 1; } + .hero.is-dark .tabs li.is-active a, .content kbd.hero .tabs li.is-active a { + opacity: 1; } + .hero.is-dark .tabs.is-boxed a, .content kbd.hero .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .content kbd.hero .tabs.is-toggle a { + color: whitesmoke; } + .hero.is-dark .tabs.is-boxed a:hover, .content kbd.hero .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-dark .tabs.is-boxed li.is-active a, .content kbd.hero .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .content kbd.hero .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .hero.is-dark.is-bold, .content kbd.hero.is-bold { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } + @media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu, .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } + .hero.is-primary, .docstring > section > a.hero.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-primary strong, + .docstring > section > a.hero.docs-sourcelink strong { + color: inherit; } + .hero.is-primary .title, .docstring > section > a.hero.docs-sourcelink .title { + color: #fff; } + .hero.is-primary .subtitle, .docstring > section > a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-primary .subtitle a:not(.button), .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), + .hero.is-primary .subtitle strong, + .docstring > section > a.hero.docs-sourcelink .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-primary .navbar-menu, .docstring > section > a.hero.docs-sourcelink .navbar-menu { + background-color: #4eb5de; } } + .hero.is-primary .navbar-item, .docstring > section > a.hero.docs-sourcelink .navbar-item, + .hero.is-primary .navbar-link, + .docstring > section > a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-primary a.navbar-item:hover, .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, + .hero.is-primary .navbar-link:hover, + .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, + .hero.is-primary .navbar-link.is-active, + .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .hero.is-primary .tabs a, .docstring > section > a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-primary .tabs a:hover, .docstring > section > a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; } + .hero.is-primary .tabs li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; } + .hero.is-primary .tabs.is-boxed a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; } + .hero.is-primary .tabs.is-boxed a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-primary .tabs.is-boxed li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #4eb5de; } + .hero.is-primary.is-bold, .docstring > section > a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } + @media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu, .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } } + .hero.is-link { + background-color: #2e63b8; + color: #fff; } + .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-link strong { + color: inherit; } + .hero.is-link .title { + color: #fff; } + .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-link .subtitle a:not(.button), + .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-link .navbar-menu { + background-color: #2e63b8; } } + .hero.is-link .navbar-item, + .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, + .hero.is-link .navbar-link:hover, + .hero.is-link .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-link .tabs a:hover { + opacity: 1; } + .hero.is-link .tabs li.is-active a { + opacity: 1; } + .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { + color: #fff; } + .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #2e63b8; } + .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } + @media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } } + .hero.is-info { + background-color: #209cee; + color: #fff; } + .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-info strong { + color: inherit; } + .hero.is-info .title { + color: #fff; } + .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-info .subtitle a:not(.button), + .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-info .navbar-menu { + background-color: #209cee; } } + .hero.is-info .navbar-item, + .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, + .hero.is-info .navbar-link:hover, + .hero.is-info .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-info .tabs a:hover { + opacity: 1; } + .hero.is-info .tabs li.is-active a { + opacity: 1; } + .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { + color: #fff; } + .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #209cee; } + .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } + @media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } } + .hero.is-success { + background-color: #22c35b; + color: #fff; } + .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-success strong { + color: inherit; } + .hero.is-success .title { + color: #fff; } + .hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-success .subtitle a:not(.button), + .hero.is-success .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-success .navbar-menu { + background-color: #22c35b; } } + .hero.is-success .navbar-item, + .hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, + .hero.is-success .navbar-link:hover, + .hero.is-success .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .hero.is-success .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-success .tabs a:hover { + opacity: 1; } + .hero.is-success .tabs li.is-active a { + opacity: 1; } + .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { + color: #fff; } + .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #22c35b; } + .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } + @media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } } + .hero.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-warning strong { + color: inherit; } + .hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-warning .subtitle a:not(.button), + .hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); } + @media screen and (max-width: 1055px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; } } + .hero.is-warning .navbar-item, + .hero.is-warning .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, + .hero.is-warning .navbar-link:hover, + .hero.is-warning .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-warning .tabs a:hover { + opacity: 1; } + .hero.is-warning .tabs li.is-active a { + opacity: 1; } + .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } + @media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } } + .hero.is-danger { + background-color: #da0b00; + color: #fff; } + .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-danger strong { + color: inherit; } + .hero.is-danger .title { + color: #fff; } + .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-danger .subtitle a:not(.button), + .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-danger .navbar-menu { + background-color: #da0b00; } } + .hero.is-danger .navbar-item, + .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, + .hero.is-danger .navbar-link:hover, + .hero.is-danger .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-danger .tabs a:hover { + opacity: 1; } + .hero.is-danger .tabs li.is-active a { + opacity: 1; } + .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { + color: #fff; } + .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #da0b00; } + .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } + @media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } } + .hero.is-small .hero-body, #documenter .docs-sidebar form.docs-search > input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; } + @media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; } } + @media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; } } + .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + .hero.is-halfheight { + min-height: 50vh; } + .hero.is-fullheight { + min-height: 100vh; } + +.hero-video { + overflow: hidden; } + .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + .hero-video { + display: none; } } +.hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; } + +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + +.section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1056px) { + .section.is-medium { + padding: 9rem 1.5rem; } + .section.is-large { + padding: 18rem 1.5rem; } } +.footer { + background-color: #fafafa; + padding: 3rem 1.5rem 6rem; } + +h1 .docs-heading-anchor, h1 .docs-heading-anchor:hover, h1 .docs-heading-anchor:visited, h2 .docs-heading-anchor, h2 .docs-heading-anchor:hover, h2 .docs-heading-anchor:visited, h3 .docs-heading-anchor, h3 .docs-heading-anchor:hover, h3 .docs-heading-anchor:visited, h4 .docs-heading-anchor, h4 .docs-heading-anchor:hover, h4 .docs-heading-anchor:visited, h5 .docs-heading-anchor, h5 .docs-heading-anchor:hover, h5 .docs-heading-anchor:visited, h6 .docs-heading-anchor, h6 .docs-heading-anchor:hover, h6 .docs-heading-anchor:visited { + color: #222222; } + +h1 .docs-heading-anchor-permalink, h2 .docs-heading-anchor-permalink, h3 .docs-heading-anchor-permalink, h4 .docs-heading-anchor-permalink, h5 .docs-heading-anchor-permalink, h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; } + h1 .docs-heading-anchor-permalink::before, h2 .docs-heading-anchor-permalink::before, h3 .docs-heading-anchor-permalink::before, h4 .docs-heading-anchor-permalink::before, h5 .docs-heading-anchor-permalink::before, h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; } + +h1:hover .docs-heading-anchor-permalink, h2:hover .docs-heading-anchor-permalink, h3:hover .docs-heading-anchor-permalink, h4:hover .docs-heading-anchor-permalink, h5:hover .docs-heading-anchor-permalink, h6:hover .docs-heading-anchor-permalink { + visibility: visible; } + +.docs-dark-only { + display: none !important; } + +pre { + position: relative; + overflow: hidden; } + pre code, pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; } + pre code:first-of-type, pre code.hljs:first-of-type { + padding-top: 0.5rem !important; } + pre code:last-of-type, pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; } + pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #222222; + cursor: pointer; + text-align: center; } + pre .copy-button:focus, pre .copy-button:hover { + opacity: 1; + background: rgba(34, 34, 34, 0.1); + color: #2e63b8; } + pre .copy-button.success { + color: #259a12; + opacity: 1; } + pre .copy-button.error { + color: #cb3c33; + opacity: 1; } + pre:hover .copy-button { + opacity: 1; } + +.admonition { + background-color: #b5b5b5; + border-style: solid; + border-width: 1px; + border-color: #363636; + border-radius: 4px; + font-size: 1rem; } + .admonition strong { + color: currentColor; } + .admonition.is-small, #documenter .docs-sidebar form.docs-search > input.admonition { + font-size: 0.75rem; } + .admonition.is-medium { + font-size: 1.25rem; } + .admonition.is-large { + font-size: 1.5rem; } + .admonition.is-default { + background-color: #b5b5b5; + border-color: #363636; } + .admonition.is-default > .admonition-header { + background-color: #363636; + color: #fff; } + .admonition.is-default > .admonition-body { + color: #fff; } + .admonition.is-info { + background-color: #def0fc; + border-color: #209cee; } + .admonition.is-info > .admonition-header { + background-color: #209cee; + color: #fff; } + .admonition.is-info > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-success { + background-color: #bdf4d1; + border-color: #22c35b; } + .admonition.is-success > .admonition-header { + background-color: #22c35b; + color: #fff; } + .admonition.is-success > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-warning { + background-color: #fff3c5; + border-color: #ffdd57; } + .admonition.is-warning > .admonition-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .admonition.is-warning > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-danger { + background-color: #ffaba7; + border-color: #da0b00; } + .admonition.is-danger > .admonition-header { + background-color: #da0b00; + color: #fff; } + .admonition.is-danger > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-compat { + background-color: #bdeff5; + border-color: #1db5c9; } + .admonition.is-compat > .admonition-header { + background-color: #1db5c9; + color: #fff; } + .admonition.is-compat > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + +.admonition-header { + color: #fff; + background-color: #363636; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; } + .admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; } + +.admonition-body { + color: #222222; + padding: 0.5rem 0.75rem; } + .admonition-body pre { + background-color: whitesmoke; } + .admonition-body code { + background-color: rgba(0, 0, 0, 0.05); } + +.docstring { + margin-bottom: 1em; + background-color: transparent; + border: 1px solid #dbdbdb; + box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); + max-width: 100%; } + .docstring > header { + display: flex; + flex-grow: 1; + align-items: stretch; + padding: 0.5rem 0.75rem; + background-color: whitesmoke; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #dbdbdb; } + .docstring > header code { + background-color: transparent; } + .docstring > header .docstring-binding { + margin-right: 0.3em; } + .docstring > header .docstring-category { + margin-left: 0.3em; } + .docstring > section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #dbdbdb; } + .docstring > section:last-child { + border-bottom: none; } + .docstring > section > a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; } + .docstring > section > a.docs-sourcelink:focus { + opacity: 1 !important; } + .docstring:hover > section > a.docs-sourcelink { + opacity: 0.2; } + .docstring:focus-within > section > a.docs-sourcelink { + opacity: 0.2; } + .docstring > section:hover a.docs-sourcelink { + opacity: 1; } + +.documenter-example-output { + background-color: white; } + +.outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #ffaba7; + color: rgba(0, 0, 0, 0.7); + border-bottom: 3px solid #da0b00; + padding: 10px 35px; + text-align: center; + font-size: 15px; } + .outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; } + .outdated-warning-overlay a { + color: #2e63b8; } + .outdated-warning-overlay a:hover { + color: #363636; } + +.content pre { + border: 1px solid #dbdbdb; } + +.content code { + font-weight: inherit; } + +.content a code { + color: #2e63b8; } + +.content h1 code, .content h2 code, .content h3 code, .content h4 code, .content h5 code, .content h6 code { + color: #222222; } + +.content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; } + +.content blockquote > ul:first-child, .content blockquote > ol:first-child, .content .admonition-body > ul:first-child, .content .admonition-body > ol:first-child { + margin-top: 0; } + +pre, code { + font-variant-ligatures: no-contextual; } + +.breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; } + .breadcrumb a.is-disabled, .breadcrumb a.is-disabled:hover { + color: #222222; } + +.hljs { + background: initial !important; } + +.katex .katex-mathml { + top: 0; + right: 0; } + +.katex-display, mjx-container, .MathJax_Display { + margin: 0.5em 0 !important; } + +html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; } + +li.no-marker { + list-style: none; } + +/* This file contain the overall layout. + * + * The main container is
    that is identified by id #documenter. + */ +#documenter .docs-main > article { + overflow-wrap: break-word; } + #documenter .docs-main > article .math-container { + overflow-x: auto; + overflow-y: hidden; } + +@media screen and (min-width: 1056px) { + #documenter .docs-main { + max-width: 52rem; + margin-left: 20rem; + padding-right: 1rem; } } + +@media screen and (max-width: 1055px) { + #documenter .docs-main { + width: 100%; } + #documenter .docs-main > article { + max-width: 52rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; } + #documenter .docs-main > header, #documenter .docs-main > nav { + max-width: 100%; + width: 100%; + margin: 0; } } + +#documenter .docs-main header.docs-navbar { + background-color: white; + border-bottom: 1px solid #dbdbdb; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; } + #documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; } + #documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; } + #documenter .docs-main header.docs-navbar .docs-right .docs-icon, #documenter .docs-main header.docs-navbar .docs-right .docs-label, #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; } + #documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; } + #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; } + #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; } + #documenter .docs-main header.docs-navbar > * { + margin: auto 0; } + @media screen and (max-width: 1055px) { + #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + /* For Headroom.js */ + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + /* Safari */ + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + /* Safari */ } + #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #bbb; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } + #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } } +#documenter .docs-main section.footnotes { + border-top: 1px solid #dbdbdb; } + #documenter .docs-main section.footnotes li .tag:first-child, #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, #documenter .docs-main section.footnotes li .content kbd:first-child, .content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; } + +#documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #dbdbdb; + padding-top: 1rem; + padding-bottom: 1rem; } + @media screen and (max-width: 1055px) { + #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; } } + #documenter .docs-main .docs-footer .docs-footer-nextpage, #documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; } + #documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; } + #documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; } + #documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; } + +#documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #0a0a0a; + background-color: whitesmoke; + border-right: 1px solid #dbdbdb; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 1rem; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; + /* Setting up a nicer theme style for the scrollbar */ } + #documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #bbb; } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar.visible { + box-shadow: none; } } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar { + left: 0; + top: 0; } } + #documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; } + #documenter .docs-sidebar .docs-logo > img { + max-height: 6rem; + margin: auto; } + #documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; } + #documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; } + #documenter .docs-sidebar .docs-package-name a, #documenter .docs-sidebar .docs-package-name a:hover { + color: #0a0a0a; } + #documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #dbdbdb; + display: none; + padding: 0.5rem; } + #documenter .docs-sidebar .docs-version-selector.visible { + display: flex; } + #documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #dbdbdb; + padding-bottom: 1.5rem; + /* Managing collapsible submenus */ } + #documenter .docs-sidebar ul.docs-menu > li > .tocitem { + font-weight: bold; } + #documenter .docs-sidebar ul.docs-menu > li li { + font-size: 0.95rem; + margin-left: 1em; + border-left: 1px solid #dbdbdb; } + #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; } + #documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; } + #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { + display: block; } + #documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 0.75rem; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; } + #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { + content: "\f078"; } + #documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; } + #documenter .docs-sidebar ul.docs-menu .tocitem, #documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #0a0a0a; + background: whitesmoke; } + #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #0a0a0a; + background-color: #ebebeb; } + #documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #dbdbdb; + border-bottom: 1px solid #dbdbdb; + background-color: white; } + #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: white; + color: #0a0a0a; } + #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #ebebeb; + color: #0a0a0a; } + #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { + border-top: none; } + #documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #dbdbdb; } + #documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 0.85rem; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; } + #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; } + #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; } + #documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + #documenter .docs-sidebar form.docs-search > input { + width: 14.4rem; } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: .3rem; + background: none; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #cccccc; } } + @media screen and (max-width: 1055px) { + #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + #documenter .docs-sidebar::-webkit-scrollbar { + width: .3rem; + background: none; } + #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; } + #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #cccccc; } } +#documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; } + +#documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; } + #documenter .docs-main #documenter-search-results li { + margin-left: 2rem; } + #documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; } + +.ansi span.sgr1 { + font-weight: bolder; } + +.ansi span.sgr2 { + font-weight: lighter; } + +.ansi span.sgr3 { + font-style: italic; } + +.ansi span.sgr4 { + text-decoration: underline; } + +.ansi span.sgr7 { + color: white; + background-color: #222222; } + +.ansi span.sgr8 { + color: transparent; } + .ansi span.sgr8 span { + color: transparent; } + +.ansi span.sgr9 { + text-decoration: line-through; } + +.ansi span.sgr30 { + color: #242424; } + +.ansi span.sgr31 { + color: #a7201f; } + +.ansi span.sgr32 { + color: #066f00; } + +.ansi span.sgr33 { + color: #856b00; } + +.ansi span.sgr34 { + color: #2149b0; } + +.ansi span.sgr35 { + color: #7d4498; } + +.ansi span.sgr36 { + color: #007989; } + +.ansi span.sgr37 { + color: gray; } + +.ansi span.sgr40 { + background-color: #242424; } + +.ansi span.sgr41 { + background-color: #a7201f; } + +.ansi span.sgr42 { + background-color: #066f00; } + +.ansi span.sgr43 { + background-color: #856b00; } + +.ansi span.sgr44 { + background-color: #2149b0; } + +.ansi span.sgr45 { + background-color: #7d4498; } + +.ansi span.sgr46 { + background-color: #007989; } + +.ansi span.sgr47 { + background-color: gray; } + +.ansi span.sgr90 { + color: #616161; } + +.ansi span.sgr91 { + color: #cb3c33; } + +.ansi span.sgr92 { + color: #0e8300; } + +.ansi span.sgr93 { + color: #a98800; } + +.ansi span.sgr94 { + color: #3c5dcd; } + +.ansi span.sgr95 { + color: #9256af; } + +.ansi span.sgr96 { + color: #008fa3; } + +.ansi span.sgr97 { + color: whitesmoke; } + +.ansi span.sgr100 { + background-color: #616161; } + +.ansi span.sgr101 { + background-color: #cb3c33; } + +.ansi span.sgr102 { + background-color: #0e8300; } + +.ansi span.sgr103 { + background-color: #a98800; } + +.ansi span.sgr104 { + background-color: #3c5dcd; } + +.ansi span.sgr105 { + background-color: #9256af; } + +.ansi span.sgr106 { + background-color: #008fa3; } + +.ansi span.sgr107 { + background-color: whitesmoke; } + +code.language-julia-repl > span.hljs-meta { + color: #066f00; + font-weight: bolder; } + +/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/ +/* +This is left on purpose making default.css the single file that can be lifted +as-is from the repository directly without the need for a build step + +Typically this "required" baseline CSS is added by `makestuff.js` during build. +*/ +pre code.hljs { + display: block; + overflow-x: auto; } + +code.hljs { + padding: 3px 5px; } + +/* end baseline CSS */ +.hljs { + background: #F0F0F0; + color: #444; } + +/* Base color: saturation 0; */ +.hljs-subst { + /* default */ } + +/* purposely ignored */ +.hljs-comment { + color: #888888; } + +.hljs-tag, +.hljs-punctuation { + color: #444a; } + +.hljs-tag .hljs-name, +.hljs-tag .hljs-attr { + color: #444; } + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta .hljs-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; } + +/* User color: hue: 0 */ +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; } + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; } + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-operator, +.hljs-selector-pseudo { + color: #BC6060; } + +/* Language color: hue: 90; */ +.hljs-literal { + color: #78A960; } + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; } + +/* Meta color: hue: 200 */ +.hljs-meta { + color: #1f7199; } + +.hljs-meta .hljs-string { + color: #4d99bf; } + +/* Misc effects */ +.hljs-emphasis { + font-style: italic; } + +.hljs-strong { + font-weight: bold; } diff --git a/v0.15.1/assets/themeswap.js b/v0.15.1/assets/themeswap.js new file mode 100644 index 00000000..c58e993e --- /dev/null +++ b/v0.15.1/assets/themeswap.js @@ -0,0 +1,66 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Intialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if(window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the browser supports user color preference + var darkPreference = false; + // Check if the users preference is for dark color scheme + if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) { + darkPreference = true; + } + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; var disabled = []; var darkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if(themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null); + // Check if the theme is primary dark theme + var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null); + // If ss is for dark theme then set the value of darkTheme to the name of the theme + if(isDarkTheme) darkTheme = themename; + // If we find a matching theme (and it's not the default), we'll set active to non-null + if(themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if(themename !== theme) disabled.push(ss); + } + if(active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + theme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + else if(darkTheme !== null && darkPreference === true) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + darkTheme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) { + ss.disabled = true; + } + }); + } +} +set_theme_from_local_storage(); diff --git a/v0.15.1/assets/warner.js b/v0.15.1/assets/warner.js new file mode 100644 index 00000000..5531c885 --- /dev/null +++ b/v0.15.1/assets/warner.js @@ -0,0 +1,49 @@ +function maybeAddWarning () { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return + }; + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return + }; + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return + }; + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement('meta'); + meta.name = 'robots'; + meta.content = 'noindex'; + + document.getElementsByTagName('head')[0].appendChild(meta); + }; + + const div = document.createElement('div'); + div.classList.add('outdated-warning-overlay'); + const closer = document.createElement('button'); + closer.classList.add('outdated-warning-closer', 'delete'); + closer.addEventListener('click', function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE; + div.innerHTML = 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +}; + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', maybeAddWarning); +} else { + maybeAddWarning(); +}; diff --git a/v0.15.1/contributing/index.html b/v0.15.1/contributing/index.html new file mode 100644 index 00000000..ff0fc262 --- /dev/null +++ b/v0.15.1/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

    Contributors' Guide

    This is a short guide for potential GeophysicalFlows.jl contributors.

    Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

    We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

    What can I do?

    • Tackle an existing issue.

    • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

    • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

    • Improve documentation, docstrings, or comments if you found something is hard to use.

    • Implement a new feature (e.g., a new diagnostic into a module).

    • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

    If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

    Ground Rules

    • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
    • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
    • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
    • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

    Reporting a bug

    The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

    • Head over to the issues page.
    • Search to see if your issue already exists or has even been solved previously.
    • If you indeed have a new issue or request, click the "New Issue" button.
    • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

    Setting up your development environment

    • Install Julia on your system.
    • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
    • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
    • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
      git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
    • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
    • Connect your repository to the upstream (main project).
      git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
    • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
    • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

    Your development environment is now ready!

    Pull Requests

    Changes and contributions should be made via GitHub pull requests against the main branch.

    When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

    When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

    Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

    Documentation

    All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

    We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

    You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

    julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    +julia --project=docs/ docs/make.jl

    and then open docs/build/index.html in your favorite browser.

    Credits

    This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

    diff --git a/v0.15.1/gpu/index.html b/v0.15.1/gpu/index.html new file mode 100644 index 00000000..9de37eb9 --- /dev/null +++ b/v0.15.1/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

    GPU

    GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

    All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

    julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
    +Problem
    +  ├─────────── grid: grid (on GPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper

    Selecting GPU device

    FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

    diff --git a/v0.15.1/index.html b/v0.15.1/index.html new file mode 100644 index 00000000..64ca6ca0 --- /dev/null +++ b/v0.15.1/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

    GeophysicalFlows.jl Documentation

    Overview

    GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

    Examples

    Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

    Fourier transforms normalization

    Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

    \[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

    The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

    \[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

    where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

    Read more in the FourierFlows.jl Documentation; see Grids section.

    Unicode

    Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

    Read more about Unicode symbols in the Julia Documentation.

    Developers

    The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

    Citing

    If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

    Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

    The bibtex entry for the paper is:

    @article{GeophysicalFlowsJOSS,
    +  doi = {10.21105/joss.03053},
    +  url = {https://doi.org/10.21105/joss.03053},
    +  year = {2021},
    +  publisher = {The Open Journal},
    +  volume = {6},
    +  number = {60},
    +  pages = {3053},
    +  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
    +  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
    +  journal = {Journal of Open Source Software}
    +}

    Papers using GeophysicalFlows.jl

    1. Bisits, J. I., Stanley G. J., and Zika, J. D. (2022). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, Early Online Release. doi:10.1175/JPO-D-22-0145.1.
    1. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.

    2. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.

    3. Drivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.

    4. Palóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

    5. Karrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

    diff --git a/v0.15.1/installation_instructions/index.html b/v0.15.1/installation_instructions/index.html new file mode 100644 index 00000000..3d7713fc --- /dev/null +++ b/v0.15.1/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

    Installation instructions

    You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

    julia>]
    +(v1.6) pkg> add GeophysicalFlows
    +(v1.6) pkg> instantiate

    We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

    (v1.6) pkg> update GeophysicalFlows

    Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

    Use Julia 1.6 or newer

    The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

    Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

    Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1

    diff --git a/v0.15.1/lib/functions/index.html b/v0.15.1/lib/functions/index.html new file mode 100644 index 00000000..d61689da --- /dev/null +++ b/v0.15.1/lib/functions/index.html @@ -0,0 +1,89 @@ + +Functions · GeophysicalFlows.jl

    Functions

    GeophysicalFlows

    Exported functions

    GeophysicalFlows.lambdipoleFunction
    lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

    Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

    source
    GeophysicalFlows.peakedisotropicspectrumFunction
    peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

    Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

    source

    TwoDNavierStokes

    Exported functions

    GeophysicalFlows.TwoDNavierStokes.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                  μ = 0,
    +                 nμ = 0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a two-dimensional Navier-Stokes problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Large-scale (hypo)-viscosity coefficient.
    • : (Hypo)-viscosity order, $≤ 0$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.TwoDNavierStokes.energy_workFunction
    energy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

    \[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

    where $ψ$ is the stream flow.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
    enstrophy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

    \[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

    where $ζ$ is the relative vorticity.

    source

    Private functions

    GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

    source
    GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
    energy_dissipation(prob, ξ, νξ)

    Return the domain-averaged energy dissipation rate done by the viscous term,

    \[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
    enstrophy_dissipation(prob, ξ, νξ)

    Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

    \[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source

    SingleLayerQG

    Exported functions

    GeophysicalFlows.SingleLayerQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    + deformation_radius = Inf,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a single-layer quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    GeophysicalFlows.SingleLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

    source

    MultiLayerQG

    Exported functions

    GeophysicalFlows.MultiLayerQG.ProblemFunction
    Problem(nlayers :: Int,
    +                    dev = CPU();
    +                     nx = 128,
    +                     ny = nx,
    +                     Lx = 2π,
    +                     Ly = Lx,
    +                     f₀ = 1.0,
    +                      β = 0.0,
    +                      g = 1.0,
    +                      U = zeros(nlayers),
    +                      H = 1/nlayers * ones(nlayers),
    +                      ρ = Array{Float64}(1:nlayers),
    +                    eta = nothing,
    +topographic_pv_gradient = (0, 0),
    +                      μ = 0,
    +                      ν = 0,
    +                     nν = 1,
    +                     dt = 0.01,
    +                stepper = "RK4",
    +                 calcFq = nothingfunction,
    +             stochastic = false,
    +                 linear = false,
    +       aliased_fraction = 1/3,
    +                      T = Float64)

    Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

    Arguments

    • nlayers: (required) Number of fluid layers.
    • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • f₀: Constant planetary vorticity.
    • β: Planetary vorticity $y$-gradient.
    • g: Gravitational acceleration constant.
    • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
    • H: Rest height of each fluid layer.
    • ρ: Density of each fluid layer.
    • eta: Periodic component of the topographic potential vorticity.
    • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
    • μ: Linear bottom drag coefficient.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
    • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64 (default); floating point type used for problem data.
    source
    GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
    streamfunctionfrompv!(ψh, qh, params, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

    source
    streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

    source
    streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    \[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source
    GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
    pvfromstreamfunction!(qh, ψh, params, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

    source
    pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

    source
    pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) * (ψ̂₂ - ψ̂₁) ,\]

    \[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) * (ψ̂₁ - ψ̂₂) .\]

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source

    Private functions

    GeophysicalFlows.MultiLayerQG.LinearEquationFunction
    LinearEquation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcNlinear!.

    source
    GeophysicalFlows.MultiLayerQG.calcS!Function
    calcS!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
    calcS⁻¹!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcNlinear!Function
    calcNlinear!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term of the linearized equations:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, vars, params, grid)

    Compute the advection term and stores it in N:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
    calcN_linearadvection!(N, sol, vars, params, grid)

    Compute the advection term of the linearized equations and stores it in N:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source

    SurfaceQG

    Exported functions

    GeophysicalFlows.SurfaceQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 Lx = 2π,
    +                 ny = nx,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a surface quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
    buoyancy_dissipation(prob)

    Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

    \[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

    where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

    source
    GeophysicalFlows.SurfaceQG.buoyancy_workFunction
    buoyancy_work(prob)
    +buoyancy_work(sol, vars, grid)

    Return the domain-averaged rate of work of buoyancy variance by the forcing,

    \[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

    source

    Private functions

    GeophysicalFlows.SurfaceQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

    source

    BarotropicQGQL

    Exported functions

    GeophysicalFlows.BarotropicQGQL.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    diff --git a/v0.15.1/lib/types/index.html b/v0.15.1/lib/types/index.html new file mode 100644 index 00000000..38f2f828 --- /dev/null +++ b/v0.15.1/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

    Private types

    TwoDNavierStokes

    GeophysicalFlows.TwoDNavierStokes.ParamsType
    struct Params{T} <: AbstractParams

    The parameters for a two-dimensional Navier-Stokes problem:

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • μ::Any: large-scale (hypo)-viscosity coefficient

    • nμ::Int64: (hypo)-viscosity order, $≤ 0$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.TwoDNavierStokes.VarsType
    struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

    The variables for two-dimensional Navier-Stokes problem:

    • ζ: relative vorticity

    • u: x-component of velocity

    • v: y-component of velocity

    • ζh: Fourier transform of relative vorticity

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SingleLayerQG

    GeophysicalFlows.SingleLayerQG.ParamsType
    struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

    The parameters for the SingleLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • deformation_radius::Any: Rossby radius of deformation

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SingleLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

    The variables for SingleLayer QG:

    • q: relative vorticity (+ vortex stretching)

    • ψ: streamfunction

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • qh: Fourier transform of relative vorticity (+ vortex stretching)

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    MultiLayerQG

    GeophysicalFlows.MultiLayerQG.ParamsType
    struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams

    The parameters for the MultiLayerQG problem.

    • nlayers::Int64: number of fluid layers

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Any: array with density of each fluid layer

    • H::Any: array with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: array with the reduced gravity constants for each fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • S::Any: array containing coeffients for getting PV from streamfunction

    • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
    struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a single-layer MultiLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • U::Any: array with imposed constant zonal flow $U(y)$

    • eta::Any: array containing the periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
    struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a two-layer MultiLayerQG problem.

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Any: array with density of each fluid layer

    • H::Tuple: tuple with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: the reduced gravity constants for the fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: AbstractVars

    The variables for multi-layer QG problem.

    • q: relative vorticity + vortex stretching

    • ψ: streamfunction

    • u: x-component of velocity

    • v: y-component of velocity

    • qh: Fourier transform of relative vorticity + vortex stretching

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fqh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SurfaceQG

    GeophysicalFlows.SurfaceQG.ParamsType
    Params{T}(ν, nν, calcF!)

    A struct containing the parameters for Surface QG dynamics. Included are:

    • ν::Any: buoyancy (hyper)-viscosity coefficient

    • nν::Int64: buoyancy (hyper)-viscosity order

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SurfaceQG.VarsType
    Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

    The variables for surface QG problem:

    • b: buoyancy

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • bh: Fourier transform of buoyancy

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    BarotropicQGQL

    GeophysicalFlows.BarotropicQGQL.ParamsType
    Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

    A struct containing the parameters for a barotropic QL QG problem. Included are:

    • β::Any: planetary vorticity $y$-gradient

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.BarotropicQGQL.VarsType
    Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

    The variables for barotropic QL QG:

    • u: $x$-component of small-scale velocity

    • v: $y$-component of small-scale velocity

    • U: $x$-component of large-scale velocity

    • uzeta: small-scale $u′ζ′$

    • vzeta: small-scale $v′ζ′$

    • zeta: small-scale relative vorticity

    • Zeta: large-scale relative vorticity

    • psi: small-scale streamfunction

    • Psi: large-scale streamfunction

    • Nz: small-scale nonlinear term

    • NZ: large-scale nonlinear term

    • uh: Fourier transform of $x$-component of small-scale velocity

    • vh: Fourier transform of $y$-component of small-scale velocity

    • Uh: Fourier transform of $x$-component of large-scale velocity

    • zetah: Fourier transform of small-scale relative vorticity

    • Zetah: Fourier transform of large-scale relative vorticity

    • psih: Fourier transform of small-scale relative vorticity

    • Psih: Fourier transform of large-scale relative vorticity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source
    diff --git a/dev/literated/barotropicqgql_betaforced.jl b/v0.15.1/literated/barotropicqgql_betaforced.jl similarity index 100% rename from dev/literated/barotropicqgql_betaforced.jl rename to v0.15.1/literated/barotropicqgql_betaforced.jl diff --git a/v0.15.1/literated/barotropicqgql_betaforced.mp4 b/v0.15.1/literated/barotropicqgql_betaforced.mp4 new file mode 100644 index 00000000..fe9cb984 Binary files /dev/null and b/v0.15.1/literated/barotropicqgql_betaforced.mp4 differ diff --git a/v0.15.1/literated/barotropicqgql_betaforced/index.html b/v0.15.1/literated/barotropicqgql_betaforced/index.html new file mode 100644 index 00000000..ffc089c8 --- /dev/null +++ b/v0.15.1/literated/barotropicqgql_betaforced/index.html @@ -0,0 +1,169 @@ + +Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +using Statistics: mean
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record
    record (generic function with 2 methods)

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n^2
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                              calcF=calcF!, stochastic=true, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x, grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics – energy and enstrophy are functions imported at the top.

    E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
    +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

    We can also define our custom diagnostics via functions.

    zetaMean(prob) = prob.sol[1, :]
    +
    +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

    We combile all diags in a list.

    diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaQLturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "forcedbetaQLturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  grid, vars = prob.grid, prob.vars
    +
    +  @. vars.uh = im * grid.l  * grid.invKrsq * sol
    +  ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))
    +
    +  return  vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    Output
    +  ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
    +  ├──── path: ./forcedbetaQLturb.jld2
    +  └── fields: Dict{Symbol, Function}(:sol => Main.get_sol, :u => Main.get_u)

    Visualizing the simulation

    We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

    title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axζ̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean ζ",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.05)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 5)))
    +
    +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta
    +ζ = Observable(Array(@. ζ̄ + ζ′))
    +ψ̄, ψ′= prob.vars.Psi,  prob.vars.psi
    +ψ = Observable(Array(@. ψ̄ + ψ′))
    +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))
    +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))
    +
    +μt = Observable(μ * E.t[1:1])
    +energy = Observable(E.data[1:1])
    +enstrophy = Observable(Z.data[1:1])
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +heatmap!(axψ, x, y, ψ;
    +         colormap = :viridis, colorrange = (-0.22, 0.22))
    +
    +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)
    +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, μt, energy; linewidth = 3)
    +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],
    +      (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = @. ζ̄ + ζ′
    +  ψ[] = @. ψ̄ + ψ′
    +  ζ̄ₘ[] = vec(mean(ζ̄, dims=1))
    +  ūₘ[] = vec(mean(prob.vars.U, dims=1))
    +
    +  μt.val = μ * E.t[1:E.i]
    +  energy[] = E.data[1:E.i]
    +  enstrophy[] = Z.data[1:E.i]
    +
    +  title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  BarotropicQGQL.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.73, E: 0.0306, Q: 4.1841, walltime: 0.13 min
    +step: 2000, t: 100, cfl: 0.81, E: 0.0400, Q: 3.8932, walltime: 0.25 min
    +step: 3000, t: 150, cfl: 0.83, E: 0.0451, Q: 4.1653, walltime: 0.38 min
    +step: 4000, t: 200, cfl: 0.84, E: 0.0467, Q: 4.3571, walltime: 0.52 min
    +step: 5000, t: 250, cfl: 0.82, E: 0.0473, Q: 4.0309, walltime: 0.67 min
    +step: 6000, t: 300, cfl: 1.07, E: 0.0473, Q: 3.4528, walltime: 0.81 min
    +step: 7000, t: 350, cfl: 0.90, E: 0.0461, Q: 3.4042, walltime: 0.97 min
    +step: 8000, t: 400, cfl: 0.86, E: 0.0476, Q: 3.6934, walltime: 1.14 min

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/dev/literated/decayingTwoDNavierStokes.jld2 b/v0.15.1/literated/decayingTwoDNavierStokes.jld2 similarity index 100% rename from dev/literated/decayingTwoDNavierStokes.jld2 rename to v0.15.1/literated/decayingTwoDNavierStokes.jld2 diff --git a/dev/literated/multilayerqg_2layer.jl b/v0.15.1/literated/multilayerqg_2layer.jl similarity index 100% rename from dev/literated/multilayerqg_2layer.jl rename to v0.15.1/literated/multilayerqg_2layer.jl diff --git a/v0.15.1/literated/multilayerqg_2layer.mp4 b/v0.15.1/literated/multilayerqg_2layer.mp4 new file mode 100644 index 00000000..5fa7b225 Binary files /dev/null and b/v0.15.1/literated/multilayerqg_2layer.mp4 differ diff --git a/v0.15.1/literated/multilayerqg_2layer/index.html b/v0.15.1/literated/multilayerqg_2layer/index.html new file mode 100644 index 00000000..36e091ee --- /dev/null +++ b/v0.15.1/literated/multilayerqg_2layer/index.html @@ -0,0 +1,181 @@ + +Phillips model of Baroclinic Instability · GeophysicalFlows.jl

    Phillips model of Baroclinic Instability

    This example can be viewed as a Jupyter notebook via .

    A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf
    +
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

    n = 128                  # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 2.5e-3         # timestep
    + nsteps = 20000          # total number of time-steps
    + nsubs  = 50             # number of time-steps for plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π                   # domain size
    +μ = 5e-2                 # bottom drag
    +β = 5                    # the y-gradient of planetary PV
    +
    +nlayers = 2              # number of layers
    +f₀, g = 1, 1             # Coriolis parameter and gravitational constant
    +H = [0.2, 0.8]           # the rest depths of each layer
    +ρ = [4.0, 5.0]           # the density of each layer
    +
    +U = zeros(nlayers)       # the imposed mean zonal flow in each layer
    +U[1] = 1.0
    +U[2] = 0.0

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,
    +                            dt, stepper, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

    device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    seed!(1234) # reset of the random number generator for reproducibility
    +q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
    +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft  only in dims=1, 2
    +q₀  = irfft(q₀h, grid.nx, (1, 2))                 # apply irfft only in dims=1, 2
    +
    +MultiLayerQG.set_q!(prob, q₀)

    Diagnostics

    Create Diagnostics – energies function is imported at the top.

    E = Diagnostic(MultiLayerQG.energies, prob; nsteps)
    +diags = [E] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_2layer"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "2layer.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid
    +
    +  @. vars.qh = sol
    +  streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +  @. vars.uh = -im * grid.l * vars.ψh
    +  invtransform!(vars.u, vars.uh, params)
    +
    +  return vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t))
    +
    +q₁ = Observable(Array(vars.q[:, :, 1]))
    +ψ₁ = Observable(Array(vars.ψ[:, :, 1]))
    +q₂ = Observable(Array(vars.q[:, :, 2]))
    +ψ₂ = Observable(Array(vars.ψ[:, :, 2]))
    +
    +function compute_levels(maxf, nlevels=8)
    +  # -max(|f|):...:max(|f|)
    +  levelsf  = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))
    +
    +  # only positive
    +  levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))
    +
    +  # only negative
    +  levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))
    +
    +  return levelsf, levelsf⁺, levelsf⁻
    +end
    +
    +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))
    +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))
    +
    +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)
    +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)
    +
    +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])
    +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])
    +PE  = Observable(Point2f[(μ * E.t[1], E.data[1][2])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...)
    +
    +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...)
    +
    +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...)
    +
    +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...)
    +
    +axKE = Axis(fig[1, 3],
    +            xlabel = "μ t",
    +            ylabel = "KE",
    +            title = title_KE,
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +axPE = Axis(fig[2, 3],
    +            xlabel = "μ t",
    +            ylabel = "PE",
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +heatmap!(axq₁, x, y, q₁; colormap = :balance)
    +
    +heatmap!(axq₂, x, y, q₂; colormap = :balance)
    +
    +contourf!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁺, color=:black)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁻, color=:black, linestyle = :dash)
    +
    +contourf!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁺, color=:black)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁻, color=:black, linestyle = :dash)
    +
    +ke₁ = lines!(axKE, KE₁; linewidth = 3)
    +ke₂ = lines!(axKE, KE₂; linewidth = 3)
    +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"])
    +
    +lines!(axPE, PE; linewidth = 3)
    +
    +fig

    Time-stepping the Problem forward

    Finally, we time-step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min",
    +                   clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q₁[] = vars.q[:, :, 1]
    +  ψ₁[] = vars.ψ[:, :, 1]
    +  q₂[] = vars.q[:, :, 2]
    +  ψ₂[] = vars.ψ[:, :, 2]
    +
    +  maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])
    +  maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])
    +
    +  KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))
    +  KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))
    +  PE[]  = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))
    +
    +  title_KE[] = @sprintf("μ t = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  MultiLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.155e-08, KE₂: 5.483e-08, PE: 2.958e-09, walltime: 0.00 min
    +step: 1000, t: 2.5, cfl: 0.00, KE₁: 5.244e-08, KE₂: 5.825e-08, PE: 5.358e-08, walltime: 0.20 min
    +step: 2000, t: 5.0, cfl: 0.00, KE₁: 2.217e-07, KE₂: 1.199e-07, PE: 2.265e-07, walltime: 0.41 min
    +step: 3000, t: 7.5, cfl: 0.00, KE₁: 1.086e-06, KE₂: 4.801e-07, PE: 1.064e-06, walltime: 0.61 min
    +step: 4000, t: 10.0, cfl: 0.00, KE₁: 5.889e-06, KE₂: 2.540e-06, PE: 5.620e-06, walltime: 0.82 min
    +step: 5000, t: 12.5, cfl: 0.00, KE₁: 3.371e-05, KE₂: 1.462e-05, PE: 3.161e-05, walltime: 1.04 min
    +step: 6000, t: 15.0, cfl: 0.01, KE₁: 1.982e-04, KE₂: 8.661e-05, PE: 1.830e-04, walltime: 1.27 min
    +step: 7000, t: 17.5, cfl: 0.01, KE₁: 1.183e-03, KE₂: 5.208e-04, PE: 1.079e-03, walltime: 1.51 min
    +step: 8000, t: 20.0, cfl: 0.03, KE₁: 7.085e-03, KE₂: 3.135e-03, PE: 6.403e-03, walltime: 1.75 min
    +step: 9000, t: 22.5, cfl: 0.07, KE₁: 4.052e-02, KE₂: 1.793e-02, PE: 3.677e-02, walltime: 1.98 min
    +step: 10000, t: 25.0, cfl: 0.14, KE₁: 1.811e-01, KE₂: 8.137e-02, PE: 1.657e-01, walltime: 2.20 min
    +step: 11000, t: 27.5, cfl: 0.25, KE₁: 4.429e-01, KE₂: 2.442e-01, PE: 4.258e-01, walltime: 2.41 min
    +
    +step: 12000, t: 30.0, cfl: 0.32, KE₁: 4.698e-01, KE₂: 3.582e-01, PE: 4.651e-01, walltime: 2.61 min
    +step: 13000, t: 32.5, cfl: 0.26, KE₁: 5.896e-01, KE₂: 4.633e-01, PE: 6.751e-01, walltime: 2.80 min
    +step: 14000, t: 35.0, cfl: 0.34, KE₁: 6.182e-01, KE₂: 5.679e-01, PE: 7.170e-01, walltime: 3.00 min
    +step: 15000, t: 37.5, cfl: 0.30, KE₁: 5.797e-01, KE₂: 6.093e-01, PE: 6.326e-01, walltime: 3.18 min
    +step: 16000, t: 40.0, cfl: 0.46, KE₁: 6.247e-01, KE₂: 7.122e-01, PE: 6.174e-01, walltime: 3.36 min
    +step: 17000, t: 42.5, cfl: 0.29, KE₁: 6.080e-01, KE₂: 7.531e-01, PE: 5.883e-01, walltime: 3.54 min
    +step: 18000, t: 45.0, cfl: 0.26, KE₁: 5.854e-01, KE₂: 7.434e-01, PE: 5.653e-01, walltime: 3.72 min
    +step: 19000, t: 47.5, cfl: 0.29, KE₁: 5.787e-01, KE₂: 8.048e-01, PE: 5.229e-01, walltime: 3.90 min
    +step: 20000, t: 50.0, cfl: 0.25, KE₁: 5.467e-01, KE₂: 7.608e-01, PE: 5.300e-01, walltime: 4.08 min

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.1/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/v0.15.1/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 new file mode 100644 index 00000000..72c0fda9 Binary files /dev/null and b/v0.15.1/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/dev/literated/singlelayerqg_betadecay.jl b/v0.15.1/literated/singlelayerqg_betadecay.jl similarity index 100% rename from dev/literated/singlelayerqg_betadecay.jl rename to v0.15.1/literated/singlelayerqg_betadecay.jl diff --git a/v0.15.1/literated/singlelayerqg_betadecay.mp4 b/v0.15.1/literated/singlelayerqg_betadecay.mp4 new file mode 100644 index 00000000..34dae31e Binary files /dev/null and b/v0.15.1/literated/singlelayerqg_betadecay.mp4 differ diff --git a/v0.15.1/literated/singlelayerqg_betadecay/index.html b/v0.15.1/literated/singlelayerqg_betadecay/index.html new file mode 100644 index 00000000..19bd8f2e --- /dev/null +++ b/v0.15.1/literated/singlelayerqg_betadecay/index.html @@ -0,0 +1,130 @@ + +Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Decaying barotropic QG beta-plane turbulence

    This example can be viewed as a Jupyter notebook via .

    An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.04           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 20             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.0       # bottom drag

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.08 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                          # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. q₀h = ifelse(K < 6  * 2π/L, 0, q₀h)
    +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)
    +@. q₀h[1, :] = 0    # remove any power from zonal wavenumber k=0
    +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀
    +q₀ = irfft(q₀h, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, q₀)

    Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (800, 360))
    +
    +axq = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial vorticity ∂v/∂x-∂u/∂y",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +axψ = Axis(fig[1, 2];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial streamfunction ψ",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +heatmap!(axq, x, y, Array(vars.q); colormap = :balance)
    +
    +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We plot the vorticity and streamfunction and their corresponding zonal mean structure.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(800, 720))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +q  = Observable(Array(vars.q))
    +ψ  = Observable(Array(vars.ψ))
    +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))
    +ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-12, 12))
    +
    +levels = collect(range(-0.7, stop=0.7, length=20))
    +
    +contourf!(axψ, x, y, ψ;
    +         levels, colormap = :viridis, colorrange = (-0.35, 0.35))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₘ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 8) do j
    +  if j % round(Int, nsteps/nsubs / 4) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +  q̄ₘ[] = vec(mean(vars.q, dims=1))
    +  ūₘ[] = vec(mean(vars.u, dims=1))
    +
    +  title_q[] = @sprintf("vorticity, t = %.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.86, E: 0.0800, Q: 5.0860, walltime: 0.00 min
    +step: 0500, t: 20, cfl: 0.87, E: 0.0786, Q: 1.8862, walltime: 0.11 min
    +step: 1000, t: 40, cfl: 0.71, E: 0.0784, Q: 1.2623, walltime: 0.21 min
    +step: 1500, t: 60, cfl: 0.87, E: 0.0783, Q: 1.1067, walltime: 0.32 min
    +step: 2000, t: 80, cfl: 0.85, E: 0.0783, Q: 1.0400, walltime: 0.42 min

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/dev/literated/singlelayerqg_betaforced.jl b/v0.15.1/literated/singlelayerqg_betaforced.jl similarity index 100% rename from dev/literated/singlelayerqg_betaforced.jl rename to v0.15.1/literated/singlelayerqg_betaforced.jl diff --git a/v0.15.1/literated/singlelayerqg_betaforced.mp4 b/v0.15.1/literated/singlelayerqg_betaforced.mp4 new file mode 100644 index 00000000..3e387bb8 Binary files /dev/null and b/v0.15.1/literated/singlelayerqg_betaforced.mp4 differ diff --git a/v0.15.1/literated/singlelayerqg_betaforced/index.html b/v0.15.1/literated/singlelayerqg_betaforced/index.html new file mode 100644 index 00000000..295217f3 --- /dev/null +++ b/v0.15.1/literated/singlelayerqg_betaforced/index.html @@ -0,0 +1,196 @@ + +Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Forced-dissipative barotropic QG beta-plane turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
    +
    +using Statistics: mean
    +using LinearAlgebra: ldiv!
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record
    record (generic function with 2 methods)

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of timesteps
    + save_substeps = 10      # number of timesteps after which output is saved

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                             calcF=calcF!, stochastic=true)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostic – energy and enstrophy are functions imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  vars, grid, sol = prob.vars, prob.grid, prob.sol
    +
    +  @. vars.qh = sol
    +
    +  SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +
    +  ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)
    +
    +  return Array(vars.u)
    +end
    +
    +output = Output(prob, filename, (:qh, get_sol), (:u, get_u))

    We first save the problem's grid and other parameters so we can use them later.

    saveproblem(output)

    and then call saveoutput(output) once to save the initial state.

    saveoutput(output)

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +while clock.step <= nsteps
    +  if clock.step % 50save_substeps == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +    clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  stepforward!(prob, diags, save_substeps)
    +  SingleLayerQG.updatevars!(prob)
    +
    +  if clock.step % save_substeps == 0
    +    saveoutput(output)
    +  end
    +end
    +
    +savediagnostic(E, "energy", output.path)
    +savediagnostic(Z, "enstrophy", output.path)
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 0500, t: 25, cfl: 0.55, E: 0.0188, Q: 2.6813, walltime: 0.03 min
    +step: 1000, t: 50, cfl: 0.62, E: 0.0301, Q: 2.6856, walltime: 0.06 min
    +step: 1500, t: 75, cfl: 0.74, E: 0.0360, Q: 2.5495, walltime: 0.09 min
    +step: 2000, t: 100, cfl: 0.62, E: 0.0390, Q: 2.4782, walltime: 0.12 min
    +step: 2500, t: 125, cfl: 0.70, E: 0.0421, Q: 2.6692, walltime: 0.15 min
    +step: 3000, t: 150, cfl: 0.81, E: 0.0442, Q: 2.6919, walltime: 0.19 min
    +step: 3500, t: 175, cfl: 0.77, E: 0.0456, Q: 2.6213, walltime: 0.22 min
    +step: 4000, t: 200, cfl: 0.76, E: 0.0458, Q: 2.6167, walltime: 0.25 min
    +step: 4500, t: 225, cfl: 0.74, E: 0.0459, Q: 2.6116, walltime: 0.28 min
    +step: 5000, t: 250, cfl: 0.80, E: 0.0464, Q: 2.6694, walltime: 0.31 min
    +step: 5500, t: 275, cfl: 0.80, E: 0.0473, Q: 2.6463, walltime: 0.34 min
    +step: 6000, t: 300, cfl: 0.83, E: 0.0471, Q: 2.5833, walltime: 0.37 min
    +step: 6500, t: 325, cfl: 0.81, E: 0.0464, Q: 2.4590, walltime: 0.40 min
    +step: 7000, t: 350, cfl: 0.85, E: 0.0468, Q: 2.5589, walltime: 0.43 min
    +step: 7500, t: 375, cfl: 0.84, E: 0.0465, Q: 2.4946, walltime: 0.46 min
    +step: 8000, t: 400, cfl: 0.76, E: 0.0466, Q: 2.5481, walltime: 0.49 min

    Load saved output and visualize

    We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

    file = jldopen(output.path)
    +
    +iterations = parse.(Int, keys(file["snapshots/t"]))
    +t = [file["snapshots/t/$i"] for i ∈ iterations]
    +
    +qh = [file["snapshots/qh/$i"] for i ∈ iterations]
    +u  = [file["snapshots/u/$i"] for i ∈ iterations]
    +
    +E_t  = file["diagnostics/energy/t"]
    +Z_t  = file["diagnostics/enstrophy/t"]
    +E_data = file["diagnostics/energy/data"]
    +Z_data = file["diagnostics/enstrophy/data"]
    +
    +x,  y  = file["grid/x"],  file["grid/y"]
    +nx, ny = file["grid/nx"], file["grid/ny"]
    +Lx, Ly = file["grid/Lx"], file["grid/Ly"]
    +
    +close(file)

    We create a figure using Makie's Observables

    j = Observable(1)
    +
    +q = @lift irfft(qh[$j], nx)
    +ψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)
    +q̄ = @lift real(ifft(qh[$j][1, :] / ny))
    +ū = @lift vec(mean(u[$j], dims=1))
    +
    +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$j])
    +
    +energy = Observable([Point2f(E_t[1], E_data[1])])
    +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.055)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 3.1)))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +levels = collect(-0.32:0.04:0.32)
    +
    +contourf!(axψ, x, y, ψ;
    +          levels, colormap = :viridis, colorrange = (-0.22, 0.22))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ū, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, energy; linewidth = 3)
    +lines!(axZ, enstrophy; linewidth = 3, color = :red)
    +
    +fig

    We are now ready to animate all saved output.

    frames = 1:length(t)
    +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 18) do i
    +  j[] = i
    +
    +  energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
    +end


    This page was generated using Literate.jl.

    diff --git a/dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl b/v0.15.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl similarity index 100% rename from dev/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl rename to v0.15.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl diff --git a/v0.15.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/v0.15.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html new file mode 100644 index 00000000..960d4e51 --- /dev/null +++ b/v0.15.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -0,0 +1,92 @@ + +SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

    SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

    This example can be viewed as a Jupyter notebook via .

    We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using GeophysicalFlows: peakedisotropicspectrum
    +using LinearAlgebra: ldiv!
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length
    +deformation_radius = 0.35   # the deformation radius
    +
    +# Then we pick the time-stepper parameters
    +    dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.

    For both problems we use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    stepper="FilteredRK4"
    +
    +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)
    +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)

    Setting initial conditions

    For initial condition we construct a relative vorticity with energy most energy around total wavenumber $k_0$.

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)

    SingleLayerQG allows us to set up the initial $q$ for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.

    ∇²ψ₀h = rfft(∇²ψ₀)
    +ψ₀h = @. 0 * ∇²ψ₀h
    +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)

    and then use the streamfunction to compute the corresponding $q_0$ for each problem,

    q₀_bqg   = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)
    +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)

    Now we can initialize our problems with the same flow.

    SingleLayerQG.set_q!(prob_bqg, q₀_bqg)
    +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)

    Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    function relativevorticity(prob)
    +  vars, grid = prob.vars, prob.grid
    +
    +  ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)
    +
    +  return vars.q
    +end
    +
    +x,  y  = prob_bqg.grid.x,  prob_bqg.grid.y
    +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +t_bqg = Observable(prob_bqg.clock.t)
    +t_eqbqg = Observable(prob_eqbqg.clock.t)
    +
    +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg)
    +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg)
    +
    +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)
    +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)
    +
    +ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))
    +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))
    +
    +heatmap!(ax1, x, y, ζ_bqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +heatmap!(ax2, x, y, ζ_eqbqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Time-stepping the Problem forward

    Now we time-step both problems forward and animate the relative vorticity in each case.

    startwalltime = time()
    +
    +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
    +
    +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)
    +    println(log_bqg)
    +
    +    log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)
    +    println(log_eqbqg)
    +  end
    +
    +  stepforward!(prob_bqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_bqg)
    +
    +  stepforward!(prob_eqbqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_eqbqg)
    +
    +  t_bqg[] = prob_bqg.clock.t
    +  t_eqbqg[] = prob_eqbqg.clock.t
    +  ζ_bqg[] = relativevorticity(prob_bqg)
    +  ζ_eqbqg[] = relativevorticity(prob_eqbqg)
    +end
    barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min
    +equivalent barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min
    +barotropic; step: 1000, t: 10, cfl: 0.65, walltime: 0.11 min
    +equivalent barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.11 min
    +barotropic; step: 2000, t: 20, cfl: 0.52, walltime: 0.19 min
    +equivalent barotropic; step: 2000, t: 20, cfl: 0.35, walltime: 0.19 min
    +barotropic; step: 3000, t: 30, cfl: 0.48, walltime: 0.27 min
    +equivalent barotropic; step: 3000, t: 30, cfl: 0.32, walltime: 0.27 min
    +barotropic; step: 4000, t: 40, cfl: 0.49, walltime: 0.36 min
    +equivalent barotropic; step: 4000, t: 40, cfl: 0.34, walltime: 0.36 min


    This page was generated using Literate.jl.

    diff --git a/dev/literated/singlelayerqg_decaying_topography.jl b/v0.15.1/literated/singlelayerqg_decaying_topography.jl similarity index 100% rename from dev/literated/singlelayerqg_decaying_topography.jl rename to v0.15.1/literated/singlelayerqg_decaying_topography.jl diff --git a/v0.15.1/literated/singlelayerqg_decaying_topography.mp4 b/v0.15.1/literated/singlelayerqg_decaying_topography.mp4 new file mode 100644 index 00000000..d836351f Binary files /dev/null and b/v0.15.1/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/v0.15.1/literated/singlelayerqg_decaying_topography/index.html b/v0.15.1/literated/singlelayerqg_decaying_topography/index.html new file mode 100644 index 00000000..7619cd9d --- /dev/null +++ b/v0.15.1/literated/singlelayerqg_decaying_topography/index.html @@ -0,0 +1,100 @@ + +Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

    Decaying barotropic QG turbulence over topography

    This example can be viewed as a Jupyter notebook via .

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size

    Define the topographic potential vorticity, $\eta = f_0 h(x, y)/H$. The topography here is an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$.

    σx, σy = 0.4, 0.8
    +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    The topophic PV is prescribed via keyword argument eta.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,
    +                             dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    η = Array(params.eta)
    +
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "topographic PV η=f₀h/H",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +contourf!(ax, x, y, η;
    +          levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
    +
    +fig

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.04 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. qih = ifelse(K < 6  * 2π/L, 0, qih)
    +@. qih = ifelse(K > 12 * 2π/L, 0, qih)
    +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid))  # normalize qi to have energy E₀
    +qi = irfft(qih, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, qi)

    Let's plot the initial vorticity and streamfunction.

    q = Observable(Array(vars.q))
    +ψ = Observable(Array(vars.ψ))
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y")
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +title_ψ = Observable("initial streamfunction ψ")
    +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
    +
    +hm = heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +levels = collect(range(-0.28, stop=0.28, length=11))
    +
    +hc = contourf!(axψ, x, y, ψ;
    +          levels, colormap = :viridis, colorrange = (-0.28, 0.28),
    +          extendlow = :auto, extendhigh = :auto)
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +Colorbar(fig[1, 4], hc)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files.

    filepath = "."
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.

    contour!(axq, x, y, η;
    +         levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))
    +
    +contour!(axq, x, y, η;
    +         levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
    +
    +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +title_ψ[] = "streamfunction ψ"

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +
    +  title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t)
    +  title_ψ[] = "streamfunction ψ"
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.81, E: 0.0394, Q: 3.1940, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.62, E: 0.0382, Q: 0.5561, walltime: 0.38 min
    +step: 2000, t: 100, cfl: 0.85, E: 0.0381, Q: 0.2791, walltime: 0.71 min


    This page was generated using Literate.jl.

    diff --git a/v0.15.1/literated/sqg_ellipticalvortex.mp4 b/v0.15.1/literated/sqg_ellipticalvortex.mp4 new file mode 100644 index 00000000..1878431f Binary files /dev/null and b/v0.15.1/literated/sqg_ellipticalvortex.mp4 differ diff --git a/dev/literated/surfaceqg_decaying.jl b/v0.15.1/literated/surfaceqg_decaying.jl similarity index 100% rename from dev/literated/surfaceqg_decaying.jl rename to v0.15.1/literated/surfaceqg_decaying.jl diff --git a/v0.15.1/literated/surfaceqg_decaying/index.html b/v0.15.1/literated/surfaceqg_decaying/index.html new file mode 100644 index 00000000..4b7e4c05 --- /dev/null +++ b/v0.15.1/literated/surfaceqg_decaying/index.html @@ -0,0 +1,132 @@ + +Decaying Surface QG turbulence · GeophysicalFlows.jl

    Decaying Surface QG turbulence

    This example can be run online via . Also, it can be viewed as a Jupyter notebook via .

    A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 256                       # 2D resolution = n²
    +stepper = "FilteredETDRK4"          # timestepper
    +     dt = 0.03                      # timestep
    +     tf = 60                        # length of time for simulation
    + nsteps = Int(tf / dt)              # total number of time-steps
    + nsubs  = round(Int, nsteps/100)    # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

     L = 2π        # domain size
    + ν = 1e-19     # hyper-viscosity coefficient
    +nν = 4         # hyper-viscosity order

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    We initialize the buoyancy equation with an elliptical vortex.

    X, Y = gridpoints(grid)
    +b₀ = @. exp(-(X^2 + 4Y^2))
    +
    +SurfaceQG.set_b!(prob, b₀)

    Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (500, 500))
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "buoyancy bₛ",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +hm = heatmap!(ax, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +fig

    Diagnostics

    Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

    B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
    +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
    +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
    +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

    base_filename = string("SurfaceQG_decaying_n_", n)
    "SurfaceQG_decaying_n_256"

    We choose folder for outputing .jld2 files and snapshots (.png files).

    datapath = "./"
    +plotpath = "./"
    +
    +dataname = joinpath(datapath, base_filename)
    +plotname = joinpath(plotpath, base_filename)

    Do some basic file management,

    if !isdir(plotpath); mkdir(plotpath); end
    +if !isdir(datapath); mkdir(datapath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.

    b = Observable(Array(vars.b))
    +
    +ke = Observable([Point2f(KE.t[1], KE.data[1])])
    +b² = Observable([Point2f(B.t[1], B.data[1])])
    +
    +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t))
    +
    +fig = Figure(resolution = (900, 600))
    +
    +axb = Axis(fig[1:2, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_b,
    +           aspect = 1,
    +           limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 2];
    +           xlabel = "t",
    +           limits = ((0, tf), (0, 2e-2)))
    +
    +heatmap!(axb, x, y, b;
    +         colormap = :deep, colorrange = (0, 1))
    +
    +hE  = lines!(axE, ke; linewidth = 3)
    +hb² = lines!(axE, b²; linewidth = 3)
    +
    +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
    +
    +fig

    Time-stepping the Problem forward and create animation by updating the plot.

    startwalltime = time()
    +
    +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
    +  if j % (500 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, (time()-startwalltime)/60)
    +
    +    log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e",
    +              B.data[B.i], Dᵇ.data[Dᵇ.i])
    +
    +    println(log1)
    +
    +    println(log2)
    +  end
    +
    +  b[] = vars.b
    +
    +  ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))
    +  b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))
    +
    +  title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SurfaceQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
    +step: 0500, t: 15.0, cfl: 0.588, walltime: 0.11 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 3.97e-11
    +step: 1000, t: 30.0, cfl: 0.571, walltime: 0.20 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.08e-09
    +step: 1500, t: 45.0, cfl: 0.575, walltime: 0.30 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 8.29e-09
    +step: 2000, t: 60.0, cfl: 0.577, walltime: 0.40 min
    +buoyancy variance: 1.82e-02, buoyancy variance dissipation: 9.89e-09

    Let's see how all flow fields look like at the end of the simulation.

    fig = Figure(resolution = (800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +
    +hb = heatmap!(axb, x, y, Array(vars.b);
    +             colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[2, 1], hb, vertical = false)
    +
    +hu = heatmap!(axu, x, y, Array(vars.u);
    +             colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
    +
    +Colorbar(fig[2, 2], hu, vertical = false)
    +
    +hv = heatmap!(axv, x, y, Array(vars.v);
    +             colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
    +
    +Colorbar(fig[2, 3], hv, vertical = false)
    +
    +fig

    Save

    We can save the output at the end of the simulation by calling

    saveoutput(out)

    This page was generated using Literate.jl.

    diff --git a/dev/literated/twodnavierstokes_decaying.jl b/v0.15.1/literated/twodnavierstokes_decaying.jl similarity index 100% rename from dev/literated/twodnavierstokes_decaying.jl rename to v0.15.1/literated/twodnavierstokes_decaying.jl diff --git a/v0.15.1/literated/twodnavierstokes_decaying/index.html b/v0.15.1/literated/twodnavierstokes_decaying/index.html new file mode 100644 index 00000000..51936386 --- /dev/null +++ b/v0.15.1/literated/twodnavierstokes_decaying/index.html @@ -0,0 +1,96 @@ + +2D decaying turbulence · GeophysicalFlows.jl

    2D decaying turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of decaying two-dimensional turbulence.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using Random: seed!
    +using GeophysicalFlows: peakedisotropicspectrum

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length

    Then we pick the time-stepper parameters

        dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

    Next we define some shortcuts for convenience.

    sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
    +TwoDNavierStokes.set_ζ!(prob, ζ₀)

    Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "initial vorticity",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ');
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
    +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingTwoDNavierStokes"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    +saveproblem(out)

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t))
    +
    +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])
    +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "t",
    +           limits = ((-0.5, 40.5), (0, 1.05)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
    +
    +fig

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min",
    +        clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))
    +  enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))
    +
    +  title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.47, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.00 min
    +step: 1000, t: 10, cfl: 0.38, ΔE: 0.9687, ΔZ: 0.1880, walltime: 0.06 min
    +step: 2000, t: 20, cfl: 0.34, ΔE: 0.9655, ΔZ: 0.1084, walltime: 0.10 min
    +step: 3000, t: 30, cfl: 0.51, ΔE: 0.9645, ΔZ: 0.0831, walltime: 0.15 min
    +step: 4000, t: 40, cfl: 0.46, ΔE: 0.9642, ΔZ: 0.0734, walltime: 0.20 min

    Radial energy spectrum

    After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

    E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
    +Eh = rfft(E)                         # Fourier transform of energy density
    +
    +# compute radial specturm of `Eh`
    +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)

    and we plot it.

    lines(kr, vec(abs.(Ehr));
    +      linewidth = 2,
    +      axis = (xlabel = L"k_r",
    +              ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta",
    +              xscale = log10,
    +              yscale = log10,
    +              title = "Radial energy spectrum",
    +              limits = ((0.3, 1e2), (1e0, 1e5))))

    This page was generated using Literate.jl.

    diff --git a/dev/literated/twodnavierstokes_stochasticforcing.jl b/v0.15.1/literated/twodnavierstokes_stochasticforcing.jl similarity index 100% rename from dev/literated/twodnavierstokes_stochasticforcing.jl rename to v0.15.1/literated/twodnavierstokes_stochasticforcing.jl diff --git a/v0.15.1/literated/twodnavierstokes_stochasticforcing/index.html b/v0.15.1/literated/twodnavierstokes_stochasticforcing/index.html new file mode 100644 index 00000000..99c36662 --- /dev/null +++ b/v0.15.1/literated/twodnavierstokes_stochasticforcing/index.html @@ -0,0 +1,99 @@ + +2D forced-dissipative turbulence · GeophysicalFlows.jl

    2D forced-dissipative turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record
    record (generic function with 2 methods)

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π             # grid resolution and domain length
    + ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0             # linear drag coefficient
    +    dt = 0.005               # timestep
    +nsteps = 4000                # total number of steps
    + nsubs = 20                  # number of steps between each plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x, y = grid.x, grid.y

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy budget.

    E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
    +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
    +
    +energy = Observable(Point2f[(μ * E.t[1], E.data[1])])
    +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "μ t",
    +           limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["energy E(t)" "enstrophy Z(t) / k_f²"])
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
    +  if j % (1000/nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))
    +
    +  title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
    +step: 1000, t: 5, cfl: 0.41, E: 0.2963, Z: 36.2331, walltime: 0.22 min
    +step: 2000, t: 10, cfl: 0.51, E: 0.4157, Z: 38.0039, walltime: 0.44 min
    +
    +step: 3000, t: 15, cfl: 0.57, E: 0.4570, Z: 37.1752, walltime: 0.66 min
    +step: 4000, t: 20, cfl: 0.51, E: 0.4460, Z: 34.7938, walltime: 0.87 min


    This page was generated using Literate.jl.

    diff --git a/dev/literated/twodnavierstokes_stochasticforcing_budgets.jl b/v0.15.1/literated/twodnavierstokes_stochasticforcing_budgets.jl similarity index 100% rename from dev/literated/twodnavierstokes_stochasticforcing_budgets.jl rename to v0.15.1/literated/twodnavierstokes_stochasticforcing_budgets.jl diff --git a/v0.15.1/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/v0.15.1/literated/twodnavierstokes_stochasticforcing_budgets/index.html new file mode 100644 index 00000000..a9cc8108 --- /dev/null +++ b/v0.15.1/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -0,0 +1,159 @@ + +2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

    2D forced-dissipative turbulence budgets

    This example can viewed as a Jupyter notebook via .

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record
    record (generic function with 2 methods)

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π              # grid resolution and domain length
    + ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0              # linear drag coefficient
    +dt, tf = 0.005, 0.2 / μ       # timestep and final time
    +    nt = round(Int, tf / dt)  # total timesteps
    +    ns = 4                    # how many intermediate times we want to plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

    E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
    +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
    +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
    +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy,                            prob, nsteps=nt) # enstrophy
    +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity,  prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work,                       prob, nsteps=nt) # enstrophy work input by forcing
    +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +for i = 1:ns
    +  stepforward!(prob, diags, round(Int, nt/ns))
    +
    +  TwoDNavierStokes.updatevars!(prob)
    +
    +  cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +  log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t,
    +        cfl, (time()-startwalltime)/60)
    +
    +  println(log)
    +end
    step: 0100, t: 0.5, cfl: 0.158, walltime: 0.02 min
    +step: 0200, t: 1.0, cfl: 0.245, walltime: 0.04 min
    +step: 0300, t: 1.5, cfl: 0.283, walltime: 0.07 min
    +step: 0400, t: 2.0, cfl: 0.284, walltime: 0.09 min

    Plot

    Now let's see the final snapshot of the vorticity.

    fig = Figure(resolution = (400, 400))
    +
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ);
    +         colormap = :viridis, colorrange = (-25, 25))
    +
    +fig

    And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +TwoDNavierStokes.updatevars!(prob)
    +
    +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags
    +
    +clocktime = round(μ * clock.t, digits=2)
    +
    +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency
    +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency
    +
    +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]
    +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]
    +
    +residual_E = dEdt_computed - dEdt_numerical
    +residual_Z = dZdt_computed - dZdt_numerical
    +
    +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)
    +
    +t = E.t[2:E.i]
    +
    +fig = Figure(resolution = (800, 1100))
    +
    +axis_kwargs = (xlabel = "μ t", )
    +
    +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...)
    +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...)
    +ax3E = Axis(fig[5, 1]; axis_kwargs...)
    +
    +ax1Z = Axis(fig[1, 2]; axis_kwargs...)
    +ax2Z = Axis(fig[3, 2]; axis_kwargs...)
    +ax3Z = Axis(fig[5, 2]; axis_kwargs...)
    +
    +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i];   linestyle = :solid)
    +hε  = lines!(ax1E, t, ε .+ 0t;     linestyle = :dash)
    +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)
    +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 1],
    +       [hWᵋ, hε, hDᵋ, hRᵋ],
    +       ["energy work, Wᵋ" "ensemble mean energy work, <Wᵋ>" "dissipation, Dᵋ" "drag, Rᵋ = - 2μE"])
    +
    +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
    +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 1],
    +       [hc, hn],
    +       ["computed Wᵋ-Dᵋ" "numerical dE/dt"])
    +
    +hr = lines!(ax3E, t, residual_E)
    +
    +Legend(fig[6, 1],
    +       [hr],
    +       ["residual"])
    +
    +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i];  linestyle = :solid)
    +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t;    linestyle = :dash)
    +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)
    +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 2],
    +       [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
    +       ["enstrophy work, Wᶻ" "ensemble mean enstophy work, <Wᶻ>" "dissipation, Dᶻ" "drag, Rᶻ = - 2μZ"])
    +
    +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
    +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 2],
    +       [hcᶻ, hnᶻ],
    +       ["computed Wᶻ-Dᶻ" "numerical dZ/dt"])
    +
    +hrᶻ = lines!(ax3Z, t, residual_Z)
    +
    +Legend(fig[6, 2],
    +       [hr],
    +       ["residual"])
    +
    +fig

    This page was generated using Literate.jl.

    diff --git a/v0.15.1/literated/twodturb.mp4 b/v0.15.1/literated/twodturb.mp4 new file mode 100644 index 00000000..1632b03f Binary files /dev/null and b/v0.15.1/literated/twodturb.mp4 differ diff --git a/v0.15.1/literated/twodturb_forced.mp4 b/v0.15.1/literated/twodturb_forced.mp4 new file mode 100644 index 00000000..fadbea58 Binary files /dev/null and b/v0.15.1/literated/twodturb_forced.mp4 differ diff --git a/v0.15.1/modules/barotropicqgql/index.html b/v0.15.1/modules/barotropicqgql/index.html new file mode 100644 index 00000000..b6dba608 --- /dev/null +++ b/v0.15.1/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

    BarotropicQGQL

    Basic Equations

    This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

    \[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

    where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g.,

    As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

    \[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

    The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

    \[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

    Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

    The linear operator is constructed in Equation

    GeophysicalFlows.BarotropicQGQL.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    Nonlinear term is computed via calcN! function.

    source

    and the nonlinear terms are computed via

    GeophysicalFlows.BarotropicQGQL.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    The kinetic energy of the fluid is obtained via:

    while the enstrophy via:

    Other diagnostic include: dissipation, drag, and work.

    Examples

    • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
    diff --git a/v0.15.1/modules/multilayerqg/index.html b/v0.15.1/modules/multilayerqg/index.html new file mode 100644 index 00000000..58312f7b --- /dev/null +++ b/v0.15.1/modules/multilayerqg/index.html @@ -0,0 +1,27 @@ + +MultiLayerQG · GeophysicalFlows.jl

    MultiLayerQG

    Basic Equations

    This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

    The QGPV in each layer is

    \[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

    where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

    \[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

    with

    \[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = g \frac{\rho_{j+1} - \rho_j}{\rho_{j+1}} .\]

    In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

    \[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

    where

    \[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ + F_{3/2, 2} & -(F_{3/2, 2}+F_{5/2, 2}) & F_{5/2, 2} & & \vdots\\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

    Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

    \[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

    with

    \[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

    Implementation

    Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

    One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

    The equations of motion are time-stepped forward in Fourier space:

    \[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

    In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

    The linear operator is constructed in Equation

    GeophysicalFlows.MultiLayerQG.EquationFunction
    Equation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcN!.

    source
    GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
    hyperviscosity(params, grid)

    Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

    \[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

    source

    The nonlinear terms are computed via

    GeophysicalFlows.MultiLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Linearized MultiLayerQG dynamics

    The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

    Helper functions

    GeophysicalFlows.MultiLayerQG.set_ψ!Function
    set_ψ!(params, vars, grid, sol, ψ)
    +set_ψ!(prob, ψ)

    Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

    source

    Diagnostics

    The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

    GeophysicalFlows.MultiLayerQG.energiesFunction
    energies(vars, params, grid, sol)
    +energies(prob)

    Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

    The kinetic energy at the $j$-th fluid layer is

    \[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

    while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

    \[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

    source

    The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

    GeophysicalFlows.MultiLayerQG.fluxesFunction
    fluxes(vars, params, grid, sol)
    +fluxes(prob)

    Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

    The lateral eddy fluxes within the $j$-th fluid layer are

    \[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

    while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

    \[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

    source

    Examples

    diff --git a/v0.15.1/modules/singlelayerqg/index.html b/v0.15.1/modules/singlelayerqg/index.html new file mode 100644 index 00000000..4cfb1e47 --- /dev/null +++ b/v0.15.1/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

    SingleLayerQG

    Basic Equations

    This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

    \[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

    where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

    The dynamical variable is $q$. Thus, the equation solved by the module is:

    \[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

    The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SingleLayerQG.EquationFunction
    Equation(params::BarotropicQGParams, grid)

    Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    The nonlinear term is computed via calcN! function.

    source
    Equation(params::EquivalentBarotropicQGParams, grid)

    Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

    The nonlinear term is computed via calcN! function.

    source

    The nonlinear terms are computed via

    GeophysicalFlows.SingleLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    The kinetic energy of the fluid is computed via:

    GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    source

    while the potential energy, for an equivalent barotropic fluid, is computed via:

    GeophysicalFlows.SingleLayerQG.potential_energyFunction
    potential_energy(prob)

    Return the problem's (prob) domain-averaged potential energy of the fluid,

    \[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

    source

    The total energy is:

    GeophysicalFlows.SingleLayerQG.energyFunction
    energy(prob)

    Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

    source

    Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

    Examples

    diff --git a/v0.15.1/modules/surfaceqg/index.html b/v0.15.1/modules/surfaceqg/index.html new file mode 100644 index 00000000..f5d3518e --- /dev/null +++ b/v0.15.1/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

    SurfaceQG

    Basic Equations

    This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

    \[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

    The SQG model evolves the surface buoyancy,

    \[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

    Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

    \[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

    with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

    These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

    \[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

    where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

    Implementation

    The buoyancy equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

    The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SurfaceQG.EquationFunction
    Equation(params, grid)

    Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

    \[L = - ν |𝐤|^{2 n_ν} .\]

    Plain old viscocity corresponds to $n_ν=1$.

    The nonlinear term is computed via function calcN!().

    source

    while the nonlinear terms via

    GeophysicalFlows.SurfaceQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    Some useful diagnostics are kinetic energy and buoyancy variance.

    GeophysicalFlows.SurfaceQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    In SQG, this is identical to half the domain-averaged surface buoyancy variance.

    source
    GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
    buoyancy_variance(prob)

    Return the buoyancy variance,

    \[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

    In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

    source

    Other diagnostic include: buoyancy_dissipation and buoyancy_work.

    Examples

    • examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.

      Capet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.

    diff --git a/v0.15.1/modules/twodnavierstokes/index.html b/v0.15.1/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..7d044d30 --- /dev/null +++ b/v0.15.1/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

    TwoDNavierStokes

    Basic Equations

    This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

    \[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

    where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.TwoDNavierStokes.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

    \[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

    Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

    The nonlinear term is computed via the function calcN!.

    source

    The nonlinear terms are computed via calcN!,

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    Some useful diagnostics are:

    GeophysicalFlows.TwoDNavierStokes.energyFunction
    energy(prob)

    Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

    where $ψ$ is the streamfunction.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
    enstrophy(prob)

    Returns the problem's (prob) domain-averaged enstrophy,

    \[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

    Examples

    diff --git a/v0.15.1/search/index.html b/v0.15.1/search/index.html new file mode 100644 index 00000000..03766b2a --- /dev/null +++ b/v0.15.1/search/index.html @@ -0,0 +1,2 @@ + +Search · GeophysicalFlows.jl diff --git a/v0.15.1/search_index.js b/v0.15.1/search_index.js new file mode 100644 index 00000000..2f725703 --- /dev/null +++ b/v0.15.1/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = g fracrho_j+1 - rho_jrho_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.\nCapet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia>]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that oftentimes this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\" \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#[Phillips-model-of-Baroclinic-Instability](@ref-multilayerqg_2layer_example)","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀, g = 1, 1 # Coriolis parameter and gravitational constant\nH = [0.2, 0.8] # the rest depths of each layer\nρ = [4.0, 5.0] # the density of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,\n dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This example can viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\" \"ensemble mean energy work, \" \"dissipation, Dᵋ\" \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\" \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\" \"ensemble mean enstophy work, \" \"dissipation, Dᶻ\" \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\" \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\nnothing # hide\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the flow on-the-fly as the problem is stepped forward or we can save output onto .jld2 and after simulation is done load the output and visualize it. Most examples use the former strategy. For a demonstration for how one can save output and load later to process/visualize look at the SingeLayerQG beta-plane forced-dissipative example. Furthermore, the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Any: array with density of each fluid layer\nH::Any: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Any: array with density of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 20 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 8) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Farrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. J. Atmos. Sci., 60, 2101-2118.\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. J. Atmos. Sci., 69 (5), 1633-1656.\nConstantinou, N. C., Farrell, B. F., and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. J. Atmos. Sci., 71 (5), 1818-1842.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturns the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. J. Fluid Mech., 146, 21-43.\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n g = 1.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n ρ = Array{Float64}(1:nlayers),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\ng: Gravitational acceleration constant.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nρ: Density of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) * (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) * (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n Fh .= sqrt.(forcing_spectrum) .* exp.(2π * im * random_uniform(eltype(grid), size(sol))) ./ sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"j = Observable(1)\n\nq = @lift irfft(qh[$j], nx)\nψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)\nq̄ = @lift real(ifft(qh[$j][1, :] / ny))\nū = @lift vec(mean(u[$j], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$j])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ū, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 18) do i\n j[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"# we delete the .jld2 file before deploying the docs (takes too much space) #hide\nrm(output.path) #hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This example can be run online via (Image: ). Also, it can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.\nnothing # hidenothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Bisits, J. I., Stanley G. J., and Zika, J. D. (2022). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, Early Online Release. doi:10.1175/JPO-D-22-0145.1.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.\nDrivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.\nPalóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decaying_topography","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/v0.15.1/siteinfo.js b/v0.15.1/siteinfo.js new file mode 100644 index 00000000..af5dc7cd --- /dev/null +++ b/v0.15.1/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.15.1"; diff --git a/v0.15.1/stochastic_forcing/index.html b/v0.15.1/stochastic_forcing/index.html new file mode 100644 index 00000000..072853b6 --- /dev/null +++ b/v0.15.1/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that oftentimes this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/v0.15.1/visualize/index.html b/v0.15.1/visualize/index.html new file mode 100644 index 00000000..b43c348b --- /dev/null +++ b/v0.15.1/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the flow on-the-fly as the problem is stepped forward or we can save output onto .jld2 and after simulation is done load the output and visualize it. Most examples use the former strategy. For a demonstration for how one can save output and load later to process/visualize look at the SingeLayerQG beta-plane forced-dissipative example. Furthermore, the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/v0.15.2/aliasing/index.html b/v0.15.2/aliasing/index.html new file mode 100644 index 00000000..6d13e907 --- /dev/null +++ b/v0.15.2/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

    Aliasing

    In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

    De-aliasing scheme

    FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

    julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
    +
    +julia> OneDimensionalGrid
    +         ├─────────── Device: CPU
    +         ├──────── FloatType: Float64
    +         ├────────── size Lx: 6.283185307179586
    +         ├──── resolution nx: 64
    +         ├── grid spacing dx: 0.09817477042468103
    +         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
    +         └─ aliased fraction: 0.5

    or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

    julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
    +Problem
    +  ├─────────── grid: grid (on CPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper
    +  
    +julia> prob.grid.aliased_fraction
    +0.5

    Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

    All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

    To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

    diff --git a/v0.15.2/assets/README/index.html b/v0.15.2/assets/README/index.html new file mode 100644 index 00000000..2b5fef2e --- /dev/null +++ b/v0.15.2/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/v0.15.2/assets/documenter.js b/v0.15.2/assets/documenter.js new file mode 100644 index 00000000..6adfbbbf --- /dev/null +++ b/v0.15.2/assets/documenter.js @@ -0,0 +1,331 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fas", "fa-copy"); + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-times"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-times"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function() { + $('#documenter .docs-navbar').headroom({ + "tolerance": {"up": 10, "down": 10}, + }); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function() { + var settings = $('#documenter-settings'); + $('#documenter-settings-button').click(function(){ + settings.toggleClass('is-active'); + }); + // Close the dialog if X is clicked + $('#documenter-settings button.delete').click(function(){ + settings.removeClass('is-active'); + }); + // Close dialog if ESC is pressed + $(document).keyup(function(e) { + if (e.keyCode == 27) settings.removeClass('is-active'); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function() { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button") + sidebar_button.click(function(ev) { + ev.preventDefault(); + sidebar.toggleClass('visible'); + if (sidebar.hasClass('visible')) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind('click', function(ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + }); +}) + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function() { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css('max-width'), 10); + var L0 = e.width(); + if(L0 > L) { + var h0 = parseInt(e.css('font-size'), 10); + e.css('font-size', L * h0 / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on('orientationchange', resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function() { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if(typeof active !== 'undefined') { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +function set_theme(theme) { + var active = null; + var disabled = []; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + var themename = ss.ownerNode.getAttribute("data-theme-name"); + if(themename === null) continue; // ignore non-theme stylesheets + // Find the active theme + if(themename === theme) active = ss; + else disabled.push(ss); + } + if(active !== null) { + active.disabled = false; + if(active.ownerNode.getAttribute("data-theme-primary") === null) { + document.getElementsByTagName('html')[0].className = "theme--" + theme; + } else { + document.getElementsByTagName('html')[0].className = ""; + } + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + + // Store the theme in localStorage + if(typeof(window.localStorage) !== "undefined") { + window.localStorage.setItem("documenter-theme", theme); + } else { + console.error("Browser does not support window.localStorage"); + } +} + +// Theme picker setup +$(document).ready(function() { + // onchange callback + $('#documenter-themepicker').change(function themepick_callback(ev){ + var themename = $('#documenter-themepicker option:selected').attr('value'); + set_theme(themename); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if(typeof(window.localStorage) !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if(theme !== null) { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = (e.value === theme); + }) + } else { + $('#documenter-themepicker option').each(function(i,e) { + e.selected = $("html").hasClass(`theme--${e.value}`); + }) + } + } +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function() { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function(x) { + target_href = version_selector_select.children("option:selected").get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) { + var option = $(""); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== 'undefined') { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function(i,x){return x.text}); + DOC_VERSIONS.forEach(function(each) { + var version_url = documenterBaseURL + "/../" + each; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $(""); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}) + +}) diff --git a/v0.15.2/assets/energy_budgets_Ito.svg b/v0.15.2/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..5de31295 --- /dev/null +++ b/v0.15.2/assets/energy_budgets_Ito.svg @@ -0,0 +1,1390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.2/assets/energy_budgets_Stratonovich.svg b/v0.15.2/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..80045065 --- /dev/null +++ b/v0.15.2/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.2/assets/energy_comparison.svg b/v0.15.2/assets/energy_comparison.svg new file mode 100644 index 00000000..33e52435 --- /dev/null +++ b/v0.15.2/assets/energy_comparison.svg @@ -0,0 +1,616 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.2/assets/search.js b/v0.15.2/assets/search.js new file mode 100644 index 00000000..c133f741 --- /dev/null +++ b/v0.15.2/assets/search.js @@ -0,0 +1,267 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min', + 'lodash': 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + } +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'lunr', 'lodash'], function($, lunr, _) { + +$(document).ready(function() { + // parseUri 1.2.2 + // (c) Steven Levithan + // MIT License + function parseUri (str) { + var o = parseUri.options, + m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) uri[o.key[i]] = m[i] || ""; + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) uri[o.q.name][$1] = $2; + }); + + return uri; + }; + parseUri.options = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } + }; + + $("#search-form").submit(function(e) { + e.preventDefault() + }) + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'does', + 'either', + 'ever', + 'every', + 'from', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'into', + 'it', + 'its', + 'just', + 'least', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'who', + 'whom', + 'why', + 'will', + 'would', + 'yet', + 'you', + 'your' + ]) + + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!" + // would not find anything if searching for "add!", only for the entire qualification + lunr.tokenizer.separator = /[\s\-\.]+/ + + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '') + }) + } + + lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter') + lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer') + + var index = lunr(function () { + this.ref('location') + this.field('title',{boost: 100}) + this.field('text') + documenterSearchIndex['docs'].forEach(function(e) { + this.add(e) + }, this) + }) + var store = {} + + documenterSearchIndex['docs'].forEach(function(e) { + store[e.location] = {title: e.title, category: e.category, page: e.page} + }) + + $(function(){ + searchresults = $('#documenter-search-results'); + searchinfo = $('#documenter-search-info'); + searchbox = $('#documenter-search-query'); + searchform = $('.docs-search'); + sidebar = $('.docs-sidebar'); + function update_search(querystring) { + tokens = lunr.tokenizer(querystring) + results = index.query(function (q) { + tokens.forEach(function (t) { + q.term(t.toString(), { + fields: ["title"], + boost: 100, + usePipeline: true, + editDistance: 0, + wildcard: lunr.Query.wildcard.NONE + }) + q.term(t.toString(), { + fields: ["title"], + boost: 10, + usePipeline: true, + editDistance: 2, + wildcard: lunr.Query.wildcard.NONE + }) + q.term(t.toString(), { + fields: ["text"], + boost: 1, + usePipeline: true, + editDistance: 0, + wildcard: lunr.Query.wildcard.NONE + }) + }) + }) + searchinfo.text("Number of results: " + results.length) + searchresults.empty() + results.forEach(function(result) { + data = store[result.ref] + link = $(''+data.title+'') + link.attr('href', documenterBaseURL+'/'+result.ref) + if (data.category != "page"){ + cat = $('('+data.category+', '+data.page+')') + } else { + cat = $('('+data.category+')') + } + li = $('
  • ').append(link).append(" ").append(cat) + searchresults.append(li) + }) + } + + function update_search_box() { + querystring = searchbox.val() + update_search(querystring) + } + + searchbox.keyup(_.debounce(update_search_box, 250)) + searchbox.change(update_search_box) + + // Disable enter-key form submission for the searchbox on the search page + // and just re-run search rather than refresh the whole page. + searchform.keypress( + function(event){ + if (event.which == '13') { + if (sidebar.hasClass('visible')) { + sidebar.removeClass('visible'); + } + update_search_box(); + event.preventDefault(); + } + } + ); + + search_query_uri = parseUri(window.location).queryKey["q"] + if(search_query_uri !== undefined) { + search_query = decodeURIComponent(search_query_uri.replace(/\+/g, '%20')) + searchbox.val(search_query) + } + update_search_box(); + }) +}) + +}) diff --git a/v0.15.2/assets/themes/documenter-dark.css b/v0.15.2/assets/themes/documenter-dark.css new file mode 100644 index 00000000..0bf1af7d --- /dev/null +++ b/v0.15.2/assets/themes/documenter-dark.css @@ -0,0 +1,7702 @@ +@charset "UTF-8"; +/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +html.theme--documenter-dark .tabs, html.theme--documenter-dark .pagination-previous, +html.theme--documenter-dark .pagination-next, +html.theme--documenter-dark .pagination-link, +html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .breadcrumb, html.theme--documenter-dark .file, html.theme--documenter-dark .button, .is-unselectable, html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after, html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +html.theme--documenter-dark .admonition:not(:last-child), html.theme--documenter-dark .tabs:not(:last-child), html.theme--documenter-dark .message:not(:last-child), html.theme--documenter-dark .list:not(:last-child), html.theme--documenter-dark .level:not(:last-child), html.theme--documenter-dark .breadcrumb:not(:last-child), html.theme--documenter-dark .highlight:not(:last-child), html.theme--documenter-dark .block:not(:last-child), html.theme--documenter-dark .title:not(:last-child), +html.theme--documenter-dark .subtitle:not(:last-child), html.theme--documenter-dark .table-container:not(:last-child), html.theme--documenter-dark .table:not(:last-child), html.theme--documenter-dark .progress:not(:last-child), html.theme--documenter-dark .notification:not(:last-child), html.theme--documenter-dark .content:not(:last-child), html.theme--documenter-dark .box:not(:last-child) { + margin-bottom: 1.5rem; } + +html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before, html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before { + height: 2px; + width: 50%; } + html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { + height: 50%; + width: 2px; } + html.theme--documenter-dark .modal-close:hover, html.theme--documenter-dark .delete:hover, html.theme--documenter-dark .modal-close:focus, html.theme--documenter-dark .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + html.theme--documenter-dark .modal-close:active, html.theme--documenter-dark .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + html.theme--documenter-dark .is-small.modal-close, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.modal-close, html.theme--documenter-dark .is-small.delete, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + html.theme--documenter-dark .is-medium.modal-close, html.theme--documenter-dark .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + html.theme--documenter-dark .is-large.modal-close, html.theme--documenter-dark .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +html.theme--documenter-dark .control.is-loading::after, html.theme--documenter-dark .select.is-loading::after, html.theme--documenter-dark .loader, html.theme--documenter-dark .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdee0; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +html.theme--documenter-dark .hero-video, html.theme--documenter-dark .modal-background, html.theme--documenter-dark .modal, html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, +html.theme--documenter-dark .image.is-square .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, +html.theme--documenter-dark .image.is-1by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, +html.theme--documenter-dark .image.is-5by4 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, +html.theme--documenter-dark .image.is-4by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, +html.theme--documenter-dark .image.is-3by2 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, +html.theme--documenter-dark .image.is-5by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, +html.theme--documenter-dark .image.is-16by9 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, +html.theme--documenter-dark .image.is-2by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, +html.theme--documenter-dark .image.is-3by1 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, +html.theme--documenter-dark .image.is-4by5 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, +html.theme--documenter-dark .image.is-3by4 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, +html.theme--documenter-dark .image.is-2by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, +html.theme--documenter-dark .image.is-3by5 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, +html.theme--documenter-dark .image.is-9by16 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, +html.theme--documenter-dark .image.is-1by2 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, +html.theme--documenter-dark .image.is-1by3 .has-ratio, +html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +html.theme--documenter-dark .pagination-previous, +html.theme--documenter-dark .pagination-next, +html.theme--documenter-dark .pagination-link, +html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .file-cta, +html.theme--documenter-dark .file-name, html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 0.4em; + box-shadow: none; + display: inline-flex; + font-size: 15px; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; } + html.theme--documenter-dark .pagination-previous:focus, + html.theme--documenter-dark .pagination-next:focus, + html.theme--documenter-dark .pagination-link:focus, + html.theme--documenter-dark .pagination-ellipsis:focus, html.theme--documenter-dark .file-cta:focus, + html.theme--documenter-dark .file-name:focus, html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .button:focus, html.theme--documenter-dark .is-focused.pagination-previous, + html.theme--documenter-dark .is-focused.pagination-next, + html.theme--documenter-dark .is-focused.pagination-link, + html.theme--documenter-dark .is-focused.pagination-ellipsis, html.theme--documenter-dark .is-focused.file-cta, + html.theme--documenter-dark .is-focused.file-name, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-focused.button, html.theme--documenter-dark .pagination-previous:active, + html.theme--documenter-dark .pagination-next:active, + html.theme--documenter-dark .pagination-link:active, + html.theme--documenter-dark .pagination-ellipsis:active, html.theme--documenter-dark .file-cta:active, + html.theme--documenter-dark .file-name:active, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .button:active, html.theme--documenter-dark .is-active.pagination-previous, + html.theme--documenter-dark .is-active.pagination-next, + html.theme--documenter-dark .is-active.pagination-link, + html.theme--documenter-dark .is-active.pagination-ellipsis, html.theme--documenter-dark .is-active.file-cta, + html.theme--documenter-dark .is-active.file-name, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .is-active.button { + outline: none; } + html.theme--documenter-dark .pagination-previous[disabled], + html.theme--documenter-dark .pagination-next[disabled], + html.theme--documenter-dark .pagination-link[disabled], + html.theme--documenter-dark .pagination-ellipsis[disabled], html.theme--documenter-dark .file-cta[disabled], + html.theme--documenter-dark .file-name[disabled], html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .pagination-previous, html.theme--documenter-dark fieldset[disabled] .pagination-previous, + fieldset[disabled] html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark fieldset[disabled] .pagination-next, + fieldset[disabled] html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark fieldset[disabled] .pagination-link, + fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis, + html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis, fieldset[disabled] html.theme--documenter-dark .file-cta, html.theme--documenter-dark fieldset[disabled] .file-cta, + fieldset[disabled] html.theme--documenter-dark .file-name, + html.theme--documenter-dark fieldset[disabled] .file-name, fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark fieldset[disabled] .select select, html.theme--documenter-dark .select fieldset[disabled] select, html.theme--documenter-dark fieldset[disabled] .textarea, html.theme--documenter-dark fieldset[disabled] .input, html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] html.theme--documenter-dark .button, html.theme--documenter-dark fieldset[disabled] .button { + cursor: not-allowed; } + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; } + +audio { + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: left; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 15px !important; } + +.is-size-7, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + font-size: 0.85em !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 15px !important; } + .is-size-7-mobile { + font-size: 0.85em !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 15px !important; } + .is-size-7-tablet { + font-size: 0.85em !important; } } + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 15px !important; } + .is-size-7-touch { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 15px !important; } + .is-size-7-desktop { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 15px !important; } + .is-size-7-widescreen { + font-size: 0.85em !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 15px !important; } + .is-size-7-fullhd { + font-size: 0.85em !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: #ecf0f1 !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #cfd9db !important; } + +.has-background-light { + background-color: #ecf0f1 !important; } + +.has-text-dark { + color: #282f2f !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #111414 !important; } + +.has-background-dark { + background-color: #282f2f !important; } + +.has-text-primary { + color: #375a7f !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #28415b !important; } + +.has-background-primary { + background-color: #375a7f !important; } + +.has-text-link { + color: #1abc9c !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #148f77 !important; } + +.has-background-link { + background-color: #1abc9c !important; } + +.has-text-info { + color: #024c7d !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #012d4b !important; } + +.has-background-info { + background-color: #024c7d !important; } + +.has-text-success { + color: #008438 !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #005122 !important; } + +.has-background-success { + background-color: #008438 !important; } + +.has-text-warning { + color: #ad8100 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #7a5b00 !important; } + +.has-background-warning { + background-color: #ad8100 !important; } + +.has-text-danger { + color: #9e1b0d !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #6f1309 !important; } + +.has-background-danger { + background-color: #9e1b0d !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #282f2f !important; } + +.has-background-grey-darker { + background-color: #282f2f !important; } + +.has-text-grey-dark { + color: #343c3d !important; } + +.has-background-grey-dark { + background-color: #343c3d !important; } + +.has-text-grey { + color: #5e6d6f !important; } + +.has-background-grey { + background-color: #5e6d6f !important; } + +.has-text-grey-light { + color: #8c9b9d !important; } + +.has-background-grey-light { + background-color: #8c9b9d !important; } + +.has-text-grey-lighter { + color: #dbdee0 !important; } + +.has-background-grey-lighter { + background-color: #dbdee0 !important; } + +.has-text-white-ter { + color: #ecf0f1 !important; } + +.has-background-white-ter { + background-color: #ecf0f1 !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-family-code { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-relative { + position: relative !important; } + +html.theme--documenter-dark { + /* This file contain the overall layout. + * + * The main container is
    that is identified by id #documenter. + */ + /*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/ + /* Comment */ + /* Red */ + /* Orange */ + /* Yellow */ + /* Green */ + /* Blue */ + /* Purple */ } + html.theme--documenter-dark html { + background-color: #1f2424; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + html.theme--documenter-dark article, + html.theme--documenter-dark aside, + html.theme--documenter-dark figure, + html.theme--documenter-dark footer, + html.theme--documenter-dark header, + html.theme--documenter-dark hgroup, + html.theme--documenter-dark section { + display: block; } + html.theme--documenter-dark body, + html.theme--documenter-dark button, + html.theme--documenter-dark input, + html.theme--documenter-dark select, + html.theme--documenter-dark textarea { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + html.theme--documenter-dark code, + html.theme--documenter-dark pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } + html.theme--documenter-dark body { + color: #fff; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + html.theme--documenter-dark a { + color: #1abc9c; + cursor: pointer; + text-decoration: none; } + html.theme--documenter-dark a strong { + color: currentColor; } + html.theme--documenter-dark a:hover { + color: #1dd2af; } + html.theme--documenter-dark code { + background-color: rgba(255, 255, 255, 0.05); + color: #ececec; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; } + html.theme--documenter-dark hr { + background-color: #282f2f; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + html.theme--documenter-dark img { + height: auto; + max-width: 100%; } + html.theme--documenter-dark input[type="checkbox"], + html.theme--documenter-dark input[type="radio"] { + vertical-align: baseline; } + html.theme--documenter-dark small { + font-size: 0.875em; } + html.theme--documenter-dark span { + font-style: inherit; + font-weight: inherit; } + html.theme--documenter-dark strong { + color: #f2f2f2; + font-weight: 700; } + html.theme--documenter-dark fieldset { + border: none; } + html.theme--documenter-dark pre { + -webkit-overflow-scrolling: touch; + background-color: #282f2f; + color: #fff; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + html.theme--documenter-dark pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + html.theme--documenter-dark table td, + html.theme--documenter-dark table th { + vertical-align: top; } + html.theme--documenter-dark table td:not([align]), + html.theme--documenter-dark table th:not([align]) { + text-align: left; } + html.theme--documenter-dark table th { + color: #f2f2f2; } + html.theme--documenter-dark .box { + background-color: #343c3d; + border-radius: 8px; + box-shadow: none; + color: #fff; + display: block; + padding: 1.25rem; } + html.theme--documenter-dark a.box:hover, html.theme--documenter-dark a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #1abc9c; } + html.theme--documenter-dark a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #1abc9c; } + html.theme--documenter-dark .button { + background-color: #282f2f; + border-color: #4c5759; + border-width: 1px; + color: #375a7f; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; } + html.theme--documenter-dark .button strong { + color: inherit; } + html.theme--documenter-dark .button .icon, html.theme--documenter-dark .button .icon.is-small, html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search > input.icon, html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search > input.icon, html.theme--documenter-dark .button .icon.is-medium, html.theme--documenter-dark .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + html.theme--documenter-dark .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; } + html.theme--documenter-dark .button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); } + html.theme--documenter-dark .button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); } + html.theme--documenter-dark .button:hover, html.theme--documenter-dark .button.is-hovered { + border-color: #8c9b9d; + color: #f2f2f2; } + html.theme--documenter-dark .button:focus, html.theme--documenter-dark .button.is-focused { + border-color: #8c9b9d; + color: #17a689; } + html.theme--documenter-dark .button:focus:not(:active), html.theme--documenter-dark .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .button:active, html.theme--documenter-dark .button.is-active { + border-color: #343c3d; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text { + background-color: transparent; + border-color: transparent; + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .button.is-text:hover, html.theme--documenter-dark .button.is-text.is-hovered, html.theme--documenter-dark .button.is-text:focus, html.theme--documenter-dark .button.is-text.is-focused { + background-color: #282f2f; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text:active, html.theme--documenter-dark .button.is-text.is-active { + background-color: #1d2122; + color: #f2f2f2; } + html.theme--documenter-dark .button.is-text[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:hover, html.theme--documenter-dark .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:focus, html.theme--documenter-dark .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white:focus:not(:active), html.theme--documenter-dark .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white { + background-color: white; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-hovered { + background-color: black; } + html.theme--documenter-dark .button.is-white.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + html.theme--documenter-dark .button.is-white.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-white.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:hover, html.theme--documenter-dark .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:focus, html.theme--documenter-dark .button.is-black.is-focused { + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black:focus:not(:active), html.theme--documenter-dark .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + html.theme--documenter-dark .button.is-black[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-black.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + html.theme--documenter-dark .button.is-black.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + html.theme--documenter-dark .button.is-light { + background-color: #ecf0f1; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:hover, html.theme--documenter-dark .button.is-light.is-hovered { + background-color: #e5eaec; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:focus, html.theme--documenter-dark .button.is-light.is-focused { + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light:focus:not(:active), html.theme--documenter-dark .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light.is-active { + background-color: #dde4e6; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .button.is-light[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light { + background-color: #ecf0f1; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-light.is-inverted { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-hovered { + background-color: #1d2122; } + html.theme--documenter-dark .button.is-light.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted { + background-color: #282f2f; + border-color: transparent; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-loading::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-light.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-outlined.is-focused { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-light.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #282f2f; + color: #282f2f; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #282f2f; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark, html.theme--documenter-dark .content kbd.button { + background-color: #282f2f; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover, html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered { + background-color: #232829; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused { + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark:focus:not(:active), html.theme--documenter-dark .content kbd.button:focus:not(:active), html.theme--documenter-dark .button.is-dark.is-focused:not(:active), html.theme--documenter-dark .content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active { + background-color: #1d2122; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark[disabled], html.theme--documenter-dark .content kbd.button[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark, fieldset[disabled] html.theme--documenter-dark .content kbd.button { + background-color: #282f2f; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-dark.is-inverted, html.theme--documenter-dark .content kbd.button.is-inverted { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted:hover, html.theme--documenter-dark .content kbd.button.is-inverted:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered { + background-color: #dde4e6; } + html.theme--documenter-dark .button.is-dark.is-inverted[disabled], html.theme--documenter-dark .content kbd.button.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted { + background-color: #ecf0f1; + border-color: transparent; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-loading::after, html.theme--documenter-dark .content kbd.button.is-loading::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-dark.is-outlined, html.theme--documenter-dark .content kbd.button.is-outlined { + background-color: transparent; + border-color: #282f2f; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-outlined.is-focused { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } + html.theme--documenter-dark .button.is-dark.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined { + background-color: transparent; + border-color: #282f2f; + box-shadow: none; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #282f2f #282f2f !important; } + html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: #ecf0f1; + box-shadow: none; + color: #ecf0f1; } + html.theme--documenter-dark .button.is-primary, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { + background-color: #375a7f; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink { + background-color: #335476; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary:focus:not(:active), html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus:not(:active), html.theme--documenter-dark .button.is-primary.is-focused:not(:active), html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink { + background-color: #2f4d6d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-primary[disabled], html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { + background-color: #375a7f; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-primary.is-inverted, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-primary.is-inverted[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-primary.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #375a7f; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #375a7f; + border-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #375a7f #375a7f !important; } + html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-primary.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #375a7f; + box-shadow: none; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #375a7f #375a7f !important; } + html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-link { + background-color: #1abc9c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:hover, html.theme--documenter-dark .button.is-link.is-hovered { + background-color: #18b193; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:focus, html.theme--documenter-dark .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link:focus:not(:active), html.theme--documenter-dark .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link.is-active { + background-color: #17a689; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-link[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link { + background-color: #1abc9c; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-link.is-inverted { + background-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-link.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-link.is-outlined { + background-color: transparent; + border-color: #1abc9c; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-outlined.is-focused { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #1abc9c #1abc9c !important; } + html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-link.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined { + background-color: transparent; + border-color: #1abc9c; + box-shadow: none; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #1abc9c #1abc9c !important; } + html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-info { + background-color: #024c7d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:hover, html.theme--documenter-dark .button.is-info.is-hovered { + background-color: #024470; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:focus, html.theme--documenter-dark .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info:focus:not(:active), html.theme--documenter-dark .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info.is-active { + background-color: #023d64; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-info[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info { + background-color: #024c7d; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-info.is-inverted { + background-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-info.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-info.is-outlined { + background-color: transparent; + border-color: #024c7d; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-outlined.is-focused { + background-color: #024c7d; + border-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #024c7d #024c7d !important; } + html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-info.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined { + background-color: transparent; + border-color: #024c7d; + box-shadow: none; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #024c7d #024c7d !important; } + html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-success { + background-color: #008438; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:hover, html.theme--documenter-dark .button.is-success.is-hovered { + background-color: #007733; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:focus, html.theme--documenter-dark .button.is-success.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success:focus:not(:active), html.theme--documenter-dark .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success.is-active { + background-color: #006b2d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-success[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success { + background-color: #008438; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-success.is-inverted { + background-color: #fff; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-success.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-success.is-outlined { + background-color: transparent; + border-color: #008438; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-outlined.is-focused { + background-color: #008438; + border-color: #008438; + color: #fff; } + html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #008438 #008438 !important; } + html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-success.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined { + background-color: transparent; + border-color: #008438; + box-shadow: none; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #008438; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #008438 #008438 !important; } + html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-warning { + background-color: #ad8100; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:hover, html.theme--documenter-dark .button.is-warning.is-hovered { + background-color: #a07700; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:focus, html.theme--documenter-dark .button.is-warning.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning:focus:not(:active), html.theme--documenter-dark .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning.is-active { + background-color: #946e00; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-warning[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning { + background-color: #ad8100; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-warning.is-inverted { + background-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-warning.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ad8100; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-outlined.is-focused { + background-color: #ad8100; + border-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ad8100 #ad8100 !important; } + html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-warning.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ad8100; + box-shadow: none; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ad8100 #ad8100 !important; } + html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-danger { + background-color: #9e1b0d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:hover, html.theme--documenter-dark .button.is-danger.is-hovered { + background-color: #92190c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:focus, html.theme--documenter-dark .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger:focus:not(:active), html.theme--documenter-dark .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger.is-active { + background-color: #86170b; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .button.is-danger[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger { + background-color: #9e1b0d; + border-color: transparent; + box-shadow: none; } + html.theme--documenter-dark .button.is-danger.is-inverted { + background-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + html.theme--documenter-dark .button.is-danger.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-danger.is-outlined { + background-color: transparent; + border-color: #9e1b0d; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-outlined.is-focused { + background-color: #9e1b0d; + border-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #9e1b0d #9e1b0d !important; } + html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + html.theme--documenter-dark .button.is-danger.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined { + background-color: transparent; + border-color: #9e1b0d; + box-shadow: none; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #9e1b0d #9e1b0d !important; } + html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + html.theme--documenter-dark .button.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .button.is-normal { + font-size: 15px; } + html.theme--documenter-dark .button.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .button.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .button { + background-color: #8c9b9d; + border-color: #dbdee0; + box-shadow: none; + opacity: 0.5; } + html.theme--documenter-dark .button.is-fullwidth { + display: flex; + width: 100%; } + html.theme--documenter-dark .button.is-loading { + color: transparent !important; + pointer-events: none; } + html.theme--documenter-dark .button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; } + html.theme--documenter-dark .button.is-static { + background-color: #282f2f; + border-color: #5e6d6f; + color: #dbdee0; + box-shadow: none; + pointer-events: none; } + html.theme--documenter-dark .button.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .buttons .button { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + html.theme--documenter-dark .buttons:last-child { + margin-bottom: -0.5rem; } + html.theme--documenter-dark .buttons:not(:last-child) { + margin-bottom: 1rem; } + html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + html.theme--documenter-dark .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + html.theme--documenter-dark .buttons.has-addons .button:last-child { + margin-right: 0; } + html.theme--documenter-dark .buttons.has-addons .button:hover, html.theme--documenter-dark .buttons.has-addons .button.is-hovered { + z-index: 2; } + html.theme--documenter-dark .buttons.has-addons .button:focus, html.theme--documenter-dark .buttons.has-addons .button.is-focused, html.theme--documenter-dark .buttons.has-addons .button:active, html.theme--documenter-dark .buttons.has-addons .button.is-active, html.theme--documenter-dark .buttons.has-addons .button.is-selected { + z-index: 3; } + html.theme--documenter-dark .buttons.has-addons .button:focus:hover, html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover, html.theme--documenter-dark .buttons.has-addons .button:active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + html.theme--documenter-dark .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .buttons.is-centered { + justify-content: center; } + html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + html.theme--documenter-dark .buttons.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + html.theme--documenter-dark .container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .container { + max-width: 992px; } + html.theme--documenter-dark .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; } } + @media screen and (max-width: 1215px) { + html.theme--documenter-dark .container.is-widescreen { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + html.theme--documenter-dark .container.is-fullhd { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .container { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .container { + max-width: 1344px; } } + html.theme--documenter-dark .content li + li { + margin-top: 0.25em; } + html.theme--documenter-dark .content p:not(:last-child), + html.theme--documenter-dark .content dl:not(:last-child), + html.theme--documenter-dark .content ol:not(:last-child), + html.theme--documenter-dark .content ul:not(:last-child), + html.theme--documenter-dark .content blockquote:not(:last-child), + html.theme--documenter-dark .content pre:not(:last-child), + html.theme--documenter-dark .content table:not(:last-child) { + margin-bottom: 1em; } + html.theme--documenter-dark .content h1, + html.theme--documenter-dark .content h2, + html.theme--documenter-dark .content h3, + html.theme--documenter-dark .content h4, + html.theme--documenter-dark .content h5, + html.theme--documenter-dark .content h6 { + color: #f2f2f2; + font-weight: 600; + line-height: 1.125; } + html.theme--documenter-dark .content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + html.theme--documenter-dark .content h1:not(:first-child) { + margin-top: 1em; } + html.theme--documenter-dark .content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + html.theme--documenter-dark .content h2:not(:first-child) { + margin-top: 1.1428em; } + html.theme--documenter-dark .content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + html.theme--documenter-dark .content h3:not(:first-child) { + margin-top: 1.3333em; } + html.theme--documenter-dark .content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + html.theme--documenter-dark .content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + html.theme--documenter-dark .content h6 { + font-size: 1em; + margin-bottom: 1em; } + html.theme--documenter-dark .content blockquote { + background-color: #282f2f; + border-left: 5px solid #5e6d6f; + padding: 1.25em 1.5em; } + html.theme--documenter-dark .content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + html.theme--documenter-dark .content ol:not([type]) { + list-style-type: decimal; } + html.theme--documenter-dark .content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; } + html.theme--documenter-dark .content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; } + html.theme--documenter-dark .content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; } + html.theme--documenter-dark .content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; } + html.theme--documenter-dark .content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + html.theme--documenter-dark .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + html.theme--documenter-dark .content ul ul ul { + list-style-type: square; } + html.theme--documenter-dark .content dd { + margin-left: 2em; } + html.theme--documenter-dark .content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + html.theme--documenter-dark .content figure:not(:first-child) { + margin-top: 2em; } + html.theme--documenter-dark .content figure:not(:last-child) { + margin-bottom: 2em; } + html.theme--documenter-dark .content figure img { + display: inline-block; } + html.theme--documenter-dark .content figure figcaption { + font-style: italic; } + html.theme--documenter-dark .content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; } + html.theme--documenter-dark .content sup, + html.theme--documenter-dark .content sub { + font-size: 75%; } + html.theme--documenter-dark .content table { + width: 100%; } + html.theme--documenter-dark .content table td, + html.theme--documenter-dark .content table th { + border: 1px solid #5e6d6f; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + html.theme--documenter-dark .content table th { + color: #f2f2f2; } + html.theme--documenter-dark .content table th:not([align]) { + text-align: left; } + html.theme--documenter-dark .content table thead td, + html.theme--documenter-dark .content table thead th { + border-width: 0 0 2px; + color: #f2f2f2; } + html.theme--documenter-dark .content table tfoot td, + html.theme--documenter-dark .content table tfoot th { + border-width: 2px 0 0; + color: #f2f2f2; } + html.theme--documenter-dark .content table tbody tr:last-child td, + html.theme--documenter-dark .content table tbody tr:last-child th { + border-bottom-width: 0; } + html.theme--documenter-dark .content .tabs li + li { + margin-top: 0; } + html.theme--documenter-dark .content.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.content { + font-size: 0.85em; } + html.theme--documenter-dark .content.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .content.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + html.theme--documenter-dark .icon.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.icon { + height: 1rem; + width: 1rem; } + html.theme--documenter-dark .icon.is-medium { + height: 2rem; + width: 2rem; } + html.theme--documenter-dark .icon.is-large { + height: 3rem; + width: 3rem; } + html.theme--documenter-dark .image, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { + display: block; + position: relative; } + html.theme--documenter-dark .image img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img { + display: block; + height: auto; + width: 100%; } + html.theme--documenter-dark .image img.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img.is-rounded { + border-radius: 290486px; } + html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, + html.theme--documenter-dark .image.is-square .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, + html.theme--documenter-dark .image.is-1by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, + html.theme--documenter-dark .image.is-5by4 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, + html.theme--documenter-dark .image.is-4by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, + html.theme--documenter-dark .image.is-3by2 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, + html.theme--documenter-dark .image.is-5by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, + html.theme--documenter-dark .image.is-16by9 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, + html.theme--documenter-dark .image.is-2by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, + html.theme--documenter-dark .image.is-3by1 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, + html.theme--documenter-dark .image.is-4by5 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, + html.theme--documenter-dark .image.is-3by4 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, + html.theme--documenter-dark .image.is-2by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, + html.theme--documenter-dark .image.is-3by5 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, + html.theme--documenter-dark .image.is-9by16 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, + html.theme--documenter-dark .image.is-1by2 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, + html.theme--documenter-dark .image.is-1by3 .has-ratio, + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + html.theme--documenter-dark .image.is-square, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square, html.theme--documenter-dark .image.is-1by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 { + padding-top: 100%; } + html.theme--documenter-dark .image.is-5by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 { + padding-top: 80%; } + html.theme--documenter-dark .image.is-4by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 { + padding-top: 75%; } + html.theme--documenter-dark .image.is-3by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 { + padding-top: 66.6666%; } + html.theme--documenter-dark .image.is-5by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 { + padding-top: 60%; } + html.theme--documenter-dark .image.is-16by9, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 { + padding-top: 56.25%; } + html.theme--documenter-dark .image.is-2by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 { + padding-top: 50%; } + html.theme--documenter-dark .image.is-3by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 { + padding-top: 33.3333%; } + html.theme--documenter-dark .image.is-4by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 { + padding-top: 125%; } + html.theme--documenter-dark .image.is-3by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 { + padding-top: 133.3333%; } + html.theme--documenter-dark .image.is-2by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 { + padding-top: 150%; } + html.theme--documenter-dark .image.is-3by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 { + padding-top: 166.6666%; } + html.theme--documenter-dark .image.is-9by16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 { + padding-top: 177.7777%; } + html.theme--documenter-dark .image.is-1by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 { + padding-top: 200%; } + html.theme--documenter-dark .image.is-1by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 { + padding-top: 300%; } + html.theme--documenter-dark .image.is-16x16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16x16 { + height: 16px; + width: 16px; } + html.theme--documenter-dark .image.is-24x24, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-24x24 { + height: 24px; + width: 24px; } + html.theme--documenter-dark .image.is-32x32, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-32x32 { + height: 32px; + width: 32px; } + html.theme--documenter-dark .image.is-48x48, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-48x48 { + height: 48px; + width: 48px; } + html.theme--documenter-dark .image.is-64x64, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-64x64 { + height: 64px; + width: 64px; } + html.theme--documenter-dark .image.is-96x96, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-96x96 { + height: 96px; + width: 96px; } + html.theme--documenter-dark .image.is-128x128, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-128x128 { + height: 128px; + width: 128px; } + html.theme--documenter-dark .notification { + background-color: #282f2f; + border-radius: 0.4em; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; } + html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + html.theme--documenter-dark .notification strong { + color: currentColor; } + html.theme--documenter-dark .notification code, + html.theme--documenter-dark .notification pre { + background: white; } + html.theme--documenter-dark .notification pre code { + background: transparent; } + html.theme--documenter-dark .notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; } + html.theme--documenter-dark .notification .title, + html.theme--documenter-dark .notification .subtitle, + html.theme--documenter-dark .notification .content { + color: currentColor; } + html.theme--documenter-dark .notification.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .notification.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .notification.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .notification.is-dark, html.theme--documenter-dark .content kbd.notification { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .notification.is-primary, html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .notification.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .notification.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .notification.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .notification.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .notification.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 15px; + overflow: hidden; + padding: 0; + width: 100%; } + html.theme--documenter-dark .progress::-webkit-progress-bar { + background-color: #5e6d6f; } + html.theme--documenter-dark .progress::-webkit-progress-value { + background-color: #dbdee0; } + html.theme--documenter-dark .progress::-moz-progress-bar { + background-color: #dbdee0; } + html.theme--documenter-dark .progress::-ms-fill { + background-color: #dbdee0; + border: none; } + html.theme--documenter-dark .progress.is-white::-webkit-progress-value { + background-color: white; } + html.theme--documenter-dark .progress.is-white::-moz-progress-bar { + background-color: white; } + html.theme--documenter-dark .progress.is-white::-ms-fill { + background-color: white; } + html.theme--documenter-dark .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + html.theme--documenter-dark .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-light::-webkit-progress-value { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light::-moz-progress-bar { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light::-ms-fill { + background-color: #ecf0f1; } + html.theme--documenter-dark .progress.is-light:indeterminate { + background-image: linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-dark::-webkit-progress-value, html.theme--documenter-dark .content kbd.progress::-webkit-progress-value { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark::-moz-progress-bar, html.theme--documenter-dark .content kbd.progress::-moz-progress-bar { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark::-ms-fill, html.theme--documenter-dark .content kbd.progress::-ms-fill { + background-color: #282f2f; } + html.theme--documenter-dark .progress.is-dark:indeterminate, html.theme--documenter-dark .content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #282f2f 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-primary::-webkit-progress-value, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary::-moz-progress-bar, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary::-ms-fill, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-ms-fill { + background-color: #375a7f; } + html.theme--documenter-dark .progress.is-primary:indeterminate, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #375a7f 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-link::-webkit-progress-value { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link::-moz-progress-bar { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link::-ms-fill { + background-color: #1abc9c; } + html.theme--documenter-dark .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-info::-webkit-progress-value { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info::-moz-progress-bar { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info::-ms-fill { + background-color: #024c7d; } + html.theme--documenter-dark .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #024c7d 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-success::-webkit-progress-value { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success::-moz-progress-bar { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success::-ms-fill { + background-color: #008438; } + html.theme--documenter-dark .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #008438 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-warning::-webkit-progress-value { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning::-moz-progress-bar { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning::-ms-fill { + background-color: #ad8100; } + html.theme--documenter-dark .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ad8100 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress.is-danger::-webkit-progress-value { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger::-moz-progress-bar { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger::-ms-fill { + background-color: #9e1b0d; } + html.theme--documenter-dark .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%); } + html.theme--documenter-dark .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #5e6d6f; + background-image: linear-gradient(to right, #fff 30%, #5e6d6f 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + html.theme--documenter-dark .progress.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.progress { + height: 0.85em; } + html.theme--documenter-dark .progress.is-medium { + height: 1.25rem; } + html.theme--documenter-dark .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + html.theme--documenter-dark .table { + background-color: #343c3d; + color: #fff; } + html.theme--documenter-dark .table td, + html.theme--documenter-dark .table th { + border: 1px solid #5e6d6f; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + html.theme--documenter-dark .table td.is-white, + html.theme--documenter-dark .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .table td.is-black, + html.theme--documenter-dark .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .table td.is-light, + html.theme--documenter-dark .table th.is-light { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .table td.is-dark, + html.theme--documenter-dark .table th.is-dark { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .table td.is-primary, + html.theme--documenter-dark .table th.is-primary { + background-color: #375a7f; + border-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table td.is-link, + html.theme--documenter-dark .table th.is-link { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .table td.is-info, + html.theme--documenter-dark .table th.is-info { + background-color: #024c7d; + border-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .table td.is-success, + html.theme--documenter-dark .table th.is-success { + background-color: #008438; + border-color: #008438; + color: #fff; } + html.theme--documenter-dark .table td.is-warning, + html.theme--documenter-dark .table th.is-warning { + background-color: #ad8100; + border-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .table td.is-danger, + html.theme--documenter-dark .table th.is-danger { + background-color: #9e1b0d; + border-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .table td.is-narrow, + html.theme--documenter-dark .table th.is-narrow { + white-space: nowrap; + width: 1%; } + html.theme--documenter-dark .table td.is-selected, + html.theme--documenter-dark .table th.is-selected { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table td.is-selected a, + html.theme--documenter-dark .table td.is-selected strong, + html.theme--documenter-dark .table th.is-selected a, + html.theme--documenter-dark .table th.is-selected strong { + color: currentColor; } + html.theme--documenter-dark .table th { + color: #f2f2f2; } + html.theme--documenter-dark .table th:not([align]) { + text-align: left; } + html.theme--documenter-dark .table tr.is-selected { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .table tr.is-selected a, + html.theme--documenter-dark .table tr.is-selected strong { + color: currentColor; } + html.theme--documenter-dark .table tr.is-selected td, + html.theme--documenter-dark .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + html.theme--documenter-dark .table thead { + background-color: transparent; } + html.theme--documenter-dark .table thead td, + html.theme--documenter-dark .table thead th { + border-width: 0 0 2px; + color: #f2f2f2; } + html.theme--documenter-dark .table tfoot { + background-color: transparent; } + html.theme--documenter-dark .table tfoot td, + html.theme--documenter-dark .table tfoot th { + border-width: 2px 0 0; + color: #f2f2f2; } + html.theme--documenter-dark .table tbody { + background-color: transparent; } + html.theme--documenter-dark .table tbody tr:last-child td, + html.theme--documenter-dark .table tbody tr:last-child th { + border-bottom-width: 0; } + html.theme--documenter-dark .table.is-bordered td, + html.theme--documenter-dark .table.is-bordered th { + border-width: 1px; } + html.theme--documenter-dark .table.is-bordered tr:last-child td, + html.theme--documenter-dark .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + html.theme--documenter-dark .table.is-fullwidth { + width: 100%; } + html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #282f2f; } + html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #282f2f; } + html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #2d3435; } + html.theme--documenter-dark .table.is-narrow td, + html.theme--documenter-dark .table.is-narrow th { + padding: 0.25em 0.5em; } + html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #282f2f; } + html.theme--documenter-dark .table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + html.theme--documenter-dark .tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .tags .tag, html.theme--documenter-dark .tags .content kbd, html.theme--documenter-dark .content .tags kbd, html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .tags .tag:not(:last-child), html.theme--documenter-dark .tags .content kbd:not(:last-child), html.theme--documenter-dark .content .tags kbd:not(:last-child), html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; } + html.theme--documenter-dark .tags:last-child { + margin-bottom: -0.5rem; } + html.theme--documenter-dark .tags:not(:last-child) { + margin-bottom: 1rem; } + html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 15px; } + html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + html.theme--documenter-dark .tags.is-centered { + justify-content: center; } + html.theme--documenter-dark .tags.is-centered .tag, html.theme--documenter-dark .tags.is-centered .content kbd, html.theme--documenter-dark .content .tags.is-centered kbd, html.theme--documenter-dark .tags.is-centered .docstring > section > a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; } + html.theme--documenter-dark .tags.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .tags.is-right .tag:not(:first-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; } + html.theme--documenter-dark .tags.is-right .tag:not(:last-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0; } + html.theme--documenter-dark .tags.has-addons .tag, html.theme--documenter-dark .tags.has-addons .content kbd, html.theme--documenter-dark .content .tags.has-addons kbd, html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink { + margin-right: 0; } + html.theme--documenter-dark .tags.has-addons .tag:not(:first-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .tags.has-addons .tag:not(:last-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .tag:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { + align-items: center; + background-color: #282f2f; + border-radius: 0.4em; + color: #fff; + display: inline-flex; + font-size: 0.85em; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + html.theme--documenter-dark .tag:not(body) .delete, html.theme--documenter-dark .content kbd:not(body) .delete, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + html.theme--documenter-dark .tag.is-white:not(body), html.theme--documenter-dark .content kbd.is-white:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-white:not(body) { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .tag.is-black:not(body), html.theme--documenter-dark .content kbd.is-black:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .tag.is-light:not(body), html.theme--documenter-dark .content kbd.is-light:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-light:not(body) { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .tag.is-dark:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-dark:not(body), html.theme--documenter-dark .content .docstring > section > kbd:not(body) { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .tag.is-primary:not(body), html.theme--documenter-dark .content kbd.is-primary:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .tag.is-link:not(body), html.theme--documenter-dark .content kbd.is-link:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-link:not(body) { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .tag.is-info:not(body), html.theme--documenter-dark .content kbd.is-info:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-info:not(body) { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .tag.is-success:not(body), html.theme--documenter-dark .content kbd.is-success:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-success:not(body) { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .tag.is-warning:not(body), html.theme--documenter-dark .content kbd.is-warning:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-warning:not(body) { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .tag.is-danger:not(body), html.theme--documenter-dark .content kbd.is-danger:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-danger:not(body) { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .tag.is-normal:not(body), html.theme--documenter-dark .content kbd.is-normal:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-normal:not(body) { + font-size: 0.85em; } + html.theme--documenter-dark .tag.is-medium:not(body), html.theme--documenter-dark .content kbd.is-medium:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-medium:not(body) { + font-size: 15px; } + html.theme--documenter-dark .tag.is-large:not(body), html.theme--documenter-dark .content kbd.is-large:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; } + html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child, html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + html.theme--documenter-dark .tag.is-delete:not(body), html.theme--documenter-dark .content kbd.is-delete:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; } + html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; } + html.theme--documenter-dark .tag.is-delete:not(body):hover, html.theme--documenter-dark .content kbd.is-delete:not(body):hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, html.theme--documenter-dark .tag.is-delete:not(body):focus, html.theme--documenter-dark .content kbd.is-delete:not(body):focus, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { + background-color: #1d2122; } + html.theme--documenter-dark .tag.is-delete:not(body):active, html.theme--documenter-dark .content kbd.is-delete:not(body):active, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):active { + background-color: #111414; } + html.theme--documenter-dark .tag.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:not(body), html.theme--documenter-dark .content kbd.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; } + html.theme--documenter-dark a.tag:hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:hover { + text-decoration: underline; } + html.theme--documenter-dark .title, + html.theme--documenter-dark .subtitle { + word-break: break-word; } + html.theme--documenter-dark .title em, + html.theme--documenter-dark .title span, + html.theme--documenter-dark .subtitle em, + html.theme--documenter-dark .subtitle span { + font-weight: inherit; } + html.theme--documenter-dark .title sub, + html.theme--documenter-dark .subtitle sub { + font-size: 0.75em; } + html.theme--documenter-dark .title sup, + html.theme--documenter-dark .subtitle sup { + font-size: 0.75em; } + html.theme--documenter-dark .title .tag, html.theme--documenter-dark .title .content kbd, html.theme--documenter-dark .content .title kbd, html.theme--documenter-dark .title .docstring > section > a.docs-sourcelink, + html.theme--documenter-dark .subtitle .tag, + html.theme--documenter-dark .subtitle .content kbd, + html.theme--documenter-dark .content .subtitle kbd, + html.theme--documenter-dark .subtitle .docstring > section > a.docs-sourcelink { + vertical-align: middle; } + html.theme--documenter-dark .title { + color: #fff; + font-size: 2rem; + font-weight: 500; + line-height: 1.125; } + html.theme--documenter-dark .title strong { + color: inherit; + font-weight: inherit; } + html.theme--documenter-dark .title + .highlight { + margin-top: -0.75rem; } + html.theme--documenter-dark .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + html.theme--documenter-dark .title.is-1 { + font-size: 3rem; } + html.theme--documenter-dark .title.is-2 { + font-size: 2.5rem; } + html.theme--documenter-dark .title.is-3 { + font-size: 2rem; } + html.theme--documenter-dark .title.is-4 { + font-size: 1.5rem; } + html.theme--documenter-dark .title.is-5 { + font-size: 1.25rem; } + html.theme--documenter-dark .title.is-6 { + font-size: 15px; } + html.theme--documenter-dark .title.is-7 { + font-size: 0.85em; } + html.theme--documenter-dark .subtitle { + color: #8c9b9d; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + html.theme--documenter-dark .subtitle strong { + color: #8c9b9d; + font-weight: 600; } + html.theme--documenter-dark .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + html.theme--documenter-dark .subtitle.is-1 { + font-size: 3rem; } + html.theme--documenter-dark .subtitle.is-2 { + font-size: 2.5rem; } + html.theme--documenter-dark .subtitle.is-3 { + font-size: 2rem; } + html.theme--documenter-dark .subtitle.is-4 { + font-size: 1.5rem; } + html.theme--documenter-dark .subtitle.is-5 { + font-size: 1.25rem; } + html.theme--documenter-dark .subtitle.is-6 { + font-size: 15px; } + html.theme--documenter-dark .subtitle.is-7 { + font-size: 0.85em; } + html.theme--documenter-dark .heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + html.theme--documenter-dark .highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; } + html.theme--documenter-dark .highlight pre { + overflow: auto; + max-width: 100%; } + html.theme--documenter-dark .number { + align-items: center; + background-color: #282f2f; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + background-color: #1f2424; + border-color: #5e6d6f; + border-radius: 0.4em; + color: #dbdee0; } + html.theme--documenter-dark .select select::-moz-placeholder, html.theme--documenter-dark .textarea::-moz-placeholder, html.theme--documenter-dark .input::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select::-webkit-input-placeholder, html.theme--documenter-dark .textarea::-webkit-input-placeholder, html.theme--documenter-dark .input::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:-moz-placeholder, html.theme--documenter-dark .textarea:-moz-placeholder, html.theme--documenter-dark .input:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:-ms-input-placeholder, html.theme--documenter-dark .textarea:-ms-input-placeholder, html.theme--documenter-dark .input:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(219, 222, 224, 0.3); } + html.theme--documenter-dark .select select:hover, html.theme--documenter-dark .textarea:hover, html.theme--documenter-dark .input:hover, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:hover, html.theme--documenter-dark .select select.is-hovered, html.theme--documenter-dark .is-hovered.textarea, html.theme--documenter-dark .is-hovered.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-hovered { + border-color: #8c9b9d; } + html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + border-color: #1abc9c; + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + background-color: #8c9b9d; + border-color: #282f2f; + box-shadow: none; + color: white; } + html.theme--documenter-dark .select select[disabled]::-moz-placeholder, html.theme--documenter-dark .textarea[disabled]::-moz-placeholder, html.theme--documenter-dark .input[disabled]::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]:-moz-placeholder, html.theme--documenter-dark .textarea[disabled]:-moz-placeholder, html.theme--documenter-dark .input[disabled]:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder, html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder, html.theme--documenter-dark .input[disabled]:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.3); } + html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; } + html.theme--documenter-dark .textarea[readonly], html.theme--documenter-dark .input[readonly], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[readonly] { + box-shadow: none; } + html.theme--documenter-dark .is-white.textarea, html.theme--documenter-dark .is-white.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white { + border-color: white; } + html.theme--documenter-dark .is-white.textarea:focus, html.theme--documenter-dark .is-white.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:focus, html.theme--documenter-dark .is-white.is-focused.textarea, html.theme--documenter-dark .is-white.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-white.textarea:active, html.theme--documenter-dark .is-white.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:active, html.theme--documenter-dark .is-white.is-active.textarea, html.theme--documenter-dark .is-white.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .is-black.textarea, html.theme--documenter-dark .is-black.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black { + border-color: #0a0a0a; } + html.theme--documenter-dark .is-black.textarea:focus, html.theme--documenter-dark .is-black.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:focus, html.theme--documenter-dark .is-black.is-focused.textarea, html.theme--documenter-dark .is-black.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-black.textarea:active, html.theme--documenter-dark .is-black.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:active, html.theme--documenter-dark .is-black.is-active.textarea, html.theme--documenter-dark .is-black.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .is-light.textarea, html.theme--documenter-dark .is-light.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light { + border-color: #ecf0f1; } + html.theme--documenter-dark .is-light.textarea:focus, html.theme--documenter-dark .is-light.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:focus, html.theme--documenter-dark .is-light.is-focused.textarea, html.theme--documenter-dark .is-light.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-light.textarea:active, html.theme--documenter-dark .is-light.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:active, html.theme--documenter-dark .is-light.is-active.textarea, html.theme--documenter-dark .is-light.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .is-dark.textarea, html.theme--documenter-dark .content kbd.textarea, html.theme--documenter-dark .is-dark.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark, html.theme--documenter-dark .content kbd.input { + border-color: #282f2f; } + html.theme--documenter-dark .is-dark.textarea:focus, html.theme--documenter-dark .content kbd.textarea:focus, html.theme--documenter-dark .is-dark.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:focus, html.theme--documenter-dark .content kbd.input:focus, html.theme--documenter-dark .is-dark.is-focused.textarea, html.theme--documenter-dark .content kbd.is-focused.textarea, html.theme--documenter-dark .is-dark.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .content kbd.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-focused, html.theme--documenter-dark .is-dark.textarea:active, html.theme--documenter-dark .content kbd.textarea:active, html.theme--documenter-dark .is-dark.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:active, html.theme--documenter-dark .content kbd.input:active, html.theme--documenter-dark .is-dark.is-active.textarea, html.theme--documenter-dark .content kbd.is-active.textarea, html.theme--documenter-dark .is-dark.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .content kbd.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .is-primary.textarea, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink { + border-color: #375a7f; } + html.theme--documenter-dark .is-primary.textarea:focus, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:focus, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.is-focused.textarea, html.theme--documenter-dark .docstring > section > a.is-focused.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .docstring > section > a.is-focused.input.docs-sourcelink, html.theme--documenter-dark .is-primary.textarea:active, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:active, html.theme--documenter-dark .is-primary.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:active, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:active, html.theme--documenter-dark .is-primary.is-active.textarea, html.theme--documenter-dark .docstring > section > a.is-active.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .docstring > section > a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .is-link.textarea, html.theme--documenter-dark .is-link.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link { + border-color: #1abc9c; } + html.theme--documenter-dark .is-link.textarea:focus, html.theme--documenter-dark .is-link.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:focus, html.theme--documenter-dark .is-link.is-focused.textarea, html.theme--documenter-dark .is-link.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-link.textarea:active, html.theme--documenter-dark .is-link.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:active, html.theme--documenter-dark .is-link.is-active.textarea, html.theme--documenter-dark .is-link.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .is-info.textarea, html.theme--documenter-dark .is-info.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info { + border-color: #024c7d; } + html.theme--documenter-dark .is-info.textarea:focus, html.theme--documenter-dark .is-info.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:focus, html.theme--documenter-dark .is-info.is-focused.textarea, html.theme--documenter-dark .is-info.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-info.textarea:active, html.theme--documenter-dark .is-info.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:active, html.theme--documenter-dark .is-info.is-active.textarea, html.theme--documenter-dark .is-info.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .is-success.textarea, html.theme--documenter-dark .is-success.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success { + border-color: #008438; } + html.theme--documenter-dark .is-success.textarea:focus, html.theme--documenter-dark .is-success.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:focus, html.theme--documenter-dark .is-success.is-focused.textarea, html.theme--documenter-dark .is-success.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-success.textarea:active, html.theme--documenter-dark .is-success.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:active, html.theme--documenter-dark .is-success.is-active.textarea, html.theme--documenter-dark .is-success.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .is-warning.textarea, html.theme--documenter-dark .is-warning.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning { + border-color: #ad8100; } + html.theme--documenter-dark .is-warning.textarea:focus, html.theme--documenter-dark .is-warning.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:focus, html.theme--documenter-dark .is-warning.is-focused.textarea, html.theme--documenter-dark .is-warning.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-warning.textarea:active, html.theme--documenter-dark .is-warning.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:active, html.theme--documenter-dark .is-warning.is-active.textarea, html.theme--documenter-dark .is-warning.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .is-danger.textarea, html.theme--documenter-dark .is-danger.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger { + border-color: #9e1b0d; } + html.theme--documenter-dark .is-danger.textarea:focus, html.theme--documenter-dark .is-danger.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:focus, html.theme--documenter-dark .is-danger.is-focused.textarea, html.theme--documenter-dark .is-danger.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-danger.textarea:active, html.theme--documenter-dark .is-danger.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:active, html.theme--documenter-dark .is-danger.is-active.textarea, html.theme--documenter-dark .is-danger.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .is-small.textarea, html.theme--documenter-dark .is-small.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .is-medium.textarea, html.theme--documenter-dark .is-medium.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .is-large.textarea, html.theme--documenter-dark .is-large.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .is-fullwidth.textarea, html.theme--documenter-dark .is-fullwidth.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-fullwidth { + display: block; + width: 100%; } + html.theme--documenter-dark .is-inline.textarea, html.theme--documenter-dark .is-inline.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-inline { + display: inline; + width: auto; } + html.theme--documenter-dark .input.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .input.is-static, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + html.theme--documenter-dark .textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; } + html.theme--documenter-dark .textarea:not([rows]) { + max-height: 600px; + min-height: 120px; } + html.theme--documenter-dark .textarea[rows] { + height: initial; } + html.theme--documenter-dark .textarea.has-fixed-size { + resize: none; } + html.theme--documenter-dark .radio, html.theme--documenter-dark .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + html.theme--documenter-dark .radio input, html.theme--documenter-dark .checkbox input { + cursor: pointer; } + html.theme--documenter-dark .radio:hover, html.theme--documenter-dark .checkbox:hover { + color: #8c9b9d; } + html.theme--documenter-dark .radio[disabled], html.theme--documenter-dark .checkbox[disabled], fieldset[disabled] html.theme--documenter-dark .radio, fieldset[disabled] html.theme--documenter-dark .checkbox { + color: white; + cursor: not-allowed; } + html.theme--documenter-dark .radio + .radio { + margin-left: 0.5em; } + html.theme--documenter-dark .select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + html.theme--documenter-dark .select:not(.is-multiple) { + height: 2.25em; } + html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { + border-color: #1abc9c; + right: 1.125em; + z-index: 4; } + html.theme--documenter-dark .select.is-rounded select, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select select { + border-radius: 290486px; + padding-left: 1em; } + html.theme--documenter-dark .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + html.theme--documenter-dark .select select::-ms-expand { + display: none; } + html.theme--documenter-dark .select select[disabled]:hover, fieldset[disabled] html.theme--documenter-dark .select select:hover { + border-color: #282f2f; } + html.theme--documenter-dark .select select:not([multiple]) { + padding-right: 2.5em; } + html.theme--documenter-dark .select select[multiple] { + height: auto; + padding: 0; } + html.theme--documenter-dark .select select[multiple] option { + padding: 0.5em 1em; } + html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #8c9b9d; } + html.theme--documenter-dark .select.is-white:not(:hover)::after { + border-color: white; } + html.theme--documenter-dark .select.is-white select { + border-color: white; } + html.theme--documenter-dark .select.is-white select:hover, html.theme--documenter-dark .select.is-white select.is-hovered { + border-color: #f2f2f2; } + html.theme--documenter-dark .select.is-white select:focus, html.theme--documenter-dark .select.is-white select.is-focused, html.theme--documenter-dark .select.is-white select:active, html.theme--documenter-dark .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + html.theme--documenter-dark .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .select.is-black select { + border-color: #0a0a0a; } + html.theme--documenter-dark .select.is-black select:hover, html.theme--documenter-dark .select.is-black select.is-hovered { + border-color: black; } + html.theme--documenter-dark .select.is-black select:focus, html.theme--documenter-dark .select.is-black select.is-focused, html.theme--documenter-dark .select.is-black select:active, html.theme--documenter-dark .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + html.theme--documenter-dark .select.is-light:not(:hover)::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .select.is-light select { + border-color: #ecf0f1; } + html.theme--documenter-dark .select.is-light select:hover, html.theme--documenter-dark .select.is-light select.is-hovered { + border-color: #dde4e6; } + html.theme--documenter-dark .select.is-light select:focus, html.theme--documenter-dark .select.is-light select.is-focused, html.theme--documenter-dark .select.is-light select:active, html.theme--documenter-dark .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } + html.theme--documenter-dark .select.is-dark:not(:hover)::after, html.theme--documenter-dark .content kbd.select:not(:hover)::after { + border-color: #282f2f; } + html.theme--documenter-dark .select.is-dark select, html.theme--documenter-dark .content kbd.select select { + border-color: #282f2f; } + html.theme--documenter-dark .select.is-dark select:hover, html.theme--documenter-dark .content kbd.select select:hover, html.theme--documenter-dark .select.is-dark select.is-hovered, html.theme--documenter-dark .content kbd.select select.is-hovered { + border-color: #1d2122; } + html.theme--documenter-dark .select.is-dark select:focus, html.theme--documenter-dark .content kbd.select select:focus, html.theme--documenter-dark .select.is-dark select.is-focused, html.theme--documenter-dark .content kbd.select select.is-focused, html.theme--documenter-dark .select.is-dark select:active, html.theme--documenter-dark .content kbd.select select:active, html.theme--documenter-dark .select.is-dark select.is-active, html.theme--documenter-dark .content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } + html.theme--documenter-dark .select.is-primary:not(:hover)::after, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink:not(:hover)::after { + border-color: #375a7f; } + html.theme--documenter-dark .select.is-primary select, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select { + border-color: #375a7f; } + html.theme--documenter-dark .select.is-primary select:hover, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:hover, html.theme--documenter-dark .select.is-primary select.is-hovered, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-hovered { + border-color: #2f4d6d; } + html.theme--documenter-dark .select.is-primary select:focus, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:focus, html.theme--documenter-dark .select.is-primary select.is-focused, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-focused, html.theme--documenter-dark .select.is-primary select:active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:active, html.theme--documenter-dark .select.is-primary select.is-active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } + html.theme--documenter-dark .select.is-link:not(:hover)::after { + border-color: #1abc9c; } + html.theme--documenter-dark .select.is-link select { + border-color: #1abc9c; } + html.theme--documenter-dark .select.is-link select:hover, html.theme--documenter-dark .select.is-link select.is-hovered { + border-color: #17a689; } + html.theme--documenter-dark .select.is-link select:focus, html.theme--documenter-dark .select.is-link select.is-focused, html.theme--documenter-dark .select.is-link select:active, html.theme--documenter-dark .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } + html.theme--documenter-dark .select.is-info:not(:hover)::after { + border-color: #024c7d; } + html.theme--documenter-dark .select.is-info select { + border-color: #024c7d; } + html.theme--documenter-dark .select.is-info select:hover, html.theme--documenter-dark .select.is-info select.is-hovered { + border-color: #023d64; } + html.theme--documenter-dark .select.is-info select:focus, html.theme--documenter-dark .select.is-info select.is-focused, html.theme--documenter-dark .select.is-info select:active, html.theme--documenter-dark .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } + html.theme--documenter-dark .select.is-success:not(:hover)::after { + border-color: #008438; } + html.theme--documenter-dark .select.is-success select { + border-color: #008438; } + html.theme--documenter-dark .select.is-success select:hover, html.theme--documenter-dark .select.is-success select.is-hovered { + border-color: #006b2d; } + html.theme--documenter-dark .select.is-success select:focus, html.theme--documenter-dark .select.is-success select.is-focused, html.theme--documenter-dark .select.is-success select:active, html.theme--documenter-dark .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } + html.theme--documenter-dark .select.is-warning:not(:hover)::after { + border-color: #ad8100; } + html.theme--documenter-dark .select.is-warning select { + border-color: #ad8100; } + html.theme--documenter-dark .select.is-warning select:hover, html.theme--documenter-dark .select.is-warning select.is-hovered { + border-color: #946e00; } + html.theme--documenter-dark .select.is-warning select:focus, html.theme--documenter-dark .select.is-warning select.is-focused, html.theme--documenter-dark .select.is-warning select:active, html.theme--documenter-dark .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } + html.theme--documenter-dark .select.is-danger:not(:hover)::after { + border-color: #9e1b0d; } + html.theme--documenter-dark .select.is-danger select { + border-color: #9e1b0d; } + html.theme--documenter-dark .select.is-danger select:hover, html.theme--documenter-dark .select.is-danger select.is-hovered { + border-color: #86170b; } + html.theme--documenter-dark .select.is-danger select:focus, html.theme--documenter-dark .select.is-danger select.is-focused, html.theme--documenter-dark .select.is-danger select:active, html.theme--documenter-dark .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } + html.theme--documenter-dark .select.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select { + border-radius: 3px; + font-size: 0.85em; } + html.theme--documenter-dark .select.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .select.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .select.is-disabled::after { + border-color: white; } + html.theme--documenter-dark .select.is-fullwidth { + width: 100%; } + html.theme--documenter-dark .select.is-fullwidth select { + width: 100%; } + html.theme--documenter-dark .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + html.theme--documenter-dark .select.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.85em; } + html.theme--documenter-dark .select.is-loading.is-medium:after { + font-size: 1.25rem; } + html.theme--documenter-dark .select.is-loading.is-large:after { + font-size: 1.5rem; } + html.theme--documenter-dark .file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + html.theme--documenter-dark .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:hover .file-cta, html.theme--documenter-dark .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:focus .file-cta, html.theme--documenter-dark .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + html.theme--documenter-dark .file.is-white:active .file-cta, html.theme--documenter-dark .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + html.theme--documenter-dark .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-black:hover .file-cta, html.theme--documenter-dark .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-black:focus .file-cta, html.theme--documenter-dark .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + html.theme--documenter-dark .file.is-black:active .file-cta, html.theme--documenter-dark .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + html.theme--documenter-dark .file.is-light .file-cta { + background-color: #ecf0f1; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-light:hover .file-cta, html.theme--documenter-dark .file.is-light.is-hovered .file-cta { + background-color: #e5eaec; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-light:focus .file-cta, html.theme--documenter-dark .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(236, 240, 241, 0.25); + color: #282f2f; } + html.theme--documenter-dark .file.is-light:active .file-cta, html.theme--documenter-dark .file.is-light.is-active .file-cta { + background-color: #dde4e6; + border-color: transparent; + color: #282f2f; } + html.theme--documenter-dark .file.is-dark .file-cta, html.theme--documenter-dark .content kbd.file .file-cta { + background-color: #282f2f; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:hover .file-cta, html.theme--documenter-dark .content kbd.file:hover .file-cta, html.theme--documenter-dark .file.is-dark.is-hovered .file-cta, html.theme--documenter-dark .content kbd.file.is-hovered .file-cta { + background-color: #232829; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:focus .file-cta, html.theme--documenter-dark .content kbd.file:focus .file-cta, html.theme--documenter-dark .file.is-dark.is-focused .file-cta, html.theme--documenter-dark .content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(40, 47, 47, 0.25); + color: #ecf0f1; } + html.theme--documenter-dark .file.is-dark:active .file-cta, html.theme--documenter-dark .content kbd.file:active .file-cta, html.theme--documenter-dark .file.is-dark.is-active .file-cta, html.theme--documenter-dark .content kbd.file.is-active .file-cta { + background-color: #1d2122; + border-color: transparent; + color: #ecf0f1; } + html.theme--documenter-dark .file.is-primary .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink .file-cta { + background-color: #375a7f; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-primary:hover .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:hover .file-cta, html.theme--documenter-dark .file.is-primary.is-hovered .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #335476; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-primary:focus .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:focus .file-cta, html.theme--documenter-dark .file.is-primary.is-focused .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(55, 90, 127, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-primary:active .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:active .file-cta, html.theme--documenter-dark .file.is-primary.is-active .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-active.docs-sourcelink .file-cta { + background-color: #2f4d6d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link .file-cta { + background-color: #1abc9c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link:hover .file-cta, html.theme--documenter-dark .file.is-link.is-hovered .file-cta { + background-color: #18b193; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-link:focus .file-cta, html.theme--documenter-dark .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(26, 188, 156, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-link:active .file-cta, html.theme--documenter-dark .file.is-link.is-active .file-cta { + background-color: #17a689; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info .file-cta { + background-color: #024c7d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info:hover .file-cta, html.theme--documenter-dark .file.is-info.is-hovered .file-cta { + background-color: #024470; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-info:focus .file-cta, html.theme--documenter-dark .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(2, 76, 125, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-info:active .file-cta, html.theme--documenter-dark .file.is-info.is-active .file-cta { + background-color: #023d64; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success .file-cta { + background-color: #008438; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success:hover .file-cta, html.theme--documenter-dark .file.is-success.is-hovered .file-cta { + background-color: #007733; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-success:focus .file-cta, html.theme--documenter-dark .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0, 132, 56, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-success:active .file-cta, html.theme--documenter-dark .file.is-success.is-active .file-cta { + background-color: #006b2d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning .file-cta { + background-color: #ad8100; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning:hover .file-cta, html.theme--documenter-dark .file.is-warning.is-hovered .file-cta { + background-color: #a07700; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-warning:focus .file-cta, html.theme--documenter-dark .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(173, 129, 0, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-warning:active .file-cta, html.theme--documenter-dark .file.is-warning.is-active .file-cta { + background-color: #946e00; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger .file-cta { + background-color: #9e1b0d; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger:hover .file-cta, html.theme--documenter-dark .file.is-danger.is-hovered .file-cta { + background-color: #92190c; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-danger:focus .file-cta, html.theme--documenter-dark .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(158, 27, 13, 0.25); + color: #fff; } + html.theme--documenter-dark .file.is-danger:active .file-cta, html.theme--documenter-dark .file.is-danger.is-active .file-cta { + background-color: #86170b; + border-color: transparent; + color: #fff; } + html.theme--documenter-dark .file.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.file { + font-size: 0.85em; } + html.theme--documenter-dark .file.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .file.is-medium .file-icon .fa { + font-size: 21px; } + html.theme--documenter-dark .file.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .file.is-large .file-icon .fa { + font-size: 28px; } + html.theme--documenter-dark .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .file.has-name.is-empty .file-cta { + border-radius: 0.4em; } + html.theme--documenter-dark .file.has-name.is-empty .file-name { + display: none; } + html.theme--documenter-dark .file.is-boxed .file-label { + flex-direction: column; } + html.theme--documenter-dark .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + html.theme--documenter-dark .file.is-boxed .file-name { + border-width: 0 1px 1px; } + html.theme--documenter-dark .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + html.theme--documenter-dark .file.is-boxed .file-icon .fa { + font-size: 21px; } + html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { + font-size: 14px; } + html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + html.theme--documenter-dark .file.is-boxed.has-name .file-cta { + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .file.is-boxed.has-name .file-name { + border-radius: 0 0 0.4em 0.4em; + border-width: 0 1px 1px; } + html.theme--documenter-dark .file.is-centered { + justify-content: center; } + html.theme--documenter-dark .file.is-fullwidth .file-label { + width: 100%; } + html.theme--documenter-dark .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + html.theme--documenter-dark .file.is-right { + justify-content: flex-end; } + html.theme--documenter-dark .file.is-right .file-cta { + border-radius: 0 0.4em 0.4em 0; } + html.theme--documenter-dark .file.is-right .file-name { + border-radius: 0.4em 0 0 0.4em; + border-width: 1px 0 1px 1px; + order: -1; } + html.theme--documenter-dark .file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + html.theme--documenter-dark .file-label:hover .file-cta { + background-color: #e5eaec; + color: #282f2f; } + html.theme--documenter-dark .file-label:hover .file-name { + border-color: #596668; } + html.theme--documenter-dark .file-label:active .file-cta { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .file-label:active .file-name { + border-color: #535f61; } + html.theme--documenter-dark .file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + html.theme--documenter-dark .file-cta, + html.theme--documenter-dark .file-name { + border-color: #5e6d6f; + border-radius: 0.4em; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + html.theme--documenter-dark .file-cta { + background-color: #ecf0f1; + color: #343c3d; } + html.theme--documenter-dark .file-name { + border-color: #5e6d6f; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; } + html.theme--documenter-dark .file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + html.theme--documenter-dark .file-icon .fa { + font-size: 14px; } + html.theme--documenter-dark .label { + color: #282f2f; + display: block; + font-size: 15px; + font-weight: 700; } + html.theme--documenter-dark .label:not(:last-child) { + margin-bottom: 0.5em; } + html.theme--documenter-dark .label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.label { + font-size: 0.85em; } + html.theme--documenter-dark .label.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .label.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .help { + display: block; + font-size: 0.85em; + margin-top: 0.25rem; } + html.theme--documenter-dark .help.is-white { + color: white; } + html.theme--documenter-dark .help.is-black { + color: #0a0a0a; } + html.theme--documenter-dark .help.is-light { + color: #ecf0f1; } + html.theme--documenter-dark .help.is-dark, html.theme--documenter-dark .content kbd.help { + color: #282f2f; } + html.theme--documenter-dark .help.is-primary, html.theme--documenter-dark .docstring > section > a.help.docs-sourcelink { + color: #375a7f; } + html.theme--documenter-dark .help.is-link { + color: #1abc9c; } + html.theme--documenter-dark .help.is-info { + color: #024c7d; } + html.theme--documenter-dark .help.is-success { + color: #008438; } + html.theme--documenter-dark .help.is-warning { + color: #ad8100; } + html.theme--documenter-dark .help.is-danger { + color: #9e1b0d; } + html.theme--documenter-dark .field:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .field.has-addons { + display: flex; + justify-content: flex-start; } + html.theme--documenter-dark .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, + html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]), html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus, + html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]), + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active, + html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; } + html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, + html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover, + html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover, + html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; } + html.theme--documenter-dark .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .field.has-addons.has-addons-centered { + justify-content: center; } + html.theme--documenter-dark .field.has-addons.has-addons-right { + justify-content: flex-end; } + html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .field.is-grouped { + display: flex; + justify-content: flex-start; } + html.theme--documenter-dark .field.is-grouped > .control { + flex-shrink: 0; } + html.theme--documenter-dark .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + html.theme--documenter-dark .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .field.is-grouped.is-grouped-centered { + justify-content: center; } + html.theme--documenter-dark .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:last-child, html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field.is-horizontal { + display: flex; } } + html.theme--documenter-dark .field-label .label { + font-size: inherit; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .field-label { + margin-bottom: 0.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + html.theme--documenter-dark .field-label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.field-label { + font-size: 0.85em; + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-normal { + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + html.theme--documenter-dark .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + html.theme--documenter-dark .field-body .field .field { + margin-bottom: 0; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + html.theme--documenter-dark .field-body .field { + margin-bottom: 0; } + html.theme--documenter-dark .field-body > .field { + flex-shrink: 1; } + html.theme--documenter-dark .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + html.theme--documenter-dark .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + html.theme--documenter-dark .control { + box-sizing: border-box; + clear: both; + font-size: 15px; + position: relative; + text-align: left; } + html.theme--documenter-dark .control.has-icons-left .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select:focus ~ .icon { + color: #5e6d6f; } + html.theme--documenter-dark .control.has-icons-left .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.85em; } + html.theme--documenter-dark .control.has-icons-left .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + html.theme--documenter-dark .control.has-icons-left .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, + html.theme--documenter-dark .control.has-icons-left .select.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, + html.theme--documenter-dark .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + html.theme--documenter-dark .control.has-icons-left .icon, html.theme--documenter-dark .control.has-icons-right .icon { + color: #dbdee0; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; } + html.theme--documenter-dark .control.has-icons-left .input, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, + html.theme--documenter-dark .control.has-icons-left .select select { + padding-left: 2.25em; } + html.theme--documenter-dark .control.has-icons-left .icon.is-left { + left: 0; } + html.theme--documenter-dark .control.has-icons-right .input, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, + html.theme--documenter-dark .control.has-icons-right .select select { + padding-right: 2.25em; } + html.theme--documenter-dark .control.has-icons-right .icon.is-right { + right: 0; } + html.theme--documenter-dark .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + html.theme--documenter-dark .control.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.85em; } + html.theme--documenter-dark .control.is-loading.is-medium:after { + font-size: 1.25rem; } + html.theme--documenter-dark .control.is-loading.is-large:after { + font-size: 1.5rem; } + html.theme--documenter-dark .breadcrumb { + font-size: 15px; + white-space: nowrap; } + html.theme--documenter-dark .breadcrumb a { + align-items: center; + color: #1abc9c; + display: flex; + justify-content: center; + padding: 0 0.75em; } + html.theme--documenter-dark .breadcrumb a:hover { + color: #1dd2af; } + html.theme--documenter-dark .breadcrumb li { + align-items: center; + display: flex; } + html.theme--documenter-dark .breadcrumb li:first-child a { + padding-left: 0; } + html.theme--documenter-dark .breadcrumb li.is-active a { + color: #f2f2f2; + cursor: default; + pointer-events: none; } + html.theme--documenter-dark .breadcrumb li + li::before { + color: #8c9b9d; + content: "\0002f"; } + html.theme--documenter-dark .breadcrumb ul, + html.theme--documenter-dark .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + html.theme--documenter-dark .breadcrumb .icon:first-child { + margin-right: 0.5em; } + html.theme--documenter-dark .breadcrumb .icon:last-child { + margin-left: 0.5em; } + html.theme--documenter-dark .breadcrumb.is-centered ol, + html.theme--documenter-dark .breadcrumb.is-centered ul { + justify-content: center; } + html.theme--documenter-dark .breadcrumb.is-right ol, + html.theme--documenter-dark .breadcrumb.is-right ul { + justify-content: flex-end; } + html.theme--documenter-dark .breadcrumb.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.breadcrumb { + font-size: 0.85em; } + html.theme--documenter-dark .breadcrumb.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .breadcrumb.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + html.theme--documenter-dark .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + html.theme--documenter-dark .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + html.theme--documenter-dark .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + html.theme--documenter-dark .card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #fff; + max-width: 100%; + position: relative; } + html.theme--documenter-dark .card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; } + html.theme--documenter-dark .card-header-title { + align-items: center; + color: #f2f2f2; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; } + html.theme--documenter-dark .card-header-title.is-centered { + justify-content: center; } + html.theme--documenter-dark .card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; } + html.theme--documenter-dark .card-image { + display: block; + position: relative; } + html.theme--documenter-dark .card-content { + background-color: transparent; + padding: 1.5rem; } + html.theme--documenter-dark .card-footer { + background-color: transparent; + border-top: 1px solid #5e6d6f; + align-items: stretch; + display: flex; } + html.theme--documenter-dark .card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + html.theme--documenter-dark .card-footer-item:not(:last-child) { + border-right: 1px solid #5e6d6f; } + html.theme--documenter-dark .card .media:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + html.theme--documenter-dark .dropdown.is-active .dropdown-menu, html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + html.theme--documenter-dark .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + html.theme--documenter-dark .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + html.theme--documenter-dark .dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + html.theme--documenter-dark .dropdown-content { + background-color: #282f2f; + border-radius: 0.4em; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + html.theme--documenter-dark .dropdown-item { + color: #fff; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + html.theme--documenter-dark a.dropdown-item, + html.theme--documenter-dark button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; } + html.theme--documenter-dark a.dropdown-item:hover, + html.theme--documenter-dark button.dropdown-item:hover { + background-color: #282f2f; + color: #0a0a0a; } + html.theme--documenter-dark a.dropdown-item.is-active, + html.theme--documenter-dark button.dropdown-item.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .dropdown-divider { + background-color: #5e6d6f; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + html.theme--documenter-dark .level { + align-items: center; + justify-content: space-between; } + html.theme--documenter-dark .level code { + border-radius: 0.4em; } + html.theme--documenter-dark .level img { + display: inline-block; + vertical-align: top; } + html.theme--documenter-dark .level.is-mobile { + display: flex; } + html.theme--documenter-dark .level.is-mobile .level-left, + html.theme--documenter-dark .level.is-mobile .level-right { + display: flex; } + html.theme--documenter-dark .level.is-mobile .level-left + .level-right { + margin-top: 0; } + html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level { + display: flex; } + html.theme--documenter-dark .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } + html.theme--documenter-dark .level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + html.theme--documenter-dark .level-item .title, + html.theme--documenter-dark .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } + html.theme--documenter-dark .level-left, + html.theme--documenter-dark .level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .level-left .level-item.is-flexible, + html.theme--documenter-dark .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-left .level-item:not(:last-child), + html.theme--documenter-dark .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } + html.theme--documenter-dark .level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-left { + display: flex; } } + html.theme--documenter-dark .level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .level-right { + display: flex; } } + html.theme--documenter-dark .list { + background-color: white; + border-radius: 0.4em; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .list-item { + display: block; + padding: 0.5em 1em; } + html.theme--documenter-dark .list-item:not(a) { + color: #fff; } + html.theme--documenter-dark .list-item:first-child { + border-top-left-radius: 0.4em; + border-top-right-radius: 0.4em; } + html.theme--documenter-dark .list-item:last-child { + border-bottom-left-radius: 0.4em; + border-bottom-right-radius: 0.4em; } + html.theme--documenter-dark .list-item:not(:last-child) { + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .list-item.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark a.list-item { + background-color: #282f2f; + cursor: pointer; } + html.theme--documenter-dark .media { + align-items: flex-start; + display: flex; + text-align: left; } + html.theme--documenter-dark .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .media .media { + border-top: 1px solid rgba(94, 109, 111, 0.5); + display: flex; + padding-top: 0.75rem; } + html.theme--documenter-dark .media .media .content:not(:last-child), + html.theme--documenter-dark .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + html.theme--documenter-dark .media .media .media { + padding-top: 0.5rem; } + html.theme--documenter-dark .media .media .media + .media { + margin-top: 0.5rem; } + html.theme--documenter-dark .media + .media { + border-top: 1px solid rgba(94, 109, 111, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + html.theme--documenter-dark .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + html.theme--documenter-dark .media-left, + html.theme--documenter-dark .media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .media-left { + margin-right: 1rem; } + html.theme--documenter-dark .media-right { + margin-left: 1rem; } + html.theme--documenter-dark .media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .media-content { + overflow-x: auto; } } + html.theme--documenter-dark .menu { + font-size: 15px; } + html.theme--documenter-dark .menu.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.menu { + font-size: 0.85em; } + html.theme--documenter-dark .menu.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .menu.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .menu-list { + line-height: 1.25; } + html.theme--documenter-dark .menu-list a { + border-radius: 3px; + color: #fff; + display: block; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .menu-list a:hover { + background-color: #282f2f; + color: #f2f2f2; } + html.theme--documenter-dark .menu-list a.is-active { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .menu-list li ul { + border-left: 1px solid #5e6d6f; + margin: 0.75em; + padding-left: 0.75em; } + html.theme--documenter-dark .menu-label { + color: white; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + html.theme--documenter-dark .menu-label:not(:first-child) { + margin-top: 1em; } + html.theme--documenter-dark .menu-label:not(:last-child) { + margin-bottom: 1em; } + html.theme--documenter-dark .message { + background-color: #282f2f; + border-radius: 0.4em; + font-size: 15px; } + html.theme--documenter-dark .message strong { + color: currentColor; } + html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + html.theme--documenter-dark .message.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.message { + font-size: 0.85em; } + html.theme--documenter-dark .message.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .message.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .message.is-white { + background-color: white; } + html.theme--documenter-dark .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .message.is-white .message-body { + border-color: white; + color: #4d4d4d; } + html.theme--documenter-dark .message.is-black { + background-color: #fafafa; } + html.theme--documenter-dark .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; } + html.theme--documenter-dark .message.is-light { + background-color: #f9fafb; } + html.theme--documenter-dark .message.is-light .message-header { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .message.is-light .message-body { + border-color: #ecf0f1; + color: #505050; } + html.theme--documenter-dark .message.is-dark, html.theme--documenter-dark .content kbd.message { + background-color: #f9fafa; } + html.theme--documenter-dark .message.is-dark .message-header, html.theme--documenter-dark .content kbd.message .message-header { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .message.is-dark .message-body, html.theme--documenter-dark .content kbd.message .message-body { + border-color: #282f2f; + color: #212526; } + html.theme--documenter-dark .message.is-primary, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink { + background-color: #f8fafc; } + html.theme--documenter-dark .message.is-primary .message-header, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-header { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .message.is-primary .message-body, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-body { + border-color: #375a7f; + color: #2b4159; } + html.theme--documenter-dark .message.is-link { + background-color: #f6fefc; } + html.theme--documenter-dark .message.is-link .message-header { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .message.is-link .message-body { + border-color: #1abc9c; + color: #0b2f28; } + html.theme--documenter-dark .message.is-info { + background-color: #f5fbff; } + html.theme--documenter-dark .message.is-info .message-header { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .message.is-info .message-body { + border-color: #024c7d; + color: #033659; } + html.theme--documenter-dark .message.is-success { + background-color: #f5fff9; } + html.theme--documenter-dark .message.is-success .message-header { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .message.is-success .message-body { + border-color: #008438; + color: #023518; } + html.theme--documenter-dark .message.is-warning { + background-color: #fffcf5; } + html.theme--documenter-dark .message.is-warning .message-header { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .message.is-warning .message-body { + border-color: #ad8100; + color: #3d2e03; } + html.theme--documenter-dark .message.is-danger { + background-color: #fef6f6; } + html.theme--documenter-dark .message.is-danger .message-header { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .message.is-danger .message-body { + border-color: #9e1b0d; + color: #7a170c; } + html.theme--documenter-dark .message-header { + align-items: center; + background-color: #fff; + border-radius: 0.4em 0.4em 0 0; + color: rgba(0, 0, 0, 0.7); + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + html.theme--documenter-dark .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + html.theme--documenter-dark .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + html.theme--documenter-dark .message-body { + border-color: #5e6d6f; + border-radius: 0.4em; + border-style: solid; + border-width: 0 0 0 4px; + color: #fff; + padding: 1.25em 1.5em; } + html.theme--documenter-dark .message-body code, + html.theme--documenter-dark .message-body pre { + background-color: white; } + html.theme--documenter-dark .message-body pre code { + background-color: transparent; } + html.theme--documenter-dark .modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + html.theme--documenter-dark .modal.is-active { + display: flex; } + html.theme--documenter-dark .modal-background { + background-color: rgba(10, 10, 10, 0.86); } + html.theme--documenter-dark .modal-content, + html.theme--documenter-dark .modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .modal-content, + html.theme--documenter-dark .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } + html.theme--documenter-dark .modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + html.theme--documenter-dark .modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + html.theme--documenter-dark .modal-card-head, + html.theme--documenter-dark .modal-card-foot { + align-items: center; + background-color: #282f2f; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + html.theme--documenter-dark .modal-card-head { + border-bottom: 1px solid #5e6d6f; + border-top-left-radius: 8px; + border-top-right-radius: 8px; } + html.theme--documenter-dark .modal-card-title { + color: #f2f2f2; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + html.theme--documenter-dark .modal-card-foot { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + html.theme--documenter-dark .modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + html.theme--documenter-dark .navbar { + background-color: #375a7f; + min-height: 4rem; + position: relative; + z-index: 30; } + html.theme--documenter-dark .navbar.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-white .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + html.theme--documenter-dark .navbar.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link { + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-black .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link { + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + html.theme--documenter-dark .navbar.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link { + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after { + border-color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-burger { + color: #282f2f; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-light .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link { + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after { + border-color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #ecf0f1; + color: #282f2f; } } + html.theme--documenter-dark .navbar.is-dark, html.theme--documenter-dark .content kbd.navbar { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link { + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-burger, html.theme--documenter-dark .content kbd.navbar .navbar-burger { + color: #ecf0f1; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-dark .navbar-start > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-end > .navbar-item, + html.theme--documenter-dark .content kbd.navbar .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link { + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after, + html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after { + border-color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #282f2f; + color: #ecf0f1; } } + html.theme--documenter-dark .navbar.is-primary, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-burger, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-primary .navbar-start > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-end > .navbar-item, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #375a7f; + color: #fff; } } + html.theme--documenter-dark .navbar.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-link .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #1abc9c; + color: #fff; } } + html.theme--documenter-dark .navbar.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-info .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #024c7d; + color: #fff; } } + html.theme--documenter-dark .navbar.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-success .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #008438; + color: #fff; } } + html.theme--documenter-dark .navbar.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-warning .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ad8100; + color: #fff; } } + html.theme--documenter-dark .navbar.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar.is-danger .navbar-start > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-end > .navbar-item, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after, + html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #9e1b0d; + color: #fff; } } + html.theme--documenter-dark .navbar > .container { + align-items: stretch; + display: flex; + min-height: 4rem; + width: 100%; } + html.theme--documenter-dark .navbar.has-shadow { + box-shadow: 0 2px 0 0 #282f2f; } + html.theme--documenter-dark .navbar.is-fixed-bottom, html.theme--documenter-dark .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #282f2f; } + html.theme--documenter-dark .navbar.is-fixed-top { + top: 0; } + html.theme--documenter-dark html.has-navbar-fixed-top, + html.theme--documenter-dark body.has-navbar-fixed-top { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom, + html.theme--documenter-dark body.has-navbar-fixed-bottom { + padding-bottom: 4rem; } + html.theme--documenter-dark .navbar-brand, + html.theme--documenter-dark .navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 4rem; } + html.theme--documenter-dark .navbar-brand a.navbar-item:focus, html.theme--documenter-dark .navbar-brand a.navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + html.theme--documenter-dark .navbar-burger { + color: #fff; + cursor: pointer; + display: block; + height: 4rem; + position: relative; + width: 4rem; + margin-left: auto; } + html.theme--documenter-dark .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + html.theme--documenter-dark .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + html.theme--documenter-dark .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + html.theme--documenter-dark .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + html.theme--documenter-dark .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + html.theme--documenter-dark .navbar-menu { + display: none; } + html.theme--documenter-dark .navbar-item, + html.theme--documenter-dark .navbar-link { + color: #fff; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + html.theme--documenter-dark .navbar-item .icon:only-child, + html.theme--documenter-dark .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + html.theme--documenter-dark a.navbar-item, + html.theme--documenter-dark .navbar-link { + cursor: pointer; } + html.theme--documenter-dark a.navbar-item:focus, html.theme--documenter-dark a.navbar-item:focus-within, html.theme--documenter-dark a.navbar-item:hover, html.theme--documenter-dark a.navbar-item.is-active, + html.theme--documenter-dark .navbar-link:focus, + html.theme--documenter-dark .navbar-link:focus-within, + html.theme--documenter-dark .navbar-link:hover, + html.theme--documenter-dark .navbar-link.is-active { + background-color: transparent; + color: #1abc9c; } + html.theme--documenter-dark .navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .navbar-item img { + max-height: 1.75rem; } + html.theme--documenter-dark .navbar-item.has-dropdown { + padding: 0; } + html.theme--documenter-dark .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 4rem; + padding-bottom: calc(0.5rem - 1px); } + html.theme--documenter-dark .navbar-item.is-tab:focus, html.theme--documenter-dark .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #1abc9c; } + html.theme--documenter-dark .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #1abc9c; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #1abc9c; + padding-bottom: calc(0.5rem - 3px); } + html.theme--documenter-dark .navbar-content { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after { + border-color: #fff; + margin-top: -0.375em; + right: 1.125em; } + html.theme--documenter-dark .navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + html.theme--documenter-dark .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + html.theme--documenter-dark .navbar-divider { + background-color: rgba(0, 0, 0, 0.2); + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .navbar > .container { + display: block; } + html.theme--documenter-dark .navbar-brand .navbar-item, + html.theme--documenter-dark .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + html.theme--documenter-dark .navbar-link::after { + display: none; } + html.theme--documenter-dark .navbar-menu { + background-color: #375a7f; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + html.theme--documenter-dark .navbar-menu.is-active { + display: block; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch, html.theme--documenter-dark .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .navbar.is-fixed-top-touch { + top: 0; } + html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu, html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 4rem); + overflow: auto; } + html.theme--documenter-dark html.has-navbar-fixed-top-touch, + html.theme--documenter-dark body.has-navbar-fixed-top-touch { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom-touch, + html.theme--documenter-dark body.has-navbar-fixed-bottom-touch { + padding-bottom: 4rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .navbar, + html.theme--documenter-dark .navbar-menu, + html.theme--documenter-dark .navbar-start, + html.theme--documenter-dark .navbar-end { + align-items: stretch; + display: flex; } + html.theme--documenter-dark .navbar { + min-height: 4rem; } + html.theme--documenter-dark .navbar.is-spaced { + padding: 1rem 2rem; } + html.theme--documenter-dark .navbar.is-spaced .navbar-start, + html.theme--documenter-dark .navbar.is-spaced .navbar-end { + align-items: center; } + html.theme--documenter-dark .navbar.is-spaced a.navbar-item, + html.theme--documenter-dark .navbar.is-spaced .navbar-link { + border-radius: 0.4em; } + html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover, html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active, + html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus, + html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover, + html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: transparent; + color: #dbdee0; } + html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: transparent; + color: #1abc9c; } + html.theme--documenter-dark .navbar-burger { + display: none; } + html.theme--documenter-dark .navbar-item, + html.theme--documenter-dark .navbar-link { + align-items: center; + display: flex; } + html.theme--documenter-dark .navbar-item { + display: flex; } + html.theme--documenter-dark .navbar-item.has-dropdown { + align-items: stretch; } + html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 8px 8px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + html.theme--documenter-dark .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .navbar-start { + justify-content: flex-start; + margin-right: auto; } + html.theme--documenter-dark .navbar-end { + justify-content: flex-end; + margin-left: auto; } + html.theme--documenter-dark .navbar-dropdown { + background-color: #375a7f; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + border-top: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + html.theme--documenter-dark .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover { + background-color: transparent; + color: #dbdee0; } + html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active { + background-color: transparent; + color: #1abc9c; } + .navbar.is-spaced html.theme--documenter-dark .navbar-dropdown, html.theme--documenter-dark .navbar-dropdown.is-boxed { + border-radius: 8px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + html.theme--documenter-dark .navbar-dropdown.is-right { + left: auto; + right: 0; } + html.theme--documenter-dark .navbar-divider { + display: block; } + html.theme--documenter-dark .navbar > .container .navbar-brand, + html.theme--documenter-dark .container > .navbar .navbar-brand { + margin-left: -.75rem; } + html.theme--documenter-dark .navbar > .container .navbar-menu, + html.theme--documenter-dark .container > .navbar .navbar-menu { + margin-right: -.75rem; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop, html.theme--documenter-dark .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop { + bottom: 0; } + html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .navbar.is-fixed-top-desktop { + top: 0; } + html.theme--documenter-dark html.has-navbar-fixed-top-desktop, + html.theme--documenter-dark body.has-navbar-fixed-top-desktop { + padding-top: 4rem; } + html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop, + html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop { + padding-bottom: 4rem; } + html.theme--documenter-dark html.has-spaced-navbar-fixed-top, + html.theme--documenter-dark body.has-spaced-navbar-fixed-top { + padding-top: 6rem; } + html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom, + html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom { + padding-bottom: 6rem; } + html.theme--documenter-dark a.navbar-item.is-active, + html.theme--documenter-dark .navbar-link.is-active { + color: #1abc9c; } + html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover), + html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: transparent; } } + html.theme--documenter-dark .hero.is-fullheight-with-navbar { + min-height: calc(100vh - 4rem); } + html.theme--documenter-dark .pagination { + font-size: 15px; + margin: -0.25rem; } + html.theme--documenter-dark .pagination.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination { + font-size: 0.85em; } + html.theme--documenter-dark .pagination.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .pagination.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .pagination.is-rounded .pagination-previous, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, + html.theme--documenter-dark .pagination.is-rounded .pagination-next, + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; } + html.theme--documenter-dark .pagination.is-rounded .pagination-link, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { + border-radius: 290486px; } + html.theme--documenter-dark .pagination, + html.theme--documenter-dark .pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-link { + border-color: #5e6d6f; + color: #1abc9c; + min-width: 2.25em; } + html.theme--documenter-dark .pagination-previous:hover, + html.theme--documenter-dark .pagination-next:hover, + html.theme--documenter-dark .pagination-link:hover { + border-color: #8c9b9d; + color: #1dd2af; } + html.theme--documenter-dark .pagination-previous:focus, + html.theme--documenter-dark .pagination-next:focus, + html.theme--documenter-dark .pagination-link:focus { + border-color: #8c9b9d; } + html.theme--documenter-dark .pagination-previous:active, + html.theme--documenter-dark .pagination-next:active, + html.theme--documenter-dark .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + html.theme--documenter-dark .pagination-previous[disabled], + html.theme--documenter-dark .pagination-next[disabled], + html.theme--documenter-dark .pagination-link[disabled] { + background-color: #dbdee0; + border-color: #dbdee0; + box-shadow: none; + color: #5e6d6f; + opacity: 0.5; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + html.theme--documenter-dark .pagination-link.is-current { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .pagination-ellipsis { + color: #8c9b9d; + pointer-events: none; } + html.theme--documenter-dark .pagination-list { + flex-wrap: wrap; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .pagination { + flex-wrap: wrap; } + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + html.theme--documenter-dark .pagination-previous { + order: 2; } + html.theme--documenter-dark .pagination-next { + order: 3; } + html.theme--documenter-dark .pagination { + justify-content: space-between; } + html.theme--documenter-dark .pagination.is-centered .pagination-previous { + order: 1; } + html.theme--documenter-dark .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + html.theme--documenter-dark .pagination.is-centered .pagination-next { + order: 3; } + html.theme--documenter-dark .pagination.is-right .pagination-previous { + order: 1; } + html.theme--documenter-dark .pagination.is-right .pagination-next { + order: 2; } + html.theme--documenter-dark .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + html.theme--documenter-dark .panel { + font-size: 15px; } + html.theme--documenter-dark .panel:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .panel-heading, + html.theme--documenter-dark .panel-tabs, + html.theme--documenter-dark .panel-block { + border-bottom: 1px solid #5e6d6f; + border-left: 1px solid #5e6d6f; + border-right: 1px solid #5e6d6f; } + html.theme--documenter-dark .panel-heading:first-child, + html.theme--documenter-dark .panel-tabs:first-child, + html.theme--documenter-dark .panel-block:first-child { + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark .panel-heading { + background-color: #282f2f; + border-radius: 0.4em 0.4em 0 0; + color: #f2f2f2; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + html.theme--documenter-dark .panel-tabs a { + border-bottom: 1px solid #5e6d6f; + margin-bottom: -1px; + padding: 0.5em; } + html.theme--documenter-dark .panel-tabs a.is-active { + border-bottom-color: #343c3d; + color: #17a689; } + html.theme--documenter-dark .panel-list a { + color: #fff; } + html.theme--documenter-dark .panel-list a:hover { + color: #1abc9c; } + html.theme--documenter-dark .panel-block { + align-items: center; + color: #f2f2f2; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + html.theme--documenter-dark .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + html.theme--documenter-dark .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + html.theme--documenter-dark .panel-block.is-wrapped { + flex-wrap: wrap; } + html.theme--documenter-dark .panel-block.is-active { + border-left-color: #1abc9c; + color: #17a689; } + html.theme--documenter-dark .panel-block.is-active .panel-icon { + color: #1abc9c; } + html.theme--documenter-dark a.panel-block, + html.theme--documenter-dark label.panel-block { + cursor: pointer; } + html.theme--documenter-dark a.panel-block:hover, + html.theme--documenter-dark label.panel-block:hover { + background-color: #282f2f; } + html.theme--documenter-dark .panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: white; + margin-right: 0.75em; } + html.theme--documenter-dark .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + html.theme--documenter-dark .tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 15px; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + html.theme--documenter-dark .tabs a { + align-items: center; + border-bottom-color: #5e6d6f; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #fff; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + html.theme--documenter-dark .tabs a:hover { + border-bottom-color: #f2f2f2; + color: #f2f2f2; } + html.theme--documenter-dark .tabs li { + display: block; } + html.theme--documenter-dark .tabs li.is-active a { + border-bottom-color: #1abc9c; + color: #1abc9c; } + html.theme--documenter-dark .tabs ul { + align-items: center; + border-bottom-color: #5e6d6f; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + html.theme--documenter-dark .tabs ul.is-left { + padding-right: 0.75em; } + html.theme--documenter-dark .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + html.theme--documenter-dark .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + html.theme--documenter-dark .tabs .icon:first-child { + margin-right: 0.5em; } + html.theme--documenter-dark .tabs .icon:last-child { + margin-left: 0.5em; } + html.theme--documenter-dark .tabs.is-centered ul { + justify-content: center; } + html.theme--documenter-dark .tabs.is-right ul { + justify-content: flex-end; } + html.theme--documenter-dark .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .tabs.is-boxed a:hover { + background-color: #282f2f; + border-bottom-color: #5e6d6f; } + html.theme--documenter-dark .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #5e6d6f; + border-bottom-color: transparent !important; } + html.theme--documenter-dark .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + html.theme--documenter-dark .tabs.is-toggle a { + border-color: #5e6d6f; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + html.theme--documenter-dark .tabs.is-toggle a:hover { + background-color: #282f2f; + border-color: #8c9b9d; + z-index: 2; } + html.theme--documenter-dark .tabs.is-toggle li + li { + margin-left: -1px; } + html.theme--documenter-dark .tabs.is-toggle li:first-child a { + border-radius: 0.4em 0 0 0.4em; } + html.theme--documenter-dark .tabs.is-toggle li:last-child a { + border-radius: 0 0.4em 0.4em 0; } + html.theme--documenter-dark .tabs.is-toggle li.is-active a { + background-color: #1abc9c; + border-color: #1abc9c; + color: #fff; + z-index: 1; } + html.theme--documenter-dark .tabs.is-toggle ul { + border-bottom: none; } + html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; } + html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; } + html.theme--documenter-dark .tabs.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.tabs { + font-size: 0.85em; } + html.theme--documenter-dark .tabs.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .tabs.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > html.theme--documenter-dark .column.is-narrow { + flex: none; } + .columns.is-mobile > html.theme--documenter-dark .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-1 { + flex: none; + width: 8.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-1 { + margin-left: 8.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-2 { + flex: none; + width: 16.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-2 { + margin-left: 16.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-4 { + flex: none; + width: 33.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-4 { + margin-left: 33.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-5 { + flex: none; + width: 41.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-5 { + margin-left: 41.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-7 { + flex: none; + width: 58.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-7 { + margin-left: 58.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-8 { + flex: none; + width: 66.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-8 { + margin-left: 66.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-10 { + flex: none; + width: 83.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-10 { + margin-left: 83.3333333333%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-11 { + flex: none; + width: 91.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-11 { + margin-left: 91.6666666667%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > html.theme--documenter-dark .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .column.is-narrow-mobile { + flex: none; } + html.theme--documenter-dark .column.is-full-mobile { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-mobile { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-mobile { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-mobile { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-mobile { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-mobile { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-mobile { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-mobile { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-mobile { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-mobile { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-mobile { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-mobile { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-mobile { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-mobile { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-mobile { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-mobile { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-mobile { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-mobile { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-mobile { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-mobile { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-mobile { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-mobile { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-mobile { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-mobile { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-mobile { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-mobile { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-mobile { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-mobile { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .column.is-narrow, html.theme--documenter-dark .column.is-narrow-tablet { + flex: none; } + html.theme--documenter-dark .column.is-full, html.theme--documenter-dark .column.is-full-tablet { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters, html.theme--documenter-dark .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds, html.theme--documenter-dark .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half, html.theme--documenter-dark .column.is-half-tablet { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third, html.theme--documenter-dark .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter, html.theme--documenter-dark .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth, html.theme--documenter-dark .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths, html.theme--documenter-dark .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths, html.theme--documenter-dark .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths, html.theme--documenter-dark .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters, html.theme--documenter-dark .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds, html.theme--documenter-dark .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half, html.theme--documenter-dark .column.is-offset-half-tablet { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third, html.theme--documenter-dark .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter, html.theme--documenter-dark .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth, html.theme--documenter-dark .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths, html.theme--documenter-dark .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths, html.theme--documenter-dark .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths, html.theme--documenter-dark .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0, html.theme--documenter-dark .column.is-0-tablet { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0, html.theme--documenter-dark .column.is-offset-0-tablet { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1, html.theme--documenter-dark .column.is-1-tablet { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1, html.theme--documenter-dark .column.is-offset-1-tablet { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2, html.theme--documenter-dark .column.is-2-tablet { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2, html.theme--documenter-dark .column.is-offset-2-tablet { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3, html.theme--documenter-dark .column.is-3-tablet { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3, html.theme--documenter-dark .column.is-offset-3-tablet { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4, html.theme--documenter-dark .column.is-4-tablet { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4, html.theme--documenter-dark .column.is-offset-4-tablet { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5, html.theme--documenter-dark .column.is-5-tablet { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5, html.theme--documenter-dark .column.is-offset-5-tablet { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6, html.theme--documenter-dark .column.is-6-tablet { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6, html.theme--documenter-dark .column.is-offset-6-tablet { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7, html.theme--documenter-dark .column.is-7-tablet { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7, html.theme--documenter-dark .column.is-offset-7-tablet { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8, html.theme--documenter-dark .column.is-8-tablet { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8, html.theme--documenter-dark .column.is-offset-8-tablet { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9, html.theme--documenter-dark .column.is-9-tablet { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9, html.theme--documenter-dark .column.is-offset-9-tablet { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10, html.theme--documenter-dark .column.is-10-tablet { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10, html.theme--documenter-dark .column.is-offset-10-tablet { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11, html.theme--documenter-dark .column.is-11-tablet { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11, html.theme--documenter-dark .column.is-offset-11-tablet { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12, html.theme--documenter-dark .column.is-12-tablet { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12, html.theme--documenter-dark .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .column.is-narrow-touch { + flex: none; } + html.theme--documenter-dark .column.is-full-touch { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-touch { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-touch { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-touch { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-touch { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-touch { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-touch { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-touch { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-touch { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-touch { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-touch { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-touch { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-touch { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-touch { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-touch { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-touch { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-touch { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-touch { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-touch { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-touch { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-touch { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-touch { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-touch { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-touch { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-touch { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-touch { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-touch { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-touch { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-touch { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-touch { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-touch { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-touch { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-touch { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-touch { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-touch { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-touch { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-touch { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-touch { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-touch { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-touch { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .column.is-narrow-desktop { + flex: none; } + html.theme--documenter-dark .column.is-full-desktop { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-desktop { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-desktop { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-desktop { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-desktop { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-desktop { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-desktop { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-desktop { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-desktop { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-desktop { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-desktop { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-desktop { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-desktop { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-desktop { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-desktop { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-desktop { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-desktop { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-desktop { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-desktop { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-desktop { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-desktop { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-desktop { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-desktop { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-desktop { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-desktop { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-desktop { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-desktop { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-desktop { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .column.is-narrow-widescreen { + flex: none; } + html.theme--documenter-dark .column.is-full-widescreen { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-widescreen { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-widescreen { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-widescreen { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-widescreen { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-widescreen { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-widescreen { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-widescreen { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-widescreen { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-widescreen { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-widescreen { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-widescreen { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .column.is-narrow-fullhd { + flex: none; } + html.theme--documenter-dark .column.is-full-fullhd { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + html.theme--documenter-dark .column.is-half-fullhd { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + html.theme--documenter-dark .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + html.theme--documenter-dark .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + html.theme--documenter-dark .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + html.theme--documenter-dark .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + html.theme--documenter-dark .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + html.theme--documenter-dark .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + html.theme--documenter-dark .column.is-offset-half-fullhd { + margin-left: 50%; } + html.theme--documenter-dark .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + html.theme--documenter-dark .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + html.theme--documenter-dark .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + html.theme--documenter-dark .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + html.theme--documenter-dark .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + html.theme--documenter-dark .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + html.theme--documenter-dark .column.is-0-fullhd { + flex: none; + width: 0%; } + html.theme--documenter-dark .column.is-offset-0-fullhd { + margin-left: 0%; } + html.theme--documenter-dark .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; } + html.theme--documenter-dark .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; } + html.theme--documenter-dark .column.is-3-fullhd { + flex: none; + width: 25%; } + html.theme--documenter-dark .column.is-offset-3-fullhd { + margin-left: 25%; } + html.theme--documenter-dark .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; } + html.theme--documenter-dark .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; } + html.theme--documenter-dark .column.is-6-fullhd { + flex: none; + width: 50%; } + html.theme--documenter-dark .column.is-offset-6-fullhd { + margin-left: 50%; } + html.theme--documenter-dark .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; } + html.theme--documenter-dark .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; } + html.theme--documenter-dark .column.is-9-fullhd { + flex: none; + width: 75%; } + html.theme--documenter-dark .column.is-offset-9-fullhd { + margin-left: 75%; } + html.theme--documenter-dark .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; } + html.theme--documenter-dark .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; } + html.theme--documenter-dark .column.is-12-fullhd { + flex: none; + width: 100%; } + html.theme--documenter-dark .column.is-offset-12-fullhd { + margin-left: 100%; } } + html.theme--documenter-dark .columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + html.theme--documenter-dark .columns:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + html.theme--documenter-dark .columns.is-centered { + justify-content: center; } + html.theme--documenter-dark .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + html.theme--documenter-dark .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + html.theme--documenter-dark .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + html.theme--documenter-dark .columns.is-gapless:last-child { + margin-bottom: 0; } + html.theme--documenter-dark .columns.is-mobile { + display: flex; } + html.theme--documenter-dark .columns.is-multiline { + flex-wrap: wrap; } + html.theme--documenter-dark .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-desktop { + display: flex; } } + html.theme--documenter-dark .columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + html.theme--documenter-dark .columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + html.theme--documenter-dark .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + html.theme--documenter-dark .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + html.theme--documenter-dark .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + html.theme--documenter-dark .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + html.theme--documenter-dark .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + html.theme--documenter-dark .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + html.theme--documenter-dark .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + html.theme--documenter-dark .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + html.theme--documenter-dark .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + html.theme--documenter-dark .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + html.theme--documenter-dark .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + html.theme--documenter-dark .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } + html.theme--documenter-dark .tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + html.theme--documenter-dark .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + html.theme--documenter-dark .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + html.theme--documenter-dark .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + html.theme--documenter-dark .tile.is-child { + margin: 0 !important; } + html.theme--documenter-dark .tile.is-parent { + padding: 0.75rem; } + html.theme--documenter-dark .tile.is-vertical { + flex-direction: column; } + html.theme--documenter-dark .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .tile:not(.is-child) { + display: flex; } + html.theme--documenter-dark .tile.is-1 { + flex: none; + width: 8.3333333333%; } + html.theme--documenter-dark .tile.is-2 { + flex: none; + width: 16.6666666667%; } + html.theme--documenter-dark .tile.is-3 { + flex: none; + width: 25%; } + html.theme--documenter-dark .tile.is-4 { + flex: none; + width: 33.3333333333%; } + html.theme--documenter-dark .tile.is-5 { + flex: none; + width: 41.6666666667%; } + html.theme--documenter-dark .tile.is-6 { + flex: none; + width: 50%; } + html.theme--documenter-dark .tile.is-7 { + flex: none; + width: 58.3333333333%; } + html.theme--documenter-dark .tile.is-8 { + flex: none; + width: 66.6666666667%; } + html.theme--documenter-dark .tile.is-9 { + flex: none; + width: 75%; } + html.theme--documenter-dark .tile.is-10 { + flex: none; + width: 83.3333333333%; } + html.theme--documenter-dark .tile.is-11 { + flex: none; + width: 91.6666666667%; } + html.theme--documenter-dark .tile.is-12 { + flex: none; + width: 100%; } } + html.theme--documenter-dark .hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + html.theme--documenter-dark .hero .navbar { + background: none; } + html.theme--documenter-dark .hero .tabs ul { + border-bottom: none; } + html.theme--documenter-dark .hero.is-white { + background-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-white strong { + color: inherit; } + html.theme--documenter-dark .hero.is-white .title { + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + html.theme--documenter-dark .hero.is-white .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-white .navbar-menu { + background-color: white; } } + html.theme--documenter-dark .hero.is-white .navbar-item, + html.theme--documenter-dark .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + html.theme--documenter-dark .hero.is-white a.navbar-item:hover, html.theme--documenter-dark .hero.is-white a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-white .navbar-link:hover, + html.theme--documenter-dark .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-white .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-white .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + html.theme--documenter-dark .hero.is-black { + background-color: #0a0a0a; + color: white; } + html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-black strong { + color: inherit; } + html.theme--documenter-dark .hero.is-black .title { + color: white; } + html.theme--documenter-dark .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-black .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + html.theme--documenter-dark .hero.is-black .navbar-item, + html.theme--documenter-dark .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-black a.navbar-item:hover, html.theme--documenter-dark .hero.is-black a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-black .navbar-link:hover, + html.theme--documenter-dark .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + html.theme--documenter-dark .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-black .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-black .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a { + color: white; } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + html.theme--documenter-dark .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + html.theme--documenter-dark .hero.is-light { + background-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-light strong { + color: inherit; } + html.theme--documenter-dark .hero.is-light .title { + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .subtitle { + color: rgba(40, 47, 47, 0.9); } + html.theme--documenter-dark .hero.is-light .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-light .subtitle strong { + color: #282f2f; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-light .navbar-menu { + background-color: #ecf0f1; } } + html.theme--documenter-dark .hero.is-light .navbar-item, + html.theme--documenter-dark .hero.is-light .navbar-link { + color: rgba(40, 47, 47, 0.7); } + html.theme--documenter-dark .hero.is-light a.navbar-item:hover, html.theme--documenter-dark .hero.is-light a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-light .navbar-link:hover, + html.theme--documenter-dark .hero.is-light .navbar-link.is-active { + background-color: #dde4e6; + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .tabs a { + color: #282f2f; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-light .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-light .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a { + color: #282f2f; } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #282f2f; + border-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } } + html.theme--documenter-dark .hero.is-dark, html.theme--documenter-dark .content kbd.hero { + background-color: #282f2f; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-dark strong, + html.theme--documenter-dark .content kbd.hero strong { + color: inherit; } + html.theme--documenter-dark .hero.is-dark .title, html.theme--documenter-dark .content kbd.hero .title { + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .subtitle, html.theme--documenter-dark .content kbd.hero .subtitle { + color: rgba(236, 240, 241, 0.9); } + html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button), html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-dark .subtitle strong, + html.theme--documenter-dark .content kbd.hero .subtitle strong { + color: #ecf0f1; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-dark .navbar-menu, html.theme--documenter-dark .content kbd.hero .navbar-menu { + background-color: #282f2f; } } + html.theme--documenter-dark .hero.is-dark .navbar-item, html.theme--documenter-dark .content kbd.hero .navbar-item, + html.theme--documenter-dark .hero.is-dark .navbar-link, + html.theme--documenter-dark .content kbd.hero .navbar-link { + color: rgba(236, 240, 241, 0.7); } + html.theme--documenter-dark .hero.is-dark a.navbar-item:hover, html.theme--documenter-dark .content kbd.hero a.navbar-item:hover, html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active, html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-dark .navbar-link:hover, + html.theme--documenter-dark .content kbd.hero .navbar-link:hover, + html.theme--documenter-dark .hero.is-dark .navbar-link.is-active, + html.theme--documenter-dark .content kbd.hero .navbar-link.is-active { + background-color: #1d2122; + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .tabs a, html.theme--documenter-dark .content kbd.hero .tabs a { + color: #ecf0f1; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-dark .tabs a:hover, html.theme--documenter-dark .content kbd.hero .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-dark .tabs li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a { + color: #ecf0f1; } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #ecf0f1; + border-color: #ecf0f1; + color: #282f2f; } + html.theme--documenter-dark .hero.is-dark.is-bold, html.theme--documenter-dark .content kbd.hero.is-bold { + background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu, html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } } + html.theme--documenter-dark .hero.is-primary, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink { + background-color: #375a7f; + color: #fff; } + html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-primary strong, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink strong { + color: inherit; } + html.theme--documenter-dark .hero.is-primary .title, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .title { + color: #fff; } + html.theme--documenter-dark .hero.is-primary .subtitle, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-primary .subtitle strong, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-primary .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-menu { + background-color: #375a7f; } } + html.theme--documenter-dark .hero.is-primary .navbar-item, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-item, + html.theme--documenter-dark .hero.is-primary .navbar-link, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-primary a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-primary .navbar-link:hover, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, + html.theme--documenter-dark .hero.is-primary .navbar-link.is-active, + html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #2f4d6d; + color: #fff; } + html.theme--documenter-dark .hero.is-primary .tabs a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-primary .tabs a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-primary .tabs li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #375a7f; } + html.theme--documenter-dark .hero.is-primary.is-bold, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } } + html.theme--documenter-dark .hero.is-link { + background-color: #1abc9c; + color: #fff; } + html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-link strong { + color: inherit; } + html.theme--documenter-dark .hero.is-link .title { + color: #fff; } + html.theme--documenter-dark .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-link .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-link .navbar-menu { + background-color: #1abc9c; } } + html.theme--documenter-dark .hero.is-link .navbar-item, + html.theme--documenter-dark .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-link a.navbar-item:hover, html.theme--documenter-dark .hero.is-link a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-link .navbar-link:hover, + html.theme--documenter-dark .hero.is-link .navbar-link.is-active { + background-color: #17a689; + color: #fff; } + html.theme--documenter-dark .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-link .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-link .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #1abc9c; } + html.theme--documenter-dark .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } } + html.theme--documenter-dark .hero.is-info { + background-color: #024c7d; + color: #fff; } + html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-info strong { + color: inherit; } + html.theme--documenter-dark .hero.is-info .title { + color: #fff; } + html.theme--documenter-dark .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-info .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-info .navbar-menu { + background-color: #024c7d; } } + html.theme--documenter-dark .hero.is-info .navbar-item, + html.theme--documenter-dark .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-info a.navbar-item:hover, html.theme--documenter-dark .hero.is-info a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-info .navbar-link:hover, + html.theme--documenter-dark .hero.is-info .navbar-link.is-active { + background-color: #023d64; + color: #fff; } + html.theme--documenter-dark .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-info .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-info .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #024c7d; } + html.theme--documenter-dark .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } } + html.theme--documenter-dark .hero.is-success { + background-color: #008438; + color: #fff; } + html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-success strong { + color: inherit; } + html.theme--documenter-dark .hero.is-success .title { + color: #fff; } + html.theme--documenter-dark .hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-success .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-success .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-success .navbar-menu { + background-color: #008438; } } + html.theme--documenter-dark .hero.is-success .navbar-item, + html.theme--documenter-dark .hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-success a.navbar-item:hover, html.theme--documenter-dark .hero.is-success a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-success .navbar-link:hover, + html.theme--documenter-dark .hero.is-success .navbar-link.is-active { + background-color: #006b2d; + color: #fff; } + html.theme--documenter-dark .hero.is-success .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-success .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-success .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #008438; } + html.theme--documenter-dark .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } } + html.theme--documenter-dark .hero.is-warning { + background-color: #ad8100; + color: #fff; } + html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-warning strong { + color: inherit; } + html.theme--documenter-dark .hero.is-warning .title { + color: #fff; } + html.theme--documenter-dark .hero.is-warning .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-warning .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-warning .navbar-menu { + background-color: #ad8100; } } + html.theme--documenter-dark .hero.is-warning .navbar-item, + html.theme--documenter-dark .hero.is-warning .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-warning a.navbar-item:hover, html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-warning .navbar-link:hover, + html.theme--documenter-dark .hero.is-warning .navbar-link.is-active { + background-color: #946e00; + color: #fff; } + html.theme--documenter-dark .hero.is-warning .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-warning .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-warning .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ad8100; } + html.theme--documenter-dark .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } } + html.theme--documenter-dark .hero.is-danger { + background-color: #9e1b0d; + color: #fff; } + html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + html.theme--documenter-dark .hero.is-danger strong { + color: inherit; } + html.theme--documenter-dark .hero.is-danger .title { + color: #fff; } + html.theme--documenter-dark .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button), + html.theme--documenter-dark .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .hero.is-danger .navbar-menu { + background-color: #9e1b0d; } } + html.theme--documenter-dark .hero.is-danger .navbar-item, + html.theme--documenter-dark .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + html.theme--documenter-dark .hero.is-danger a.navbar-item:hover, html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active, + html.theme--documenter-dark .hero.is-danger .navbar-link:hover, + html.theme--documenter-dark .hero.is-danger .navbar-link.is-active { + background-color: #86170b; + color: #fff; } + html.theme--documenter-dark .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + html.theme--documenter-dark .hero.is-danger .tabs a:hover { + opacity: 1; } + html.theme--documenter-dark .hero.is-danger .tabs li.is-active a { + opacity: 1; } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a { + color: #fff; } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #9e1b0d; } + html.theme--documenter-dark .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } } + html.theme--documenter-dark .hero.is-small .hero-body, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; } } + html.theme--documenter-dark .hero.is-halfheight .hero-body, html.theme--documenter-dark .hero.is-fullheight .hero-body, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + html.theme--documenter-dark .hero.is-halfheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + html.theme--documenter-dark .hero.is-halfheight { + min-height: 50vh; } + html.theme--documenter-dark .hero.is-fullheight { + min-height: 100vh; } + html.theme--documenter-dark .hero-video { + overflow: hidden; } + html.theme--documenter-dark .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + html.theme--documenter-dark .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero-video { + display: none; } } + html.theme--documenter-dark .hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + html.theme--documenter-dark .hero-buttons .button { + display: flex; } + html.theme--documenter-dark .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + html.theme--documenter-dark .hero-buttons { + display: flex; + justify-content: center; } + html.theme--documenter-dark .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } + html.theme--documenter-dark .hero-head, + html.theme--documenter-dark .hero-foot { + flex-grow: 0; + flex-shrink: 0; } + html.theme--documenter-dark .hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + html.theme--documenter-dark .section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark .section.is-medium { + padding: 9rem 1.5rem; } + html.theme--documenter-dark .section.is-large { + padding: 18rem 1.5rem; } } + html.theme--documenter-dark .footer { + background-color: #282f2f; + padding: 3rem 1.5rem 6rem; } + html.theme--documenter-dark hr { + height: 1px; } + html.theme--documenter-dark h6 { + text-transform: uppercase; + letter-spacing: 0.5px; } + html.theme--documenter-dark .hero { + background-color: #343c3d; } + html.theme--documenter-dark a { + transition: all 200ms ease; } + html.theme--documenter-dark .button { + transition: all 200ms ease; + border-width: 1px; + color: white; } + html.theme--documenter-dark .button.is-active, html.theme--documenter-dark .button.is-focused, html.theme--documenter-dark .button:active, html.theme--documenter-dark .button:focus { + box-shadow: 0 0 0 2px rgba(140, 155, 157, 0.5); } + html.theme--documenter-dark .button.is-white.is-hovered, html.theme--documenter-dark .button.is-white:hover { + background-color: white; } + html.theme--documenter-dark .button.is-white.is-active, html.theme--documenter-dark .button.is-white.is-focused, html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white:focus { + border-color: white; + box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); } + html.theme--documenter-dark .button.is-black.is-hovered, html.theme--documenter-dark .button.is-black:hover { + background-color: #1d1d1d; } + html.theme--documenter-dark .button.is-black.is-active, html.theme--documenter-dark .button.is-black.is-focused, html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black:focus { + border-color: #0a0a0a; + box-shadow: 0 0 0 2px rgba(10, 10, 10, 0.5); } + html.theme--documenter-dark .button.is-light.is-hovered, html.theme--documenter-dark .button.is-light:hover { + background-color: white; } + html.theme--documenter-dark .button.is-light.is-active, html.theme--documenter-dark .button.is-light.is-focused, html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light:focus { + border-color: #ecf0f1; + box-shadow: 0 0 0 2px rgba(236, 240, 241, 0.5); } + html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered, html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover { + background-color: #3a4344; } + html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused, html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus { + border-color: #282f2f; + box-shadow: 0 0 0 2px rgba(40, 47, 47, 0.5); } + html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover { + background-color: #436d9a; } + html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink, html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus { + border-color: #375a7f; + box-shadow: 0 0 0 2px rgba(55, 90, 127, 0.5); } + html.theme--documenter-dark .button.is-link.is-hovered, html.theme--documenter-dark .button.is-link:hover { + background-color: #1fdeb8; } + html.theme--documenter-dark .button.is-link.is-active, html.theme--documenter-dark .button.is-link.is-focused, html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link:focus { + border-color: #1abc9c; + box-shadow: 0 0 0 2px rgba(26, 188, 156, 0.5); } + html.theme--documenter-dark .button.is-info.is-hovered, html.theme--documenter-dark .button.is-info:hover { + background-color: #0363a3; } + html.theme--documenter-dark .button.is-info.is-active, html.theme--documenter-dark .button.is-info.is-focused, html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info:focus { + border-color: #024c7d; + box-shadow: 0 0 0 2px rgba(2, 76, 125, 0.5); } + html.theme--documenter-dark .button.is-success.is-hovered, html.theme--documenter-dark .button.is-success:hover { + background-color: #00aa48; } + html.theme--documenter-dark .button.is-success.is-active, html.theme--documenter-dark .button.is-success.is-focused, html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success:focus { + border-color: #008438; + box-shadow: 0 0 0 2px rgba(0, 132, 56, 0.5); } + html.theme--documenter-dark .button.is-warning.is-hovered, html.theme--documenter-dark .button.is-warning:hover { + background-color: #d39e00; } + html.theme--documenter-dark .button.is-warning.is-active, html.theme--documenter-dark .button.is-warning.is-focused, html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning:focus { + border-color: #ad8100; + box-shadow: 0 0 0 2px rgba(173, 129, 0, 0.5); } + html.theme--documenter-dark .button.is-danger.is-hovered, html.theme--documenter-dark .button.is-danger:hover { + background-color: #c12110; } + html.theme--documenter-dark .button.is-danger.is-active, html.theme--documenter-dark .button.is-danger.is-focused, html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger:focus { + border-color: #9e1b0d; + box-shadow: 0 0 0 2px rgba(158, 27, 13, 0.5); } + html.theme--documenter-dark .label { + color: #dbdee0; } + html.theme--documenter-dark .button, + html.theme--documenter-dark .control.has-icons-left .icon, + html.theme--documenter-dark .control.has-icons-right .icon, + html.theme--documenter-dark .input, + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark .pagination-ellipsis, + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-previous, + html.theme--documenter-dark .select, + html.theme--documenter-dark .select select, + html.theme--documenter-dark .textarea { + height: 2.5em; } + html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark .textarea { + transition: all 200ms ease; + box-shadow: none; + border-width: 1px; + padding-left: 1em; + padding-right: 1em; } + html.theme--documenter-dark .select:after, + html.theme--documenter-dark .select select { + border-width: 1px; } + html.theme--documenter-dark .control.has-addons .button, + html.theme--documenter-dark .control.has-addons .input, + html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search > input, + html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search > input, + html.theme--documenter-dark .control.has-addons .select { + margin-right: -1px; } + html.theme--documenter-dark .notification { + background-color: #343c3d; } + html.theme--documenter-dark .card { + box-shadow: none; + border: 1px solid #343c3d; + background-color: #282f2f; + border-radius: 0.4em; } + html.theme--documenter-dark .card .card-image img { + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .card .card-header { + box-shadow: none; + background-color: rgba(18, 18, 18, 0.2); + border-radius: 0.4em 0.4em 0 0; } + html.theme--documenter-dark .card .card-footer { + background-color: rgba(18, 18, 18, 0.2); } + html.theme--documenter-dark .card .card-footer, + html.theme--documenter-dark .card .card-footer-item { + border-width: 1px; + border-color: #343c3d; } + html.theme--documenter-dark .notification.is-white a:not(.button) { + color: #0a0a0a; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-black a:not(.button) { + color: white; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-light a:not(.button) { + color: #282f2f; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-dark a:not(.button), html.theme--documenter-dark .content kbd.notification a:not(.button) { + color: #ecf0f1; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-primary a:not(.button), html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-link a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-info a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-success a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-warning a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .notification.is-danger a:not(.button) { + color: #fff; + text-decoration: underline; } + html.theme--documenter-dark .tag, html.theme--documenter-dark .content kbd, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + border-radius: 0.4em; } + html.theme--documenter-dark .menu-list a { + transition: all 300ms ease; } + html.theme--documenter-dark .modal-card-body { + background-color: #282f2f; } + html.theme--documenter-dark .modal-card-foot, + html.theme--documenter-dark .modal-card-head { + border-color: #343c3d; } + html.theme--documenter-dark .message-header { + font-weight: 700; + background-color: #343c3d; + color: white; } + html.theme--documenter-dark .message-body { + border-width: 1px; + border-color: #343c3d; } + html.theme--documenter-dark .navbar { + border-radius: 0.4em; } + html.theme--documenter-dark .navbar.is-transparent { + background: none; } + html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #1abc9c; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark .navbar .navbar-menu { + background-color: #375a7f; + border-radius: 0 0 0.4em 0.4em; } } + html.theme--documenter-dark .hero .navbar, + html.theme--documenter-dark body > .navbar { + border-radius: 0; } + html.theme--documenter-dark .pagination-link, + html.theme--documenter-dark .pagination-next, + html.theme--documenter-dark .pagination-previous { + border-width: 1px; } + html.theme--documenter-dark .panel-block, + html.theme--documenter-dark .panel-heading, + html.theme--documenter-dark .panel-tabs { + border-width: 1px; } + html.theme--documenter-dark .panel-block:first-child, + html.theme--documenter-dark .panel-heading:first-child, + html.theme--documenter-dark .panel-tabs:first-child { + border-top-width: 1px; } + html.theme--documenter-dark .panel-heading { + font-weight: 700; } + html.theme--documenter-dark .panel-tabs a { + border-width: 1px; + margin-bottom: -1px; } + html.theme--documenter-dark .panel-tabs a.is-active { + border-bottom-color: #17a689; } + html.theme--documenter-dark .panel-block:hover { + color: #1dd2af; } + html.theme--documenter-dark .panel-block:hover .panel-icon { + color: #1dd2af; } + html.theme--documenter-dark .panel-block.is-active .panel-icon { + color: #17a689; } + html.theme--documenter-dark .tabs a { + border-bottom-width: 1px; + margin-bottom: -1px; } + html.theme--documenter-dark .tabs ul { + border-bottom-width: 1px; } + html.theme--documenter-dark .tabs.is-boxed a { + border-width: 1px; } + html.theme--documenter-dark .tabs.is-boxed li.is-active a { + background-color: #1f2424; } + html.theme--documenter-dark .tabs.is-toggle li a { + border-width: 1px; + margin-bottom: 0; } + html.theme--documenter-dark .tabs.is-toggle li + li { + margin-left: -1px; } + html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover { + background-color: transparent; } + html.theme--documenter-dark h1 .docs-heading-anchor, html.theme--documenter-dark h1 .docs-heading-anchor:hover, html.theme--documenter-dark h1 .docs-heading-anchor:visited, html.theme--documenter-dark h2 .docs-heading-anchor, html.theme--documenter-dark h2 .docs-heading-anchor:hover, html.theme--documenter-dark h2 .docs-heading-anchor:visited, html.theme--documenter-dark h3 .docs-heading-anchor, html.theme--documenter-dark h3 .docs-heading-anchor:hover, html.theme--documenter-dark h3 .docs-heading-anchor:visited, html.theme--documenter-dark h4 .docs-heading-anchor, html.theme--documenter-dark h4 .docs-heading-anchor:hover, html.theme--documenter-dark h4 .docs-heading-anchor:visited, html.theme--documenter-dark h5 .docs-heading-anchor, html.theme--documenter-dark h5 .docs-heading-anchor:hover, html.theme--documenter-dark h5 .docs-heading-anchor:visited, html.theme--documenter-dark h6 .docs-heading-anchor, html.theme--documenter-dark h6 .docs-heading-anchor:hover, html.theme--documenter-dark h6 .docs-heading-anchor:visited { + color: #f2f2f2; } + html.theme--documenter-dark h1 .docs-heading-anchor-permalink, html.theme--documenter-dark h2 .docs-heading-anchor-permalink, html.theme--documenter-dark h3 .docs-heading-anchor-permalink, html.theme--documenter-dark h4 .docs-heading-anchor-permalink, html.theme--documenter-dark h5 .docs-heading-anchor-permalink, html.theme--documenter-dark h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; } + html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; } + html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink { + visibility: visible; } + html.theme--documenter-dark .docs-light-only { + display: none !important; } + html.theme--documenter-dark pre { + position: relative; + overflow: hidden; } + html.theme--documenter-dark pre code, html.theme--documenter-dark pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; } + html.theme--documenter-dark pre code:first-of-type, html.theme--documenter-dark pre code.hljs:first-of-type { + padding-top: 0.5rem !important; } + html.theme--documenter-dark pre code:last-of-type, html.theme--documenter-dark pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; } + html.theme--documenter-dark pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #fff; + cursor: pointer; + text-align: center; } + html.theme--documenter-dark pre .copy-button:focus, html.theme--documenter-dark pre .copy-button:hover { + opacity: 1; + background: rgba(255, 255, 255, 0.1); + color: #1abc9c; } + html.theme--documenter-dark pre .copy-button.success { + color: #259a12; + opacity: 1; } + html.theme--documenter-dark pre .copy-button.error { + color: #cb3c33; + opacity: 1; } + html.theme--documenter-dark pre:hover .copy-button { + opacity: 1; } + html.theme--documenter-dark .admonition { + background-color: #282f2f; + border-style: solid; + border-width: 1px; + border-color: #5e6d6f; + border-radius: 0.4em; + font-size: 15px; } + html.theme--documenter-dark .admonition strong { + color: currentColor; } + html.theme--documenter-dark .admonition.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.admonition { + font-size: 0.85em; } + html.theme--documenter-dark .admonition.is-medium { + font-size: 1.25rem; } + html.theme--documenter-dark .admonition.is-large { + font-size: 1.5rem; } + html.theme--documenter-dark .admonition.is-default { + background-color: #282f2f; + border-color: #5e6d6f; } + html.theme--documenter-dark .admonition.is-default > .admonition-header { + background-color: #5e6d6f; } + html.theme--documenter-dark .admonition.is-info { + background-color: #282f2f; + border-color: #024c7d; } + html.theme--documenter-dark .admonition.is-info > .admonition-header { + background-color: #024c7d; } + html.theme--documenter-dark .admonition.is-success { + background-color: #282f2f; + border-color: #008438; } + html.theme--documenter-dark .admonition.is-success > .admonition-header { + background-color: #008438; } + html.theme--documenter-dark .admonition.is-warning { + background-color: #282f2f; + border-color: #ad8100; } + html.theme--documenter-dark .admonition.is-warning > .admonition-header { + background-color: #ad8100; } + html.theme--documenter-dark .admonition.is-danger { + background-color: #282f2f; + border-color: #9e1b0d; } + html.theme--documenter-dark .admonition.is-danger > .admonition-header { + background-color: #9e1b0d; } + html.theme--documenter-dark .admonition.is-compat { + background-color: #282f2f; + border-color: #137886; } + html.theme--documenter-dark .admonition.is-compat > .admonition-header { + background-color: #137886; } + html.theme--documenter-dark .admonition-header { + background-color: #5e6d6f; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; } + html.theme--documenter-dark .admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; } + html.theme--documenter-dark .admonition-body { + color: #fff; + padding: 0.5rem 0.75rem; } + html.theme--documenter-dark .admonition-body pre { + background-color: #282f2f; } + html.theme--documenter-dark .admonition-body code { + background-color: rgba(255, 255, 255, 0.05); } + html.theme--documenter-dark .docstring { + margin-bottom: 1em; + background-color: transparent; + border: 1px solid #5e6d6f; + box-shadow: none; + max-width: 100%; } + html.theme--documenter-dark .docstring > header { + display: flex; + flex-grow: 1; + align-items: stretch; + padding: 0.5rem 0.75rem; + background-color: #282f2f; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .docstring > header code { + background-color: transparent; } + html.theme--documenter-dark .docstring > header .docstring-binding { + margin-right: 0.3em; } + html.theme--documenter-dark .docstring > header .docstring-category { + margin-left: 0.3em; } + html.theme--documenter-dark .docstring > section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #5e6d6f; } + html.theme--documenter-dark .docstring > section:last-child { + border-bottom: none; } + html.theme--documenter-dark .docstring > section > a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; } + html.theme--documenter-dark .docstring > section > a.docs-sourcelink:focus { + opacity: 1 !important; } + html.theme--documenter-dark .docstring:hover > section > a.docs-sourcelink { + opacity: 0.2; } + html.theme--documenter-dark .docstring:focus-within > section > a.docs-sourcelink { + opacity: 0.2; } + html.theme--documenter-dark .docstring > section:hover a.docs-sourcelink { + opacity: 1; } + html.theme--documenter-dark .documenter-example-output { + background-color: #1f2424; } + html.theme--documenter-dark .outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #282f2f; + border-bottom: 3px solid #9e1b0d; + padding: 10px 35px; + text-align: center; + font-size: 15px; } + html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; } + html.theme--documenter-dark .outdated-warning-overlay a { + color: #1abc9c; } + html.theme--documenter-dark .outdated-warning-overlay a:hover { + color: #1dd2af; } + html.theme--documenter-dark .content pre { + border: 1px solid #5e6d6f; } + html.theme--documenter-dark .content code { + font-weight: inherit; } + html.theme--documenter-dark .content a code { + color: #1abc9c; } + html.theme--documenter-dark .content h1 code, html.theme--documenter-dark .content h2 code, html.theme--documenter-dark .content h3 code, html.theme--documenter-dark .content h4 code, html.theme--documenter-dark .content h5 code, html.theme--documenter-dark .content h6 code { + color: #f2f2f2; } + html.theme--documenter-dark .content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; } + html.theme--documenter-dark .content blockquote > ul:first-child, html.theme--documenter-dark .content blockquote > ol:first-child, html.theme--documenter-dark .content .admonition-body > ul:first-child, html.theme--documenter-dark .content .admonition-body > ol:first-child { + margin-top: 0; } + html.theme--documenter-dark pre, html.theme--documenter-dark code { + font-variant-ligatures: no-contextual; } + html.theme--documenter-dark .breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; } + html.theme--documenter-dark .breadcrumb a.is-disabled, html.theme--documenter-dark .breadcrumb a.is-disabled:hover { + color: #f2f2f2; } + html.theme--documenter-dark .hljs { + background: initial !important; } + html.theme--documenter-dark .katex .katex-mathml { + top: 0; + right: 0; } + html.theme--documenter-dark .katex-display, html.theme--documenter-dark mjx-container, html.theme--documenter-dark .MathJax_Display { + margin: 0.5em 0 !important; } + html.theme--documenter-dark html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; } + html.theme--documenter-dark li.no-marker { + list-style: none; } + html.theme--documenter-dark #documenter .docs-main > article { + overflow-wrap: break-word; } + html.theme--documenter-dark #documenter .docs-main > article .math-container { + overflow-x: auto; + overflow-y: hidden; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-main { + max-width: 52rem; + margin-left: 20rem; + padding-right: 1rem; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main { + width: 100%; } + html.theme--documenter-dark #documenter .docs-main > article { + max-width: 52rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; } + html.theme--documenter-dark #documenter .docs-main > header, html.theme--documenter-dark #documenter .docs-main > nav { + max-width: 100%; + width: 100%; + margin: 0; } } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar { + background-color: #1f2424; + border-bottom: 1px solid #5e6d6f; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar > * { + margin: auto 0; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + /* For Headroom.js */ + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + /* Safari */ + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + /* Safari */ } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #171717; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } + html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } } + html.theme--documenter-dark #documenter .docs-main section.footnotes { + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child, html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; } + html.theme--documenter-dark #documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #5e6d6f; + padding-top: 1rem; + padding-bottom: 1rem; } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; } } + html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage, html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; } + html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; } + html.theme--documenter-dark #documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #fff; + background-color: #282f2f; + border-right: 1px solid #5e6d6f; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 15px; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; + /* Setting up a nicer theme style for the scrollbar */ } + html.theme--documenter-dark #documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #171717; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar.visible { + box-shadow: none; } } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar { + left: 0; + top: 0; } } + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { + max-height: 6rem; + margin: auto; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a, html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover { + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #5e6d6f; + display: none; + padding: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible { + display: flex; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #5e6d6f; + padding-bottom: 1.5rem; + /* Managing collapsible submenus */ } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li > .tocitem { + font-weight: bold; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li li { + font-size: 14.25px; + margin-left: 1em; + border-left: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { + display: block; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 11.25px; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { + content: "\f078"; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #fff; + background: #282f2f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #fff; + background-color: #32393a; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #5e6d6f; + border-bottom: 1px solid #5e6d6f; + background-color: #1f2424; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: #1f2424; + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #32393a; + color: #fff; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { + border-top: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #5e6d6f; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 12.75px; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; } + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { + width: 14.4rem; } + @media screen and (min-width: 1056px) { + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: .3rem; + background: none; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #3b4445; } + html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #4e5a5c; } } + @media screen and (max-width: 1055px) { + html.theme--documenter-dark #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar { + width: .3rem; + background: none; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #3b4445; } + html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #4e5a5c; } } + html.theme--documenter-dark #documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results li { + margin-left: 2rem; } + html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; } + html.theme--documenter-dark { + background-color: #1f2424; + font-size: 16px; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + html.theme--documenter-dark .ansi span.sgr1 { + font-weight: bolder; } + html.theme--documenter-dark .ansi span.sgr2 { + font-weight: lighter; } + html.theme--documenter-dark .ansi span.sgr3 { + font-style: italic; } + html.theme--documenter-dark .ansi span.sgr4 { + text-decoration: underline; } + html.theme--documenter-dark .ansi span.sgr7 { + color: #1f2424; + background-color: #fff; } + html.theme--documenter-dark .ansi span.sgr8 { + color: transparent; } + html.theme--documenter-dark .ansi span.sgr8 span { + color: transparent; } + html.theme--documenter-dark .ansi span.sgr9 { + text-decoration: line-through; } + html.theme--documenter-dark .ansi span.sgr30 { + color: #242424; } + html.theme--documenter-dark .ansi span.sgr31 { + color: #f6705f; } + html.theme--documenter-dark .ansi span.sgr32 { + color: #4fb43a; } + html.theme--documenter-dark .ansi span.sgr33 { + color: #f4c72f; } + html.theme--documenter-dark .ansi span.sgr34 { + color: #7587f0; } + html.theme--documenter-dark .ansi span.sgr35 { + color: #bc89d3; } + html.theme--documenter-dark .ansi span.sgr36 { + color: #49b6ca; } + html.theme--documenter-dark .ansi span.sgr37 { + color: #b3bdbe; } + html.theme--documenter-dark .ansi span.sgr40 { + background-color: #242424; } + html.theme--documenter-dark .ansi span.sgr41 { + background-color: #f6705f; } + html.theme--documenter-dark .ansi span.sgr42 { + background-color: #4fb43a; } + html.theme--documenter-dark .ansi span.sgr43 { + background-color: #f4c72f; } + html.theme--documenter-dark .ansi span.sgr44 { + background-color: #7587f0; } + html.theme--documenter-dark .ansi span.sgr45 { + background-color: #bc89d3; } + html.theme--documenter-dark .ansi span.sgr46 { + background-color: #49b6ca; } + html.theme--documenter-dark .ansi span.sgr47 { + background-color: #b3bdbe; } + html.theme--documenter-dark .ansi span.sgr90 { + color: #92a0a2; } + html.theme--documenter-dark .ansi span.sgr91 { + color: #ff8674; } + html.theme--documenter-dark .ansi span.sgr92 { + color: #79d462; } + html.theme--documenter-dark .ansi span.sgr93 { + color: #ffe76b; } + html.theme--documenter-dark .ansi span.sgr94 { + color: #8a98ff; } + html.theme--documenter-dark .ansi span.sgr95 { + color: #d2a4e6; } + html.theme--documenter-dark .ansi span.sgr96 { + color: #6bc8db; } + html.theme--documenter-dark .ansi span.sgr97 { + color: #ecf0f1; } + html.theme--documenter-dark .ansi span.sgr100 { + background-color: #92a0a2; } + html.theme--documenter-dark .ansi span.sgr101 { + background-color: #ff8674; } + html.theme--documenter-dark .ansi span.sgr102 { + background-color: #79d462; } + html.theme--documenter-dark .ansi span.sgr103 { + background-color: #ffe76b; } + html.theme--documenter-dark .ansi span.sgr104 { + background-color: #8a98ff; } + html.theme--documenter-dark .ansi span.sgr105 { + background-color: #d2a4e6; } + html.theme--documenter-dark .ansi span.sgr106 { + background-color: #6bc8db; } + html.theme--documenter-dark .ansi span.sgr107 { + background-color: #ecf0f1; } + html.theme--documenter-dark code.language-julia-repl > span.hljs-meta { + color: #4fb43a; + font-weight: bolder; } + html.theme--documenter-dark .hljs { + background: #2b2b2b; + color: #f8f8f2; } + html.theme--documenter-dark .hljs-comment, + html.theme--documenter-dark .hljs-quote { + color: #d4d0ab; } + html.theme--documenter-dark .hljs-variable, + html.theme--documenter-dark .hljs-template-variable, + html.theme--documenter-dark .hljs-tag, + html.theme--documenter-dark .hljs-name, + html.theme--documenter-dark .hljs-selector-id, + html.theme--documenter-dark .hljs-selector-class, + html.theme--documenter-dark .hljs-regexp, + html.theme--documenter-dark .hljs-deletion { + color: #ffa07a; } + html.theme--documenter-dark .hljs-number, + html.theme--documenter-dark .hljs-built_in, + html.theme--documenter-dark .hljs-literal, + html.theme--documenter-dark .hljs-type, + html.theme--documenter-dark .hljs-params, + html.theme--documenter-dark .hljs-meta, + html.theme--documenter-dark .hljs-link { + color: #f5ab35; } + html.theme--documenter-dark .hljs-attribute { + color: #ffd700; } + html.theme--documenter-dark .hljs-string, + html.theme--documenter-dark .hljs-symbol, + html.theme--documenter-dark .hljs-bullet, + html.theme--documenter-dark .hljs-addition { + color: #abe338; } + html.theme--documenter-dark .hljs-title, + html.theme--documenter-dark .hljs-section { + color: #00e0e0; } + html.theme--documenter-dark .hljs-keyword, + html.theme--documenter-dark .hljs-selector-tag { + color: #dcc6e0; } + html.theme--documenter-dark .hljs-emphasis { + font-style: italic; } + html.theme--documenter-dark .hljs-strong { + font-weight: bold; } + @media screen and (-ms-high-contrast: active) { + html.theme--documenter-dark .hljs-addition, + html.theme--documenter-dark .hljs-attribute, + html.theme--documenter-dark .hljs-built_in, + html.theme--documenter-dark .hljs-bullet, + html.theme--documenter-dark .hljs-comment, + html.theme--documenter-dark .hljs-link, + html.theme--documenter-dark .hljs-literal, + html.theme--documenter-dark .hljs-meta, + html.theme--documenter-dark .hljs-number, + html.theme--documenter-dark .hljs-params, + html.theme--documenter-dark .hljs-string, + html.theme--documenter-dark .hljs-symbol, + html.theme--documenter-dark .hljs-type, + html.theme--documenter-dark .hljs-quote { + color: highlight; } + html.theme--documenter-dark .hljs-keyword, + html.theme--documenter-dark .hljs-selector-tag { + font-weight: bold; } } + html.theme--documenter-dark .hljs-subst { + color: #f8f8f2; } diff --git a/v0.15.2/assets/themes/documenter-light.css b/v0.15.2/assets/themes/documenter-light.css new file mode 100644 index 00000000..9595d5b8 --- /dev/null +++ b/v0.15.2/assets/themes/documenter-light.css @@ -0,0 +1,7738 @@ +@charset "UTF-8"; +/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +.tabs, .pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .breadcrumb, .file, .button, .is-unselectable, .modal-close, .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +.admonition:not(:last-child), .tabs:not(:last-child), .message:not(:last-child), .list:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .highlight:not(:last-child), .block:not(:last-child), .title:not(:last-child), +.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { + margin-bottom: 1.5rem; } + +.modal-close, .delete { + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 290486px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + .modal-close::before, .delete::before, .modal-close::after, .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .modal-close::before, .delete::before { + height: 2px; + width: 50%; } + .modal-close::after, .delete::after { + height: 50%; + width: 2px; } + .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + .modal-close:active, .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + .is-small.modal-close, #documenter .docs-sidebar form.docs-search > input.modal-close, .is-small.delete, #documenter .docs-sidebar form.docs-search > input.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + .is-medium.modal-close, .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + .is-large.modal-close, .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 290486px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +.hero-video, .modal-background, .modal, .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, +.image.is-square .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, +.image.is-1by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, +.image.is-5by4 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, +.image.is-4by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, +.image.is-3by2 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, +.image.is-5by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, +.image.is-16by9 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, +.image.is-2by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, +.image.is-3by1 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, +.image.is-4by5 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, +.image.is-3by4 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, +.image.is-2by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, +.image.is-3by5 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, +.image.is-9by16 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, +.image.is-1by2 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, +.image.is-1by3 .has-ratio, +#documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .file-cta, +.file-name, .select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input, .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.25em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.375em - 1px); + padding-left: calc(0.625em - 1px); + padding-right: calc(0.625em - 1px); + padding-top: calc(0.375em - 1px); + position: relative; + vertical-align: top; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus, + .pagination-ellipsis:focus, .file-cta:focus, + .file-name:focus, .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .button:focus, .is-focused.pagination-previous, + .is-focused.pagination-next, + .is-focused.pagination-link, + .is-focused.pagination-ellipsis, .is-focused.file-cta, + .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-focused.button, .pagination-previous:active, + .pagination-next:active, + .pagination-link:active, + .pagination-ellipsis:active, .file-cta:active, + .file-name:active, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .button:active, .is-active.pagination-previous, + .is-active.pagination-next, + .is-active.pagination-link, + .is-active.pagination-ellipsis, .is-active.file-cta, + .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .is-active.button { + outline: none; } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled], + .pagination-ellipsis[disabled], .file-cta[disabled], + .file-name[disabled], .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], .button[disabled], fieldset[disabled] .pagination-previous, + fieldset[disabled] .pagination-next, + fieldset[disabled] .pagination-link, + fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, + fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] .button { + cursor: not-allowed; } + +/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +embed, +iframe, +object, +video { + height: auto; + max-width: 100%; } + +audio { + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: left; } + +html { + background-color: white; + font-size: 16px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: auto; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; } + +body, +button, +input, +select, +textarea { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } + +body { + color: #222222; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + +a { + color: #2e63b8; + cursor: pointer; + text-decoration: none; } + a strong { + color: currentColor; } + a:hover { + color: #363636; } + +code { + background-color: rgba(0, 0, 0, 0.05); + color: #000000; + font-size: 0.875em; + font-weight: normal; + padding: 0.1em; } + +hr { + background-color: whitesmoke; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + +img { + height: auto; + max-width: 100%; } + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; } + +small { + font-size: 0.875em; } + +span { + font-style: inherit; + font-weight: inherit; } + +strong { + color: #222222; + font-weight: 700; } + +fieldset { + border: none; } + +pre { + -webkit-overflow-scrolling: touch; + background-color: whitesmoke; + color: #222222; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + +table td, +table th { + vertical-align: top; } + table td:not([align]), + table th:not([align]) { + text-align: left; } + +table th { + color: #222222; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 1rem !important; } + +.is-size-7, .docstring > section > a.docs-sourcelink { + font-size: 0.75rem !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 1rem !important; } + .is-size-7-mobile { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 1rem !important; } + .is-size-7-tablet { + font-size: 0.75rem !important; } } + +@media screen and (max-width: 1055px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 1rem !important; } + .is-size-7-touch { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1056px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 1rem !important; } + .is-size-7-desktop { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 1rem !important; } + .is-size-7-widescreen { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 1rem !important; } + .is-size-7-fullhd { + font-size: 0.75rem !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1055px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1056px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1055px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1055px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1056px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1055px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1056px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: whitesmoke !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #dbdbdb !important; } + +.has-background-light { + background-color: whitesmoke !important; } + +.has-text-dark { + color: #363636 !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #1c1c1c !important; } + +.has-background-dark { + background-color: #363636 !important; } + +.has-text-primary { + color: #4eb5de !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #27a1d2 !important; } + +.has-background-primary { + background-color: #4eb5de !important; } + +.has-text-link { + color: #2e63b8 !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #244d8f !important; } + +.has-background-link { + background-color: #2e63b8 !important; } + +.has-text-info { + color: #209cee !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #1081cb !important; } + +.has-background-info { + background-color: #209cee !important; } + +.has-text-success { + color: #22c35b !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #1a9847 !important; } + +.has-background-success { + background-color: #22c35b !important; } + +.has-text-warning { + color: #ffdd57 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #ffd324 !important; } + +.has-background-warning { + background-color: #ffdd57 !important; } + +.has-text-danger { + color: #da0b00 !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #a70800 !important; } + +.has-background-danger { + background-color: #da0b00 !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #363636 !important; } + +.has-background-grey-darker { + background-color: #363636 !important; } + +.has-text-grey-dark { + color: #4a4a4a !important; } + +.has-background-grey-dark { + background-color: #4a4a4a !important; } + +.has-text-grey { + color: #6b6b6b !important; } + +.has-background-grey { + background-color: #6b6b6b !important; } + +.has-text-grey-light { + color: #b5b5b5 !important; } + +.has-background-grey-light { + background-color: #b5b5b5 !important; } + +.has-text-grey-lighter { + color: #dbdbdb !important; } + +.has-background-grey-lighter { + background-color: #dbdbdb !important; } + +.has-text-white-ter { + color: whitesmoke !important; } + +.has-background-white-ter { + background-color: whitesmoke !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-family-code { + font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1055px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1056px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1055px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1056px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1055px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1055px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1056px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1055px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1055px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1056px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-relative { + position: relative !important; } + +.box { + background-color: white; + border-radius: 6px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222222; + display: block; + padding: 1.25rem; } + +a.box:hover, a.box:focus { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; } + +a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; } + +.button { + background-color: white; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.375em - 1px); + padding-left: 0.75em; + padding-right: 0.75em; + padding-top: calc(0.375em - 1px); + text-align: center; + white-space: nowrap; } + .button strong { + color: inherit; } + .button .icon, .button .icon.is-small, .button #documenter .docs-sidebar form.docs-search > input.icon, #documenter .docs-sidebar .button form.docs-search > input.icon, .button .icon.is-medium, .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.375em - 1px); + margin-right: 0.1875em; } + .button .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: calc(-0.375em - 1px); } + .button .icon:first-child:last-child { + margin-left: calc(-0.375em - 1px); + margin-right: calc(-0.375em - 1px); } + .button:hover, .button.is-hovered { + border-color: #b5b5b5; + color: #363636; } + .button:focus, .button.is-focused { + border-color: #3c5dcd; + color: #363636; } + .button:focus:not(:active), .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .button:active, .button.is-active { + border-color: #4a4a4a; + color: #363636; } + .button.is-text { + background-color: transparent; + border-color: transparent; + color: #222222; + text-decoration: underline; } + .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { + background-color: whitesmoke; + color: #222222; } + .button.is-text:active, .button.is-text.is-active { + background-color: #e8e8e8; + color: #222222; } + .button.is-text[disabled], fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:hover, .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .button.is-white:active, .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .button.is-white[disabled], fieldset[disabled] .button.is-white { + background-color: white; + border-color: transparent; + box-shadow: none; } + .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { + background-color: black; } + .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .button.is-black:hover, .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + .button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + color: white; } + .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black[disabled], fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-light { + background-color: whitesmoke; + border-color: transparent; + color: #363636; } + .button.is-light:hover, .button.is-light.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: #363636; } + .button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + color: #363636; } + .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .button.is-light:active, .button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; } + .button.is-light[disabled], fieldset[disabled] .button.is-light { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; } + .button.is-light.is-inverted { + background-color: #363636; + color: whitesmoke; } + .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { + background-color: #292929; } + .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { + background-color: #363636; + border-color: transparent; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { + background-color: #363636; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark, .content kbd.button { + background-color: #363636; + border-color: transparent; + color: whitesmoke; } + .button.is-dark:hover, .content kbd.button:hover, .button.is-dark.is-hovered, .content kbd.button.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; } + .button.is-dark:focus, .content kbd.button:focus, .button.is-dark.is-focused, .content kbd.button.is-focused { + border-color: transparent; + color: whitesmoke; } + .button.is-dark:focus:not(:active), .content kbd.button:focus:not(:active), .button.is-dark.is-focused:not(:active), .content kbd.button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .button.is-dark:active, .content kbd.button:active, .button.is-dark.is-active, .content kbd.button.is-active { + background-color: #292929; + border-color: transparent; + color: whitesmoke; } + .button.is-dark[disabled], .content kbd.button[disabled], fieldset[disabled] .button.is-dark, fieldset[disabled] .content kbd.button, .content fieldset[disabled] kbd.button { + background-color: #363636; + border-color: transparent; + box-shadow: none; } + .button.is-dark.is-inverted, .content kbd.button.is-inverted { + background-color: whitesmoke; + color: #363636; } + .button.is-dark.is-inverted:hover, .content kbd.button.is-inverted:hover, .button.is-dark.is-inverted.is-hovered, .content kbd.button.is-inverted.is-hovered { + background-color: #e8e8e8; } + .button.is-dark.is-inverted[disabled], .content kbd.button.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted, fieldset[disabled] .content kbd.button.is-inverted, .content fieldset[disabled] kbd.button.is-inverted { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; + color: #363636; } + .button.is-dark.is-loading::after, .content kbd.button.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-dark.is-outlined, .content kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-dark.is-outlined:hover, .content kbd.button.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .content kbd.button.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .content kbd.button.is-outlined:focus, .button.is-dark.is-outlined.is-focused, .content kbd.button.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .button.is-dark.is-outlined.is-loading::after, .content kbd.button.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-outlined.is-loading:hover::after, .content kbd.button.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .content kbd.button.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after, .content kbd.button.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-dark.is-outlined[disabled], .content kbd.button.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined, fieldset[disabled] .content kbd.button.is-outlined, .content fieldset[disabled] kbd.button.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark.is-inverted.is-outlined, .content kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-dark.is-inverted.is-outlined:hover, .content kbd.button.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .content kbd.button.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .content kbd.button.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused, .content kbd.button.is-inverted.is-outlined.is-focused { + background-color: whitesmoke; + color: #363636; } + .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-inverted.is-outlined[disabled], .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined, fieldset[disabled] .content kbd.button.is-inverted.is-outlined, .content fieldset[disabled] kbd.button.is-inverted.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-primary, .docstring > section > a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + color: #fff; } + .button.is-primary:hover, .docstring > section > a.button.docs-sourcelink:hover, .button.is-primary.is-hovered, .docstring > section > a.button.is-hovered.docs-sourcelink { + background-color: #43b1dc; + border-color: transparent; + color: #fff; } + .button.is-primary:focus, .docstring > section > a.button.docs-sourcelink:focus, .button.is-primary.is-focused, .docstring > section > a.button.is-focused.docs-sourcelink { + border-color: transparent; + color: #fff; } + .button.is-primary:focus:not(:active), .docstring > section > a.button.docs-sourcelink:focus:not(:active), .button.is-primary.is-focused:not(:active), .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .button.is-primary:active, .docstring > section > a.button.docs-sourcelink:active, .button.is-primary.is-active, .docstring > section > a.button.is-active.docs-sourcelink { + background-color: #39acda; + border-color: transparent; + color: #fff; } + .button.is-primary[disabled], .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary, fieldset[disabled] .docstring > section > a.button.docs-sourcelink { + background-color: #4eb5de; + border-color: transparent; + box-shadow: none; } + .button.is-primary.is-inverted, .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + color: #4eb5de; } + .button.is-primary.is-inverted:hover, .docstring > section > a.button.is-inverted.docs-sourcelink:hover, .button.is-primary.is-inverted.is-hovered, .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { + background-color: #f2f2f2; } + .button.is-primary.is-inverted[disabled], .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted, fieldset[disabled] .docstring > section > a.button.is-inverted.docs-sourcelink { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #4eb5de; } + .button.is-primary.is-loading::after, .docstring > section > a.button.is-loading.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined, .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + color: #4eb5de; } + .button.is-primary.is-outlined:hover, .docstring > section > a.button.is-outlined.docs-sourcelink:hover, .button.is-primary.is-outlined.is-hovered, .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-outlined:focus, .docstring > section > a.button.is-outlined.docs-sourcelink:focus, .button.is-primary.is-outlined.is-focused, .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; } + .button.is-primary.is-outlined.is-loading::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; } + .button.is-primary.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined[disabled], .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-outlined, fieldset[disabled] .docstring > section > a.button.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #4eb5de; + box-shadow: none; + color: #4eb5de; } + .button.is-primary.is-inverted.is-outlined, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-primary.is-inverted.is-outlined:hover, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-inverted.is-outlined:focus, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, .button.is-primary.is-inverted.is-outlined.is-focused, .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { + background-color: #fff; + color: #4eb5de; } + .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { + border-color: transparent transparent #4eb5de #4eb5de !important; } + .button.is-primary.is-inverted.is-outlined[disabled], .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined, fieldset[disabled] .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-link { + background-color: #2e63b8; + border-color: transparent; + color: #fff; } + .button.is-link:hover, .button.is-link.is-hovered { + background-color: #2b5eae; + border-color: transparent; + color: #fff; } + .button.is-link:focus, .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .button.is-link:active, .button.is-link.is-active { + background-color: #2958a4; + border-color: transparent; + color: #fff; } + .button.is-link[disabled], fieldset[disabled] .button.is-link { + background-color: #2e63b8; + border-color: transparent; + box-shadow: none; } + .button.is-link.is-inverted { + background-color: #fff; + color: #2e63b8; } + .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #2e63b8; } + .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + color: #2e63b8; } + .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; } + .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #2e63b8; + box-shadow: none; + color: #2e63b8; } + .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #2e63b8; } + .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #2e63b8 #2e63b8 !important; } + .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-info { + background-color: #209cee; + border-color: transparent; + color: #fff; } + .button.is-info:hover, .button.is-info.is-hovered { + background-color: #1497ed; + border-color: transparent; + color: #fff; } + .button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .button.is-info:active, .button.is-info.is-active { + background-color: #1190e3; + border-color: transparent; + color: #fff; } + .button.is-info[disabled], fieldset[disabled] .button.is-info { + background-color: #209cee; + border-color: transparent; + box-shadow: none; } + .button.is-info.is-inverted { + background-color: #fff; + color: #209cee; } + .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #209cee; } + .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + color: #209cee; } + .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { + background-color: #209cee; + border-color: #209cee; + color: #fff; } + .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #209cee #209cee !important; } + .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #209cee; + box-shadow: none; + color: #209cee; } + .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #209cee; } + .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #209cee #209cee !important; } + .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-success { + background-color: #22c35b; + border-color: transparent; + color: #fff; } + .button.is-success:hover, .button.is-success.is-hovered { + background-color: #20b856; + border-color: transparent; + color: #fff; } + .button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + color: #fff; } + .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .button.is-success:active, .button.is-success.is-active { + background-color: #1ead51; + border-color: transparent; + color: #fff; } + .button.is-success[disabled], fieldset[disabled] .button.is-success { + background-color: #22c35b; + border-color: transparent; + box-shadow: none; } + .button.is-success.is-inverted { + background-color: #fff; + color: #22c35b; } + .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #22c35b; } + .button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + color: #22c35b; } + .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; } + .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #22c35b #22c35b !important; } + .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #22c35b; + box-shadow: none; + color: #22c35b; } + .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #22c35b; } + .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #22c35b #22c35b !important; } + .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .button.is-warning:active, .button.is-warning.is-active { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning[disabled], fieldset[disabled] .button.is-warning { + background-color: #ffdd57; + border-color: transparent; + box-shadow: none; } + .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #ffdd57; } + .button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + color: #ffdd57; } + .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; } + .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffdd57; + box-shadow: none; + color: #ffdd57; } + .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ffdd57 #ffdd57 !important; } + .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-danger { + background-color: #da0b00; + border-color: transparent; + color: #fff; } + .button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #cd0a00; + border-color: transparent; + color: #fff; } + .button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .button.is-danger:active, .button.is-danger.is-active { + background-color: #c10a00; + border-color: transparent; + color: #fff; } + .button.is-danger[disabled], fieldset[disabled] .button.is-danger { + background-color: #da0b00; + border-color: transparent; + box-shadow: none; } + .button.is-danger.is-inverted { + background-color: #fff; + color: #da0b00; } + .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #da0b00; } + .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + color: #da0b00; } + .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; } + .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #da0b00 #da0b00 !important; } + .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #da0b00; + box-shadow: none; + color: #da0b00; } + .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #da0b00; } + .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #da0b00 #da0b00 !important; } + .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-small, #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 2px; + font-size: 0.75rem; } + .button.is-normal { + font-size: 1rem; } + .button.is-medium { + font-size: 1.25rem; } + .button.is-large { + font-size: 1.5rem; } + .button[disabled], fieldset[disabled] .button { + background-color: white; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; } + .button.is-fullwidth { + display: flex; + width: 100%; } + .button.is-loading { + color: transparent !important; + pointer-events: none; } + .button.is-loading::after { + position: absolute; + left: calc(50% - (1em / 2)); + top: calc(50% - (1em / 2)); + position: absolute !important; } + .button.is-static { + background-color: whitesmoke; + border-color: #dbdbdb; + color: #6b6b6b; + box-shadow: none; + pointer-events: none; } + .button.is-rounded, #documenter .docs-sidebar form.docs-search > input.button { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .buttons .button { + margin-bottom: 0.5rem; } + .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + .buttons:last-child { + margin-bottom: -0.5rem; } + .buttons:not(:last-child) { + margin-bottom: 1rem; } + .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + border-radius: 2px; + font-size: 0.75rem; } + .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + .buttons.has-addons .button:last-child { + margin-right: 0; } + .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { + z-index: 2; } + .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { + z-index: 3; } + .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .buttons.is-centered { + justify-content: center; } + .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + .buttons.is-right { + justify-content: flex-end; } + .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + @media screen and (min-width: 1056px) { + .container { + max-width: 992px; } + .container.is-fluid { + margin-left: 32px; + margin-right: 32px; + max-width: none; } } + @media screen and (max-width: 1215px) { + .container.is-widescreen { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + .container.is-fullhd { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + .container { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + .container { + max-width: 1344px; } } +.content li + li { + margin-top: 0.25em; } + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; } + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #222222; + font-weight: 600; + line-height: 1.125; } + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + .content h1:not(:first-child) { + margin-top: 1em; } + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + .content h2:not(:first-child) { + margin-top: 1.1428em; } + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + .content h3:not(:first-child) { + margin-top: 1.3333em; } + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + +.content h6 { + font-size: 1em; + margin-bottom: 1em; } + +.content blockquote { + background-color: whitesmoke; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; } + +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + .content ol:not([type]) { + list-style-type: decimal; } + .content ol.is-lower-alpha:not([type]) { + list-style-type: lower-alpha; } + .content ol.is-lower-roman:not([type]) { + list-style-type: lower-roman; } + .content ol.is-upper-alpha:not([type]) { + list-style-type: upper-alpha; } + .content ol.is-upper-roman:not([type]) { + list-style-type: upper-roman; } + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + .content ul ul ul { + list-style-type: square; } + +.content dd { + margin-left: 2em; } + +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + .content figure:not(:first-child) { + margin-top: 2em; } + .content figure:not(:last-child) { + margin-bottom: 2em; } + .content figure img { + display: inline-block; } + .content figure figcaption { + font-style: italic; } + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 0; + white-space: pre; + word-wrap: normal; } + +.content sup, +.content sub { + font-size: 75%; } + +.content table { + width: 100%; } + .content table td, + .content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .content table th { + color: #222222; } + .content table th:not([align]) { + text-align: left; } + .content table thead td, + .content table thead th { + border-width: 0 0 2px; + color: #222222; } + .content table tfoot td, + .content table tfoot th { + border-width: 2px 0 0; + color: #222222; } + .content table tbody tr:last-child td, + .content table tbody tr:last-child th { + border-bottom-width: 0; } + +.content .tabs li + li { + margin-top: 0; } + +.content.is-small, #documenter .docs-sidebar form.docs-search > input.content { + font-size: 0.75rem; } + +.content.is-medium { + font-size: 1.25rem; } + +.content.is-large { + font-size: 1.5rem; } + +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + .icon.is-small, #documenter .docs-sidebar form.docs-search > input.icon { + height: 1rem; + width: 1rem; } + .icon.is-medium { + height: 2rem; + width: 2rem; } + .icon.is-large { + height: 3rem; + width: 3rem; } + +.image, #documenter .docs-sidebar .docs-logo > img { + display: block; + position: relative; } + .image img, #documenter .docs-sidebar .docs-logo > img img { + display: block; + height: auto; + width: 100%; } + .image img.is-rounded, #documenter .docs-sidebar .docs-logo > img img.is-rounded { + border-radius: 290486px; } + .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, + .image.is-square .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, + .image.is-1by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, + .image.is-5by4 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, + .image.is-4by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, + .image.is-3by2 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, + .image.is-5by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, + .image.is-16by9 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, + .image.is-2by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, + .image.is-3by1 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, + .image.is-4by5 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, + .image.is-3by4 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, + .image.is-2by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, + .image.is-3by5 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, + .image.is-9by16 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, + .image.is-1by2 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, + .image.is-1by3 .has-ratio, + #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + .image.is-square, #documenter .docs-sidebar .docs-logo > img.is-square, .image.is-1by1, #documenter .docs-sidebar .docs-logo > img.is-1by1 { + padding-top: 100%; } + .image.is-5by4, #documenter .docs-sidebar .docs-logo > img.is-5by4 { + padding-top: 80%; } + .image.is-4by3, #documenter .docs-sidebar .docs-logo > img.is-4by3 { + padding-top: 75%; } + .image.is-3by2, #documenter .docs-sidebar .docs-logo > img.is-3by2 { + padding-top: 66.6666%; } + .image.is-5by3, #documenter .docs-sidebar .docs-logo > img.is-5by3 { + padding-top: 60%; } + .image.is-16by9, #documenter .docs-sidebar .docs-logo > img.is-16by9 { + padding-top: 56.25%; } + .image.is-2by1, #documenter .docs-sidebar .docs-logo > img.is-2by1 { + padding-top: 50%; } + .image.is-3by1, #documenter .docs-sidebar .docs-logo > img.is-3by1 { + padding-top: 33.3333%; } + .image.is-4by5, #documenter .docs-sidebar .docs-logo > img.is-4by5 { + padding-top: 125%; } + .image.is-3by4, #documenter .docs-sidebar .docs-logo > img.is-3by4 { + padding-top: 133.3333%; } + .image.is-2by3, #documenter .docs-sidebar .docs-logo > img.is-2by3 { + padding-top: 150%; } + .image.is-3by5, #documenter .docs-sidebar .docs-logo > img.is-3by5 { + padding-top: 166.6666%; } + .image.is-9by16, #documenter .docs-sidebar .docs-logo > img.is-9by16 { + padding-top: 177.7777%; } + .image.is-1by2, #documenter .docs-sidebar .docs-logo > img.is-1by2 { + padding-top: 200%; } + .image.is-1by3, #documenter .docs-sidebar .docs-logo > img.is-1by3 { + padding-top: 300%; } + .image.is-16x16, #documenter .docs-sidebar .docs-logo > img.is-16x16 { + height: 16px; + width: 16px; } + .image.is-24x24, #documenter .docs-sidebar .docs-logo > img.is-24x24 { + height: 24px; + width: 24px; } + .image.is-32x32, #documenter .docs-sidebar .docs-logo > img.is-32x32 { + height: 32px; + width: 32px; } + .image.is-48x48, #documenter .docs-sidebar .docs-logo > img.is-48x48 { + height: 48px; + width: 48px; } + .image.is-64x64, #documenter .docs-sidebar .docs-logo > img.is-64x64 { + height: 64px; + width: 64px; } + .image.is-96x96, #documenter .docs-sidebar .docs-logo > img.is-96x96 { + height: 96px; + width: 96px; } + .image.is-128x128, #documenter .docs-sidebar .docs-logo > img.is-128x128 { + height: 128px; + width: 128px; } + +.notification { + background-color: whitesmoke; + border-radius: 4px; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; + position: relative; } + .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .notification strong { + color: currentColor; } + .notification code, + .notification pre { + background: white; } + .notification pre code { + background: transparent; } + .notification > .delete { + position: absolute; + right: 0.5rem; + top: 0.5rem; } + .notification .title, + .notification .subtitle, + .notification .content { + color: currentColor; } + .notification.is-white { + background-color: white; + color: #0a0a0a; } + .notification.is-black { + background-color: #0a0a0a; + color: white; } + .notification.is-light { + background-color: whitesmoke; + color: #363636; } + .notification.is-dark, .content kbd.notification { + background-color: #363636; + color: whitesmoke; } + .notification.is-primary, .docstring > section > a.notification.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .notification.is-link { + background-color: #2e63b8; + color: #fff; } + .notification.is-info { + background-color: #209cee; + color: #fff; } + .notification.is-success { + background-color: #22c35b; + color: #fff; } + .notification.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .notification.is-danger { + background-color: #da0b00; + color: #fff; } + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 290486px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; } + .progress::-webkit-progress-bar { + background-color: #dbdbdb; } + .progress::-webkit-progress-value { + background-color: #222222; } + .progress::-moz-progress-bar { + background-color: #222222; } + .progress::-ms-fill { + background-color: #222222; + border: none; } + .progress.is-white::-webkit-progress-value { + background-color: white; } + .progress.is-white::-moz-progress-bar { + background-color: white; } + .progress.is-white::-ms-fill { + background-color: white; } + .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); } + .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); } + .progress.is-light::-webkit-progress-value { + background-color: whitesmoke; } + .progress.is-light::-moz-progress-bar { + background-color: whitesmoke; } + .progress.is-light::-ms-fill { + background-color: whitesmoke; } + .progress.is-light:indeterminate { + background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); } + .progress.is-dark::-webkit-progress-value, .content kbd.progress::-webkit-progress-value { + background-color: #363636; } + .progress.is-dark::-moz-progress-bar, .content kbd.progress::-moz-progress-bar { + background-color: #363636; } + .progress.is-dark::-ms-fill, .content kbd.progress::-ms-fill { + background-color: #363636; } + .progress.is-dark:indeterminate, .content kbd.progress:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); } + .progress.is-primary::-webkit-progress-value, .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { + background-color: #4eb5de; } + .progress.is-primary::-moz-progress-bar, .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { + background-color: #4eb5de; } + .progress.is-primary::-ms-fill, .docstring > section > a.progress.docs-sourcelink::-ms-fill { + background-color: #4eb5de; } + .progress.is-primary:indeterminate, .docstring > section > a.progress.docs-sourcelink:indeterminate { + background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); } + .progress.is-link::-webkit-progress-value { + background-color: #2e63b8; } + .progress.is-link::-moz-progress-bar { + background-color: #2e63b8; } + .progress.is-link::-ms-fill { + background-color: #2e63b8; } + .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); } + .progress.is-info::-webkit-progress-value { + background-color: #209cee; } + .progress.is-info::-moz-progress-bar { + background-color: #209cee; } + .progress.is-info::-ms-fill { + background-color: #209cee; } + .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); } + .progress.is-success::-webkit-progress-value { + background-color: #22c35b; } + .progress.is-success::-moz-progress-bar { + background-color: #22c35b; } + .progress.is-success::-ms-fill { + background-color: #22c35b; } + .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); } + .progress.is-warning::-webkit-progress-value { + background-color: #ffdd57; } + .progress.is-warning::-moz-progress-bar { + background-color: #ffdd57; } + .progress.is-warning::-ms-fill { + background-color: #ffdd57; } + .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); } + .progress.is-danger::-webkit-progress-value { + background-color: #da0b00; } + .progress.is-danger::-moz-progress-bar { + background-color: #da0b00; } + .progress.is-danger::-ms-fill { + background-color: #da0b00; } + .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); } + .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #dbdbdb; + background-image: linear-gradient(to right, #222222 30%, #dbdbdb 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + .progress.is-small, #documenter .docs-sidebar form.docs-search > input.progress { + height: 0.75rem; } + .progress.is-medium { + height: 1.25rem; } + .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + +.table { + background-color: white; + color: #363636; } + .table td, + .table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .table td.is-white, + .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + .table td.is-black, + .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .table td.is-light, + .table th.is-light { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .table td.is-dark, + .table th.is-dark { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .table td.is-primary, + .table th.is-primary { + background-color: #4eb5de; + border-color: #4eb5de; + color: #fff; } + .table td.is-link, + .table th.is-link { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + .table td.is-info, + .table th.is-info { + background-color: #209cee; + border-color: #209cee; + color: #fff; } + .table td.is-success, + .table th.is-success { + background-color: #22c35b; + border-color: #22c35b; + color: #fff; } + .table td.is-warning, + .table th.is-warning { + background-color: #ffdd57; + border-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .table td.is-danger, + .table th.is-danger { + background-color: #da0b00; + border-color: #da0b00; + color: #fff; } + .table td.is-narrow, + .table th.is-narrow { + white-space: nowrap; + width: 1%; } + .table td.is-selected, + .table th.is-selected { + background-color: #4eb5de; + color: #fff; } + .table td.is-selected a, + .table td.is-selected strong, + .table th.is-selected a, + .table th.is-selected strong { + color: currentColor; } + .table th { + color: #222222; } + .table th:not([align]) { + text-align: left; } + .table tr.is-selected { + background-color: #4eb5de; + color: #fff; } + .table tr.is-selected a, + .table tr.is-selected strong { + color: currentColor; } + .table tr.is-selected td, + .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + .table thead { + background-color: transparent; } + .table thead td, + .table thead th { + border-width: 0 0 2px; + color: #222222; } + .table tfoot { + background-color: transparent; } + .table tfoot td, + .table tfoot th { + border-width: 2px 0 0; + color: #222222; } + .table tbody { + background-color: transparent; } + .table tbody tr:last-child td, + .table tbody tr:last-child th { + border-bottom-width: 0; } + .table.is-bordered td, + .table.is-bordered th { + border-width: 1px; } + .table.is-bordered tr:last-child td, + .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + .table.is-fullwidth { + width: 100%; } + .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: whitesmoke; } + .table.is-narrow td, + .table.is-narrow th { + padding: 0.25em 0.5em; } + .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; } + +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .tags .tag, .tags .content kbd, .content .tags kbd, .tags .docstring > section > a.docs-sourcelink { + margin-bottom: 0.5rem; } + .tags .tag:not(:last-child), .tags .content kbd:not(:last-child), .content .tags kbd:not(:last-child), .tags .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0.5rem; } + .tags:last-child { + margin-bottom: -0.5rem; } + .tags:not(:last-child) { + margin-bottom: 1rem; } + .tags.are-medium .tag:not(.is-normal):not(.is-large), .tags.are-medium .content kbd:not(.is-normal):not(.is-large), .content .tags.are-medium kbd:not(.is-normal):not(.is-large), .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { + font-size: 1rem; } + .tags.are-large .tag:not(.is-normal):not(.is-medium), .tags.are-large .content kbd:not(.is-normal):not(.is-medium), .content .tags.are-large kbd:not(.is-normal):not(.is-medium), .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + .tags.is-centered { + justify-content: center; } + .tags.is-centered .tag, .tags.is-centered .content kbd, .content .tags.is-centered kbd, .tags.is-centered .docstring > section > a.docs-sourcelink { + margin-right: 0.25rem; + margin-left: 0.25rem; } + .tags.is-right { + justify-content: flex-end; } + .tags.is-right .tag:not(:first-child), .tags.is-right .content kbd:not(:first-child), .content .tags.is-right kbd:not(:first-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0.5rem; } + .tags.is-right .tag:not(:last-child), .tags.is-right .content kbd:not(:last-child), .content .tags.is-right kbd:not(:last-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { + margin-right: 0; } + .tags.has-addons .tag, .tags.has-addons .content kbd, .content .tags.has-addons kbd, .tags.has-addons .docstring > section > a.docs-sourcelink { + margin-right: 0; } + .tags.has-addons .tag:not(:first-child), .tags.has-addons .content kbd:not(:first-child), .content .tags.has-addons kbd:not(:first-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .tags.has-addons .tag:not(:last-child), .tags.has-addons .content kbd:not(:last-child), .content .tags.has-addons kbd:not(:last-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.tag:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink:not(body) { + align-items: center; + background-color: whitesmoke; + border-radius: 4px; + color: #222222; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + .tag:not(body) .delete, .content kbd:not(body) .delete, .docstring > section > a.docs-sourcelink:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + .tag.is-white:not(body), .content kbd.is-white:not(body), .docstring > section > a.docs-sourcelink.is-white:not(body) { + background-color: white; + color: #0a0a0a; } + .tag.is-black:not(body), .content kbd.is-black:not(body), .docstring > section > a.docs-sourcelink.is-black:not(body) { + background-color: #0a0a0a; + color: white; } + .tag.is-light:not(body), .content kbd.is-light:not(body), .docstring > section > a.docs-sourcelink.is-light:not(body) { + background-color: whitesmoke; + color: #363636; } + .tag.is-dark:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink.is-dark:not(body), .content .docstring > section > kbd:not(body) { + background-color: #363636; + color: whitesmoke; } + .tag.is-primary:not(body), .content kbd.is-primary:not(body), .docstring > section > a.docs-sourcelink:not(body) { + background-color: #4eb5de; + color: #fff; } + .tag.is-link:not(body), .content kbd.is-link:not(body), .docstring > section > a.docs-sourcelink.is-link:not(body) { + background-color: #2e63b8; + color: #fff; } + .tag.is-info:not(body), .content kbd.is-info:not(body), .docstring > section > a.docs-sourcelink.is-info:not(body) { + background-color: #209cee; + color: #fff; } + .tag.is-success:not(body), .content kbd.is-success:not(body), .docstring > section > a.docs-sourcelink.is-success:not(body) { + background-color: #22c35b; + color: #fff; } + .tag.is-warning:not(body), .content kbd.is-warning:not(body), .docstring > section > a.docs-sourcelink.is-warning:not(body) { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .tag.is-danger:not(body), .content kbd.is-danger:not(body), .docstring > section > a.docs-sourcelink.is-danger:not(body) { + background-color: #da0b00; + color: #fff; } + .tag.is-normal:not(body), .content kbd.is-normal:not(body), .docstring > section > a.docs-sourcelink.is-normal:not(body) { + font-size: 0.75rem; } + .tag.is-medium:not(body), .content kbd.is-medium:not(body), .docstring > section > a.docs-sourcelink.is-medium:not(body) { + font-size: 1rem; } + .tag.is-large:not(body), .content kbd.is-large:not(body), .docstring > section > a.docs-sourcelink.is-large:not(body) { + font-size: 1.25rem; } + .tag:not(body) .icon:first-child:not(:last-child), .content kbd:not(body) .icon:first-child:not(:last-child), .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + .tag:not(body) .icon:last-child:not(:first-child), .content kbd:not(body) .icon:last-child:not(:first-child), .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + .tag:not(body) .icon:first-child:last-child, .content kbd:not(body) .icon:first-child:last-child, .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + .tag.is-delete:not(body), .content kbd.is-delete:not(body), .docstring > section > a.docs-sourcelink.is-delete:not(body) { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { + height: 1px; + width: 50%; } + .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { + height: 50%; + width: 1px; } + .tag.is-delete:not(body):hover, .content kbd.is-delete:not(body):hover, .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, .tag.is-delete:not(body):focus, .content kbd.is-delete:not(body):focus, .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { + background-color: #e8e8e8; } + .tag.is-delete:not(body):active, .content kbd.is-delete:not(body):active, .docstring > section > a.docs-sourcelink.is-delete:not(body):active { + background-color: #dbdbdb; } + .tag.is-rounded:not(body), #documenter .docs-sidebar form.docs-search > input:not(body), .content kbd.is-rounded:not(body), #documenter .docs-sidebar .content form.docs-search > input:not(body), .docstring > section > a.docs-sourcelink.is-rounded:not(body) { + border-radius: 290486px; } + +a.tag:hover, .docstring > section > a.docs-sourcelink:hover { + text-decoration: underline; } + +.title, +.subtitle { + word-break: break-word; } + .title em, + .title span, + .subtitle em, + .subtitle span { + font-weight: inherit; } + .title sub, + .subtitle sub { + font-size: 0.75em; } + .title sup, + .subtitle sup { + font-size: 0.75em; } + .title .tag, .title .content kbd, .content .title kbd, .title .docstring > section > a.docs-sourcelink, + .subtitle .tag, + .subtitle .content kbd, + .content .subtitle kbd, + .subtitle .docstring > section > a.docs-sourcelink { + vertical-align: middle; } + +.title { + color: #363636; + font-size: 2rem; + font-weight: 600; + line-height: 1.125; } + .title strong { + color: inherit; + font-weight: inherit; } + .title + .highlight { + margin-top: -0.75rem; } + .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + .title.is-1 { + font-size: 3rem; } + .title.is-2 { + font-size: 2.5rem; } + .title.is-3 { + font-size: 2rem; } + .title.is-4 { + font-size: 1.5rem; } + .title.is-5 { + font-size: 1.25rem; } + .title.is-6 { + font-size: 1rem; } + .title.is-7 { + font-size: 0.75rem; } + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + .subtitle strong { + color: #363636; + font-weight: 600; } + .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + .subtitle.is-1 { + font-size: 3rem; } + .subtitle.is-2 { + font-size: 2.5rem; } + .subtitle.is-3 { + font-size: 2rem; } + .subtitle.is-4 { + font-size: 1.5rem; } + .subtitle.is-5 { + font-size: 1.25rem; } + .subtitle.is-6 { + font-size: 1rem; } + .subtitle.is-7 { + font-size: 0.75rem; } + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + +.highlight { + font-weight: 400; + max-width: 100%; + overflow: hidden; + padding: 0; } + .highlight pre { + overflow: auto; + max-width: 100%; } + +.number { + align-items: center; + background-color: whitesmoke; + border-radius: 290486px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + +.select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input { + background-color: white; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; } + .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:hover, .textarea:hover, .input:hover, #documenter .docs-sidebar form.docs-search > input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input, #documenter .docs-sidebar form.docs-search > input.is-hovered { + border-color: #b5b5b5; } + .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + border-color: #2e63b8; + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; + color: #6b6b6b; } + .select select[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .input[disabled]::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-moz-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .input[disabled]::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-webkit-input-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .input[disabled]:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-moz-placeholder { + color: rgba(107, 107, 107, 0.3); } + .select select[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .input[disabled]:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-ms-input-placeholder { + color: rgba(107, 107, 107, 0.3); } + +.textarea, .input, #documenter .docs-sidebar form.docs-search > input { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); + max-width: 100%; + width: 100%; } + .textarea[readonly], .input[readonly], #documenter .docs-sidebar form.docs-search > input[readonly] { + box-shadow: none; } + .is-white.textarea, .is-white.input, #documenter .docs-sidebar form.docs-search > input.is-white { + border-color: white; } + .is-white.textarea:focus, .is-white.input:focus, #documenter .docs-sidebar form.docs-search > input.is-white:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-white.textarea:active, .is-white.input:active, #documenter .docs-sidebar form.docs-search > input.is-white:active, .is-white.is-active.textarea, .is-white.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .is-black.textarea, .is-black.input, #documenter .docs-sidebar form.docs-search > input.is-black { + border-color: #0a0a0a; } + .is-black.textarea:focus, .is-black.input:focus, #documenter .docs-sidebar form.docs-search > input.is-black:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-black.textarea:active, .is-black.input:active, #documenter .docs-sidebar form.docs-search > input.is-black:active, .is-black.is-active.textarea, .is-black.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .is-light.textarea, .is-light.input, #documenter .docs-sidebar form.docs-search > input.is-light { + border-color: whitesmoke; } + .is-light.textarea:focus, .is-light.input:focus, #documenter .docs-sidebar form.docs-search > input.is-light:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-light.textarea:active, .is-light.input:active, #documenter .docs-sidebar form.docs-search > input.is-light:active, .is-light.is-active.textarea, .is-light.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .is-dark.textarea, .content kbd.textarea, .is-dark.input, #documenter .docs-sidebar form.docs-search > input.is-dark, .content kbd.input { + border-color: #363636; } + .is-dark.textarea:focus, .content kbd.textarea:focus, .is-dark.input:focus, #documenter .docs-sidebar form.docs-search > input.is-dark:focus, .content kbd.input:focus, .is-dark.is-focused.textarea, .content kbd.is-focused.textarea, .is-dark.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .content kbd.is-focused.input, #documenter .docs-sidebar .content form.docs-search > input.is-focused, .is-dark.textarea:active, .content kbd.textarea:active, .is-dark.input:active, #documenter .docs-sidebar form.docs-search > input.is-dark:active, .content kbd.input:active, .is-dark.is-active.textarea, .content kbd.is-active.textarea, .is-dark.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .content kbd.is-active.input, #documenter .docs-sidebar .content form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .is-primary.textarea, .docstring > section > a.textarea.docs-sourcelink, .is-primary.input, #documenter .docs-sidebar form.docs-search > input.is-primary, .docstring > section > a.input.docs-sourcelink { + border-color: #4eb5de; } + .is-primary.textarea:focus, .docstring > section > a.textarea.docs-sourcelink:focus, .is-primary.input:focus, #documenter .docs-sidebar form.docs-search > input.is-primary:focus, .docstring > section > a.input.docs-sourcelink:focus, .is-primary.is-focused.textarea, .docstring > section > a.is-focused.textarea.docs-sourcelink, .is-primary.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .docstring > section > a.is-focused.input.docs-sourcelink, .is-primary.textarea:active, .docstring > section > a.textarea.docs-sourcelink:active, .is-primary.input:active, #documenter .docs-sidebar form.docs-search > input.is-primary:active, .docstring > section > a.input.docs-sourcelink:active, .is-primary.is-active.textarea, .docstring > section > a.is-active.textarea.docs-sourcelink, .is-primary.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .docstring > section > a.is-active.input.docs-sourcelink { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .is-link.textarea, .is-link.input, #documenter .docs-sidebar form.docs-search > input.is-link { + border-color: #2e63b8; } + .is-link.textarea:focus, .is-link.input:focus, #documenter .docs-sidebar form.docs-search > input.is-link:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-link.textarea:active, .is-link.input:active, #documenter .docs-sidebar form.docs-search > input.is-link:active, .is-link.is-active.textarea, .is-link.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .is-info.textarea, .is-info.input, #documenter .docs-sidebar form.docs-search > input.is-info { + border-color: #209cee; } + .is-info.textarea:focus, .is-info.input:focus, #documenter .docs-sidebar form.docs-search > input.is-info:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-info.textarea:active, .is-info.input:active, #documenter .docs-sidebar form.docs-search > input.is-info:active, .is-info.is-active.textarea, .is-info.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .is-success.textarea, .is-success.input, #documenter .docs-sidebar form.docs-search > input.is-success { + border-color: #22c35b; } + .is-success.textarea:focus, .is-success.input:focus, #documenter .docs-sidebar form.docs-search > input.is-success:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-success.textarea:active, .is-success.input:active, #documenter .docs-sidebar form.docs-search > input.is-success:active, .is-success.is-active.textarea, .is-success.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .is-warning.textarea, .is-warning.input, #documenter .docs-sidebar form.docs-search > input.is-warning { + border-color: #ffdd57; } + .is-warning.textarea:focus, .is-warning.input:focus, #documenter .docs-sidebar form.docs-search > input.is-warning:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-warning.textarea:active, .is-warning.input:active, #documenter .docs-sidebar form.docs-search > input.is-warning:active, .is-warning.is-active.textarea, .is-warning.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .is-danger.textarea, .is-danger.input, #documenter .docs-sidebar form.docs-search > input.is-danger { + border-color: #da0b00; } + .is-danger.textarea:focus, .is-danger.input:focus, #documenter .docs-sidebar form.docs-search > input.is-danger:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-danger.textarea:active, .is-danger.input:active, #documenter .docs-sidebar form.docs-search > input.is-danger:active, .is-danger.is-active.textarea, .is-danger.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .is-small.textarea, .is-small.input, #documenter .docs-sidebar form.docs-search > input { + border-radius: 2px; + font-size: 0.75rem; } + .is-medium.textarea, .is-medium.input, #documenter .docs-sidebar form.docs-search > input.is-medium { + font-size: 1.25rem; } + .is-large.textarea, .is-large.input, #documenter .docs-sidebar form.docs-search > input.is-large { + font-size: 1.5rem; } + .is-fullwidth.textarea, .is-fullwidth.input, #documenter .docs-sidebar form.docs-search > input.is-fullwidth { + display: block; + width: 100%; } + .is-inline.textarea, .is-inline.input, #documenter .docs-sidebar form.docs-search > input.is-inline { + display: inline; + width: auto; } + +.input.is-rounded, #documenter .docs-sidebar form.docs-search > input { + border-radius: 290486px; + padding-left: 1em; + padding-right: 1em; } + +.input.is-static, #documenter .docs-sidebar form.docs-search > input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: 0.625em; + resize: vertical; } + .textarea:not([rows]) { + max-height: 600px; + min-height: 120px; } + .textarea[rows] { + height: initial; } + .textarea.has-fixed-size { + resize: none; } + +.radio, .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + .radio input, .checkbox input { + cursor: pointer; } + .radio:hover, .checkbox:hover { + color: #363636; } + .radio[disabled], .checkbox[disabled], fieldset[disabled] .radio, fieldset[disabled] .checkbox { + color: #6b6b6b; + cursor: not-allowed; } + +.radio + .radio { + margin-left: 0.5em; } + +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + .select:not(.is-multiple) { + height: 2.25em; } + .select:not(.is-multiple):not(.is-loading)::after { + border-color: #2e63b8; + right: 1.125em; + z-index: 4; } + .select.is-rounded select, #documenter .docs-sidebar form.docs-search > input.select select { + border-radius: 290486px; + padding-left: 1em; } + .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + .select select::-ms-expand { + display: none; } + .select select[disabled]:hover, fieldset[disabled] .select select:hover { + border-color: whitesmoke; } + .select select:not([multiple]) { + padding-right: 2.5em; } + .select select[multiple] { + height: auto; + padding: 0; } + .select select[multiple] option { + padding: 0.5em 1em; } + .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; } + .select.is-white:not(:hover)::after { + border-color: white; } + .select.is-white select { + border-color: white; } + .select.is-white select:hover, .select.is-white select.is-hovered { + border-color: #f2f2f2; } + .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + .select.is-black select { + border-color: #0a0a0a; } + .select.is-black select:hover, .select.is-black select.is-hovered { + border-color: black; } + .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .select.is-light:not(:hover)::after { + border-color: whitesmoke; } + .select.is-light select { + border-color: whitesmoke; } + .select.is-light select:hover, .select.is-light select.is-hovered { + border-color: #e8e8e8; } + .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .select.is-dark:not(:hover)::after, .content kbd.select:not(:hover)::after { + border-color: #363636; } + .select.is-dark select, .content kbd.select select { + border-color: #363636; } + .select.is-dark select:hover, .content kbd.select select:hover, .select.is-dark select.is-hovered, .content kbd.select select.is-hovered { + border-color: #292929; } + .select.is-dark select:focus, .content kbd.select select:focus, .select.is-dark select.is-focused, .content kbd.select select.is-focused, .select.is-dark select:active, .content kbd.select select:active, .select.is-dark select.is-active, .content kbd.select select.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .select.is-primary:not(:hover)::after, .docstring > section > a.select.docs-sourcelink:not(:hover)::after { + border-color: #4eb5de; } + .select.is-primary select, .docstring > section > a.select.docs-sourcelink select { + border-color: #4eb5de; } + .select.is-primary select:hover, .docstring > section > a.select.docs-sourcelink select:hover, .select.is-primary select.is-hovered, .docstring > section > a.select.docs-sourcelink select.is-hovered { + border-color: #39acda; } + .select.is-primary select:focus, .docstring > section > a.select.docs-sourcelink select:focus, .select.is-primary select.is-focused, .docstring > section > a.select.docs-sourcelink select.is-focused, .select.is-primary select:active, .docstring > section > a.select.docs-sourcelink select:active, .select.is-primary select.is-active, .docstring > section > a.select.docs-sourcelink select.is-active { + box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } + .select.is-link:not(:hover)::after { + border-color: #2e63b8; } + .select.is-link select { + border-color: #2e63b8; } + .select.is-link select:hover, .select.is-link select.is-hovered { + border-color: #2958a4; } + .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } + .select.is-info:not(:hover)::after { + border-color: #209cee; } + .select.is-info select { + border-color: #209cee; } + .select.is-info select:hover, .select.is-info select.is-hovered { + border-color: #1190e3; } + .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } + .select.is-success:not(:hover)::after { + border-color: #22c35b; } + .select.is-success select { + border-color: #22c35b; } + .select.is-success select:hover, .select.is-success select.is-hovered { + border-color: #1ead51; } + .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } + .select.is-warning:not(:hover)::after { + border-color: #ffdd57; } + .select.is-warning select { + border-color: #ffdd57; } + .select.is-warning select:hover, .select.is-warning select.is-hovered { + border-color: #ffd83e; } + .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } + .select.is-danger:not(:hover)::after { + border-color: #da0b00; } + .select.is-danger select { + border-color: #da0b00; } + .select.is-danger select:hover, .select.is-danger select.is-hovered { + border-color: #c10a00; } + .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } + .select.is-small, #documenter .docs-sidebar form.docs-search > input.select { + border-radius: 2px; + font-size: 0.75rem; } + .select.is-medium { + font-size: 1.25rem; } + .select.is-large { + font-size: 1.5rem; } + .select.is-disabled::after { + border-color: #6b6b6b; } + .select.is-fullwidth { + width: 100%; } + .select.is-fullwidth select { + width: 100%; } + .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + .select.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.75rem; } + .select.is-loading.is-medium:after { + font-size: 1.25rem; } + .select.is-loading.is-large:after { + font-size: 1.5rem; } + +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + .file.is-light .file-cta { + background-color: whitesmoke; + border-color: transparent; + color: #363636; } + .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { + background-color: #eeeeee; + border-color: transparent; + color: #363636; } + .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: #363636; } + .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: #363636; } + .file.is-dark .file-cta, .content kbd.file .file-cta { + background-color: #363636; + border-color: transparent; + color: whitesmoke; } + .file.is-dark:hover .file-cta, .content kbd.file:hover .file-cta, .file.is-dark.is-hovered .file-cta, .content kbd.file.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: whitesmoke; } + .file.is-dark:focus .file-cta, .content kbd.file:focus .file-cta, .file.is-dark.is-focused .file-cta, .content kbd.file.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: whitesmoke; } + .file.is-dark:active .file-cta, .content kbd.file:active .file-cta, .file.is-dark.is-active .file-cta, .content kbd.file.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: whitesmoke; } + .file.is-primary .file-cta, .docstring > section > a.file.docs-sourcelink .file-cta { + background-color: #4eb5de; + border-color: transparent; + color: #fff; } + .file.is-primary:hover .file-cta, .docstring > section > a.file.docs-sourcelink:hover .file-cta, .file.is-primary.is-hovered .file-cta, .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { + background-color: #43b1dc; + border-color: transparent; + color: #fff; } + .file.is-primary:focus .file-cta, .docstring > section > a.file.docs-sourcelink:focus .file-cta, .file.is-primary.is-focused .file-cta, .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); + color: #fff; } + .file.is-primary:active .file-cta, .docstring > section > a.file.docs-sourcelink:active .file-cta, .file.is-primary.is-active .file-cta, .docstring > section > a.file.is-active.docs-sourcelink .file-cta { + background-color: #39acda; + border-color: transparent; + color: #fff; } + .file.is-link .file-cta { + background-color: #2e63b8; + border-color: transparent; + color: #fff; } + .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { + background-color: #2b5eae; + border-color: transparent; + color: #fff; } + .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); + color: #fff; } + .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { + background-color: #2958a4; + border-color: transparent; + color: #fff; } + .file.is-info .file-cta { + background-color: #209cee; + border-color: transparent; + color: #fff; } + .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { + background-color: #1497ed; + border-color: transparent; + color: #fff; } + .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); + color: #fff; } + .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { + background-color: #1190e3; + border-color: transparent; + color: #fff; } + .file.is-success .file-cta { + background-color: #22c35b; + border-color: transparent; + color: #fff; } + .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { + background-color: #20b856; + border-color: transparent; + color: #fff; } + .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); + color: #fff; } + .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { + background-color: #1ead51; + border-color: transparent; + color: #fff; } + .file.is-warning .file-cta { + background-color: #ffdd57; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { + background-color: #ffda4a; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { + background-color: #ffd83e; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-danger .file-cta { + background-color: #da0b00; + border-color: transparent; + color: #fff; } + .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { + background-color: #cd0a00; + border-color: transparent; + color: #fff; } + .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); + color: #fff; } + .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { + background-color: #c10a00; + border-color: transparent; + color: #fff; } + .file.is-small, #documenter .docs-sidebar form.docs-search > input.file { + font-size: 0.75rem; } + .file.is-medium { + font-size: 1.25rem; } + .file.is-medium .file-icon .fa { + font-size: 21px; } + .file.is-large { + font-size: 1.5rem; } + .file.is-large .file-icon .fa { + font-size: 28px; } + .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .file.has-name.is-empty .file-cta { + border-radius: 4px; } + .file.has-name.is-empty .file-name { + display: none; } + .file.is-boxed .file-label { + flex-direction: column; } + .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + .file.is-boxed .file-name { + border-width: 0 1px 1px; } + .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + .file.is-boxed .file-icon .fa { + font-size: 21px; } + .file.is-boxed.is-small .file-icon .fa, #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { + font-size: 14px; } + .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + .file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; } + .file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; } + .file.is-centered { + justify-content: center; } + .file.is-fullwidth .file-label { + width: 100%; } + .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + .file.is-right { + justify-content: flex-end; } + .file.is-right .file-cta { + border-radius: 0 4px 4px 0; } + .file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; } + +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + .file-label:hover .file-cta { + background-color: #eeeeee; + color: #363636; } + .file-label:hover .file-name { + border-color: #d5d5d5; } + .file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; } + .file-label:active .file-name { + border-color: #cfcfcf; } + +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + +.file-cta { + background-color: whitesmoke; + color: #4a4a4a; } + +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; } + +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + .file-icon .fa { + font-size: 14px; } + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; } + .label:not(:last-child) { + margin-bottom: 0.5em; } + .label.is-small, #documenter .docs-sidebar form.docs-search > input.label { + font-size: 0.75rem; } + .label.is-medium { + font-size: 1.25rem; } + .label.is-large { + font-size: 1.5rem; } + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; } + .help.is-white { + color: white; } + .help.is-black { + color: #0a0a0a; } + .help.is-light { + color: whitesmoke; } + .help.is-dark, .content kbd.help { + color: #363636; } + .help.is-primary, .docstring > section > a.help.docs-sourcelink { + color: #4eb5de; } + .help.is-link { + color: #2e63b8; } + .help.is-info { + color: #209cee; } + .help.is-success { + color: #22c35b; } + .help.is-warning { + color: #ffdd57; } + .help.is-danger { + color: #da0b00; } + +.field:not(:last-child) { + margin-bottom: 0.75rem; } + +.field.has-addons { + display: flex; + justify-content: flex-start; } + .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + .field.has-addons .control:not(:first-child):not(:last-child) .button, + .field.has-addons .control:not(:first-child):not(:last-child) .input, + .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, + .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + .field.has-addons .control:first-child:not(:only-child) .button, + .field.has-addons .control:first-child:not(:only-child) .input, + .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, + .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .field.has-addons .control:last-child:not(:only-child) .button, + .field.has-addons .control:last-child:not(:only-child) .input, + .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, + #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, + .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button.is-hovered:not([disabled]), + .field.has-addons .control .input:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, + .field.has-addons .control .input.is-hovered:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), + .field.has-addons .control .select select:not([disabled]):hover, + .field.has-addons .control .select select.is-hovered:not([disabled]) { + z-index: 2; } + .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button.is-focused:not([disabled]), .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button.is-active:not([disabled]), + .field.has-addons .control .input:not([disabled]):focus, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, + .field.has-addons .control .input.is-focused:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), + .field.has-addons .control .input:not([disabled]):active, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, + .field.has-addons .control .input.is-active:not([disabled]), + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), + .field.has-addons .control .select select:not([disabled]):focus, + .field.has-addons .control .select select.is-focused:not([disabled]), + .field.has-addons .control .select select:not([disabled]):active, + .field.has-addons .control .select select.is-active:not([disabled]) { + z-index: 3; } + .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button.is-focused:not([disabled]):hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button.is-active:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]):focus:hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, + .field.has-addons .control .input.is-focused:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]):active:hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, + .field.has-addons .control .input.is-active:not([disabled]):hover, + .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, + #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]):focus:hover, + .field.has-addons .control .select select.is-focused:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]):active:hover, + .field.has-addons .control .select select.is-active:not([disabled]):hover { + z-index: 4; } + .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.has-addons.has-addons-centered { + justify-content: center; } + .field.has-addons.has-addons-right { + justify-content: flex-end; } + .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + +.field.is-grouped { + display: flex; + justify-content: flex-start; } + .field.is-grouped > .control { + flex-shrink: 0; } + .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.is-grouped.is-grouped-centered { + justify-content: center; } + .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; } } + +.field-label .label { + font-size: inherit; } + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; } } + +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + .field-label.is-small, #documenter .docs-sidebar form.docs-search > input.field-label { + font-size: 0.75rem; + padding-top: 0.375em; } + .field-label.is-normal { + padding-top: 0.375em; } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + +.field-body .field .field { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + .field-body .field { + margin-bottom: 0; } + .field-body > .field { + flex-shrink: 1; } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: left; } + .control.has-icons-left .input:focus ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, + .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, + .control.has-icons-right .select:focus ~ .icon { + color: #6b6b6b; } + .control.has-icons-left .input.is-small ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, + .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, + .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; } + .control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, + .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, + .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + .control.has-icons-left .input.is-large ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, + .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, + .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + .control.has-icons-left .icon, .control.has-icons-right .icon { + color: #dbdbdb; + height: 2.25em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.25em; + z-index: 4; } + .control.has-icons-left .input, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, + .control.has-icons-left .select select { + padding-left: 2.25em; } + .control.has-icons-left .icon.is-left { + left: 0; } + .control.has-icons-right .input, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, + .control.has-icons-right .select select { + padding-right: 2.25em; } + .control.has-icons-right .icon.is-right { + right: 0; } + .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + .control.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { + font-size: 0.75rem; } + .control.is-loading.is-medium:after { + font-size: 1.25rem; } + .control.is-loading.is-large:after { + font-size: 1.5rem; } + +.breadcrumb { + font-size: 1rem; + white-space: nowrap; } + .breadcrumb a { + align-items: center; + color: #2e63b8; + display: flex; + justify-content: center; + padding: 0 0.75em; } + .breadcrumb a:hover { + color: #363636; } + .breadcrumb li { + align-items: center; + display: flex; } + .breadcrumb li:first-child a { + padding-left: 0; } + .breadcrumb li.is-active a { + color: #222222; + cursor: default; + pointer-events: none; } + .breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; } + .breadcrumb ul, + .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .breadcrumb .icon:first-child { + margin-right: 0.5em; } + .breadcrumb .icon:last-child { + margin-left: 0.5em; } + .breadcrumb.is-centered ol, + .breadcrumb.is-centered ul { + justify-content: center; } + .breadcrumb.is-right ol, + .breadcrumb.is-right ul { + justify-content: flex-end; } + .breadcrumb.is-small, #documenter .docs-sidebar form.docs-search > input.breadcrumb { + font-size: 0.75rem; } + .breadcrumb.is-medium { + font-size: 1.25rem; } + .breadcrumb.is-large { + font-size: 1.5rem; } + .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + +.card { + background-color: white; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + color: #222222; + max-width: 100%; + position: relative; } + +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + display: flex; } + +.card-header-title { + align-items: center; + color: #222222; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem; } + .card-header-title.is-centered { + justify-content: center; } + +.card-header-icon { + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem; } + +.card-image { + display: block; + position: relative; } + +.card-content { + background-color: transparent; + padding: 1.5rem; } + +.card-footer { + background-color: transparent; + border-top: 1px solid #dbdbdb; + align-items: stretch; + display: flex; } + +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + .card-footer-item:not(:last-child) { + border-right: 1px solid #dbdbdb; } + +.card .media:not(:last-child) { + margin-bottom: 1.5rem; } + +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + +.dropdown-content { + background-color: white; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: left; + white-space: nowrap; + width: 100%; } + a.dropdown-item:hover, + button.dropdown-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + a.dropdown-item.is-active, + button.dropdown-item.is-active { + background-color: #2e63b8; + color: #fff; } + +.dropdown-divider { + background-color: #dbdbdb; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + +.level { + align-items: center; + justify-content: space-between; } + .level code { + border-radius: 4px; } + .level img { + display: inline-block; + vertical-align: top; } + .level.is-mobile { + display: flex; } + .level.is-mobile .level-left, + .level.is-mobile .level-right { + display: flex; } + .level.is-mobile .level-left + .level-right { + margin-top: 0; } + .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level { + display: flex; } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + .level-item .title, + .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + .level-left .level-item.is-flexible, + .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } +.level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + .level-left { + display: flex; } } +.level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + .level-right { + display: flex; } } +.list { + background-color: white; + border-radius: 4px; + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + +.list-item { + display: block; + padding: 0.5em 1em; } + .list-item:not(a) { + color: #222222; } + .list-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + .list-item:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } + .list-item:not(:last-child) { + border-bottom: 1px solid #dbdbdb; } + .list-item.is-active { + background-color: #2e63b8; + color: #fff; } + +a.list-item { + background-color: whitesmoke; + cursor: pointer; } + +.media { + align-items: flex-start; + display: flex; + text-align: left; } + .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + .media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: flex; + padding-top: 0.75rem; } + .media .media .content:not(:last-child), + .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + .media .media .media { + padding-top: 0.5rem; } + .media .media .media + .media { + margin-top: 0.5rem; } + .media + .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + +.media-left { + margin-right: 1rem; } + +.media-right { + margin-left: 1rem; } + +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: left; } + +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; } } + +.menu { + font-size: 1rem; } + .menu.is-small, #documenter .docs-sidebar form.docs-search > input.menu { + font-size: 0.75rem; } + .menu.is-medium { + font-size: 1.25rem; } + .menu.is-large { + font-size: 1.5rem; } + +.menu-list { + line-height: 1.25; } + .menu-list a { + border-radius: 2px; + color: #222222; + display: block; + padding: 0.5em 0.75em; } + .menu-list a:hover { + background-color: whitesmoke; + color: #222222; } + .menu-list a.is-active { + background-color: #2e63b8; + color: #fff; } + .menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; } + +.menu-label { + color: #6b6b6b; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + .menu-label:not(:first-child) { + margin-top: 1em; } + .menu-label:not(:last-child) { + margin-bottom: 1em; } + +.message { + background-color: whitesmoke; + border-radius: 4px; + font-size: 1rem; } + .message strong { + color: currentColor; } + .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .message.is-small, #documenter .docs-sidebar form.docs-search > input.message { + font-size: 0.75rem; } + .message.is-medium { + font-size: 1.25rem; } + .message.is-large { + font-size: 1.5rem; } + .message.is-white { + background-color: white; } + .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + .message.is-white .message-body { + border-color: white; + color: #4d4d4d; } + .message.is-black { + background-color: #fafafa; } + .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + .message.is-black .message-body { + border-color: #0a0a0a; + color: #090909; } + .message.is-light { + background-color: #fafafa; } + .message.is-light .message-header { + background-color: whitesmoke; + color: #363636; } + .message.is-light .message-body { + border-color: whitesmoke; + color: #505050; } + .message.is-dark, .content kbd.message { + background-color: #fafafa; } + .message.is-dark .message-header, .content kbd.message .message-header { + background-color: #363636; + color: whitesmoke; } + .message.is-dark .message-body, .content kbd.message .message-body { + border-color: #363636; + color: #2a2a2a; } + .message.is-primary, .docstring > section > a.message.docs-sourcelink { + background-color: #f6fbfd; } + .message.is-primary .message-header, .docstring > section > a.message.docs-sourcelink .message-header { + background-color: #4eb5de; + color: #fff; } + .message.is-primary .message-body, .docstring > section > a.message.docs-sourcelink .message-body { + border-color: #4eb5de; + color: #1f556a; } + .message.is-link { + background-color: #f7f9fd; } + .message.is-link .message-header { + background-color: #2e63b8; + color: #fff; } + .message.is-link .message-body { + border-color: #2e63b8; + color: #264981; } + .message.is-info { + background-color: #f6fbfe; } + .message.is-info .message-header { + background-color: #209cee; + color: #fff; } + .message.is-info .message-body { + border-color: #209cee; + color: #12537d; } + .message.is-success { + background-color: #f6fdf9; } + .message.is-success .message-header { + background-color: #22c35b; + color: #fff; } + .message.is-success .message-body { + border-color: #22c35b; + color: #0f361d; } + .message.is-warning { + background-color: #fffdf5; } + .message.is-warning .message-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .message.is-warning .message-body { + border-color: #ffdd57; + color: #3c3108; } + .message.is-danger { + background-color: #fff5f5; } + .message.is-danger .message-header { + background-color: #da0b00; + color: #fff; } + .message.is-danger .message-body { + border-color: #da0b00; + color: #9b0c04; } + +.message-header { + align-items: center; + background-color: #222222; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #222222; + padding: 1.25em 1.5em; } + .message-body code, + .message-body pre { + background-color: white; } + .message-body pre code { + background-color: transparent; } + +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + .modal.is-active { + display: flex; } + +.modal-background { + background-color: rgba(10, 10, 10, 0.86); } + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px), print { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: whitesmoke; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; } + +.modal-card-title { + color: #222222; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; } + .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + +.navbar { + background-color: white; + min-height: 3.25rem; + position: relative; + z-index: 30; } + .navbar.is-white { + background-color: white; + color: #0a0a0a; } + .navbar.is-white .navbar-brand > .navbar-item, + .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, + .navbar.is-white .navbar-brand .navbar-link:focus, + .navbar.is-white .navbar-brand .navbar-link:hover, + .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1056px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + .navbar.is-black { + background-color: #0a0a0a; + color: white; } + .navbar.is-black .navbar-brand > .navbar-item, + .navbar.is-black .navbar-brand .navbar-link { + color: white; } + .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, + .navbar.is-black .navbar-brand .navbar-link:focus, + .navbar.is-black .navbar-brand .navbar-link:hover, + .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1056px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: white; } + .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + .navbar.is-light { + background-color: whitesmoke; + color: #363636; } + .navbar.is-light .navbar-brand > .navbar-item, + .navbar.is-light .navbar-brand .navbar-link { + color: #363636; } + .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, + .navbar.is-light .navbar-brand .navbar-link:focus, + .navbar.is-light .navbar-brand .navbar-link:hover, + .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-brand .navbar-link::after { + border-color: #363636; } + .navbar.is-light .navbar-burger { + color: #363636; } + @media screen and (min-width: 1056px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: #363636; } + .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: #363636; } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: #363636; } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #363636; } } + .navbar.is-dark, .content kbd.navbar { + background-color: #363636; + color: whitesmoke; } + .navbar.is-dark .navbar-brand > .navbar-item, .content kbd.navbar .navbar-brand > .navbar-item, + .navbar.is-dark .navbar-brand .navbar-link, + .content kbd.navbar .navbar-brand .navbar-link { + color: whitesmoke; } + .navbar.is-dark .navbar-brand > a.navbar-item:focus, .content kbd.navbar .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .content kbd.navbar .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, .content kbd.navbar .navbar-brand > a.navbar-item.is-active, + .navbar.is-dark .navbar-brand .navbar-link:focus, + .content kbd.navbar .navbar-brand .navbar-link:focus, + .navbar.is-dark .navbar-brand .navbar-link:hover, + .content kbd.navbar .navbar-brand .navbar-link:hover, + .navbar.is-dark .navbar-brand .navbar-link.is-active, + .content kbd.navbar .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-brand .navbar-link::after, .content kbd.navbar .navbar-brand .navbar-link::after { + border-color: whitesmoke; } + .navbar.is-dark .navbar-burger, .content kbd.navbar .navbar-burger { + color: whitesmoke; } + @media screen and (min-width: 1056px) { + .navbar.is-dark .navbar-start > .navbar-item, .content kbd.navbar .navbar-start > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .content kbd.navbar .navbar-start .navbar-link, + .navbar.is-dark .navbar-end > .navbar-item, + .content kbd.navbar .navbar-end > .navbar-item, + .navbar.is-dark .navbar-end .navbar-link, + .content kbd.navbar .navbar-end .navbar-link { + color: whitesmoke; } + .navbar.is-dark .navbar-start > a.navbar-item:focus, .content kbd.navbar .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .content kbd.navbar .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, .content kbd.navbar .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:focus, + .content kbd.navbar .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-start .navbar-link:hover, + .content kbd.navbar .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .content kbd.navbar .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .content kbd.navbar .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .content kbd.navbar .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .content kbd.navbar .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:focus, + .content kbd.navbar .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:hover, + .content kbd.navbar .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active, + .content kbd.navbar .navbar-end .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-start .navbar-link::after, .content kbd.navbar .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after, + .content kbd.navbar .navbar-end .navbar-link::after { + border-color: whitesmoke; } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, + .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: whitesmoke; } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: whitesmoke; } } + .navbar.is-primary, .docstring > section > a.navbar.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .navbar.is-primary .navbar-brand > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, + .navbar.is-primary .navbar-brand .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-brand > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, + .navbar.is-primary .navbar-brand .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, + .navbar.is-primary .navbar-brand .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, + .navbar.is-primary .navbar-brand .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-brand .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-burger, .docstring > section > a.navbar.docs-sourcelink .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-primary .navbar-start > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, + .navbar.is-primary .navbar-end > .navbar-item, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, + .navbar.is-primary .navbar-end .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-start > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-start .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:focus, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:hover, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-start .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after, + .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, + .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #39acda; + color: #fff; } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { + background-color: #4eb5de; + color: #fff; } } + .navbar.is-link { + background-color: #2e63b8; + color: #fff; } + .navbar.is-link .navbar-brand > .navbar-item, + .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, + .navbar.is-link .navbar-brand .navbar-link:focus, + .navbar.is-link .navbar-brand .navbar-link:hover, + .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #2958a4; + color: #fff; } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #2e63b8; + color: #fff; } } + .navbar.is-info { + background-color: #209cee; + color: #fff; } + .navbar.is-info .navbar-brand > .navbar-item, + .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, + .navbar.is-info .navbar-brand .navbar-link:focus, + .navbar.is-info .navbar-brand .navbar-link:hover, + .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1190e3; + color: #fff; } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #209cee; + color: #fff; } } + .navbar.is-success { + background-color: #22c35b; + color: #fff; } + .navbar.is-success .navbar-brand > .navbar-item, + .navbar.is-success .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, + .navbar.is-success .navbar-brand .navbar-link:focus, + .navbar.is-success .navbar-brand .navbar-link:hover, + .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-success .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: #fff; } + .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #1ead51; + color: #fff; } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #22c35b; + color: #fff; } } + .navbar.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > .navbar-item, + .navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + .navbar.is-warning .navbar-brand .navbar-link:focus, + .navbar.is-warning .navbar-brand .navbar-link:hover, + .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-burger { + color: rgba(0, 0, 0, 0.7); } + @media screen and (min-width: 1056px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } } + .navbar.is-danger { + background-color: #da0b00; + color: #fff; } + .navbar.is-danger .navbar-brand > .navbar-item, + .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + .navbar.is-danger .navbar-brand .navbar-link:focus, + .navbar.is-danger .navbar-brand .navbar-link:hover, + .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1056px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #c10a00; + color: #fff; } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #da0b00; + color: #fff; } } + .navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; } + .navbar.has-shadow { + box-shadow: 0 2px 0 0 whitesmoke; } + .navbar.is-fixed-bottom, .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom { + bottom: 0; } + .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 whitesmoke; } + .navbar.is-fixed-top { + top: 0; } + +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; } + +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; } + +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; } + +.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { + background-color: transparent; } + +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + +.navbar-burger { + color: #4a4a4a; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; } + .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + +.navbar-menu { + display: none; } + +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + .navbar-item .icon:only-child, + .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + +a.navbar-item, +.navbar-link { + cursor: pointer; } + a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, + .navbar-link:focus, + .navbar-link:focus-within, + .navbar-link:hover, + .navbar-link.is-active { + background-color: #fafafa; + color: #2e63b8; } + +.navbar-item { + display: block; + flex-grow: 0; + flex-shrink: 0; } + .navbar-item img { + max-height: 1.75rem; } + .navbar-item.has-dropdown { + padding: 0; } + .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); } + .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #2e63b8; } + .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #2e63b8; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #2e63b8; + padding-bottom: calc(0.5rem - 3px); } + +.navbar-content { + flex-grow: 1; + flex-shrink: 1; } + +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + .navbar-link:not(.is-arrowless)::after { + border-color: #2e63b8; + margin-top: -0.375em; + right: 1.125em; } + +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + +.navbar-divider { + background-color: whitesmoke; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + +@media screen and (max-width: 1055px) { + .navbar > .container { + display: block; } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + .navbar-link::after { + display: none; } + .navbar-menu { + background-color: white; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + .navbar-menu.is-active { + display: block; } + .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-touch { + bottom: 0; } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-touch { + top: 0; } + .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; } } + +@media screen and (min-width: 1056px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; } + .navbar { + min-height: 3.25rem; } + .navbar.is-spaced { + padding: 1rem 2rem; } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; } + .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #2e63b8; } + .navbar-burger { + display: none; } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; } + .navbar-item { + display: flex; } + .navbar-item.has-dropdown { + align-items: stretch; } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + .navbar-start { + justify-content: flex-start; + margin-right: auto; } + .navbar-end { + justify-content: flex-end; + margin-left: auto; } + .navbar-dropdown { + background-color: white; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #2e63b8; } + .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + .navbar-dropdown.is-right { + left: auto; + right: 0; } + .navbar-divider { + display: block; } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -.75rem; } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -.75rem; } + .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-desktop { + bottom: 0; } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-desktop { + top: 0; } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #0a0a0a; } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; } } + +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); } + +.pagination { + font-size: 1rem; + margin: -0.25rem; } + .pagination.is-small, #documenter .docs-sidebar form.docs-search > input.pagination { + font-size: 0.75rem; } + .pagination.is-medium { + font-size: 1.25rem; } + .pagination.is-large { + font-size: 1.5rem; } + .pagination.is-rounded .pagination-previous, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, + .pagination.is-rounded .pagination-next, + #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 290486px; } + .pagination.is-rounded .pagination-link, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { + border-radius: 290486px; } + +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.25em; } + .pagination-previous:hover, + .pagination-next:hover, + .pagination-link:hover { + border-color: #b5b5b5; + color: #363636; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus { + border-color: #3c5dcd; } + .pagination-previous:active, + .pagination-next:active, + .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled] { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #6b6b6b; + opacity: 0.5; } + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + +.pagination-link.is-current { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; } + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; } + +.pagination-list { + flex-wrap: wrap; } + +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + .pagination-previous { + order: 2; } + .pagination-next { + order: 3; } + .pagination { + justify-content: space-between; } + .pagination.is-centered .pagination-previous { + order: 1; } + .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + .pagination.is-centered .pagination-next { + order: 3; } + .pagination.is-right .pagination-previous { + order: 1; } + .pagination.is-right .pagination-next { + order: 2; } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + +.panel { + font-size: 1rem; } + .panel:not(:last-child) { + margin-bottom: 1.5rem; } + +.panel-heading, +.panel-tabs, +.panel-block { + border-bottom: 1px solid #dbdbdb; + border-left: 1px solid #dbdbdb; + border-right: 1px solid #dbdbdb; } + .panel-heading:first-child, + .panel-tabs:first-child, + .panel-block:first-child { + border-top: 1px solid #dbdbdb; } + +.panel-heading { + background-color: whitesmoke; + border-radius: 4px 4px 0 0; + color: #222222; + font-size: 1.25em; + font-weight: 300; + line-height: 1.25; + padding: 0.5em 0.75em; } + +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + .panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; } + .panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; } + +.panel-list a { + color: #222222; } + .panel-list a:hover { + color: #2e63b8; } + +.panel-block { + align-items: center; + color: #222222; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + .panel-block.is-wrapped { + flex-wrap: wrap; } + .panel-block.is-active { + border-left-color: #2e63b8; + color: #363636; } + .panel-block.is-active .panel-icon { + color: #2e63b8; } + +a.panel-block, +label.panel-block { + cursor: pointer; } + a.panel-block:hover, + label.panel-block:hover { + background-color: whitesmoke; } + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #6b6b6b; + margin-right: 0.75em; } + .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + .tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #222222; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + .tabs a:hover { + border-bottom-color: #222222; + color: #222222; } + .tabs li { + display: block; } + .tabs li.is-active a { + border-bottom-color: #2e63b8; + color: #2e63b8; } + .tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + .tabs ul.is-left { + padding-right: 0.75em; } + .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + .tabs .icon:first-child { + margin-right: 0.5em; } + .tabs .icon:last-child { + margin-left: 0.5em; } + .tabs.is-centered ul { + justify-content: center; } + .tabs.is-right ul { + justify-content: flex-end; } + .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + .tabs.is-boxed a:hover { + background-color: whitesmoke; + border-bottom-color: #dbdbdb; } + .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #dbdbdb; + border-bottom-color: transparent !important; } + .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + .tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + .tabs.is-toggle a:hover { + background-color: whitesmoke; + border-color: #b5b5b5; + z-index: 2; } + .tabs.is-toggle li + li { + margin-left: -1px; } + .tabs.is-toggle li:first-child a { + border-radius: 4px 0 0 4px; } + .tabs.is-toggle li:last-child a { + border-radius: 0 4px 4px 0; } + .tabs.is-toggle li.is-active a { + background-color: #2e63b8; + border-color: #2e63b8; + color: #fff; + z-index: 1; } + .tabs.is-toggle ul { + border-bottom: none; } + .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 290486px; + border-top-left-radius: 290486px; + padding-left: 1.25em; } + .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 290486px; + border-top-right-radius: 290486px; + padding-right: 1.25em; } + .tabs.is-small, #documenter .docs-sidebar form.docs-search > input.tabs { + font-size: 0.75rem; } + .tabs.is-medium { + font-size: 1.25rem; } + .tabs.is-large { + font-size: 1.5rem; } + +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > .column.is-narrow { + flex: none; } + .columns.is-mobile > .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > .column.is-1 { + flex: none; + width: 8.3333333333%; } + .columns.is-mobile > .column.is-offset-1 { + margin-left: 8.3333333333%; } + .columns.is-mobile > .column.is-2 { + flex: none; + width: 16.6666666667%; } + .columns.is-mobile > .column.is-offset-2 { + margin-left: 16.6666666667%; } + .columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > .column.is-4 { + flex: none; + width: 33.3333333333%; } + .columns.is-mobile > .column.is-offset-4 { + margin-left: 33.3333333333%; } + .columns.is-mobile > .column.is-5 { + flex: none; + width: 41.6666666667%; } + .columns.is-mobile > .column.is-offset-5 { + margin-left: 41.6666666667%; } + .columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > .column.is-7 { + flex: none; + width: 58.3333333333%; } + .columns.is-mobile > .column.is-offset-7 { + margin-left: 58.3333333333%; } + .columns.is-mobile > .column.is-8 { + flex: none; + width: 66.6666666667%; } + .columns.is-mobile > .column.is-offset-8 { + margin-left: 66.6666666667%; } + .columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > .column.is-10 { + flex: none; + width: 83.3333333333%; } + .columns.is-mobile > .column.is-offset-10 { + margin-left: 83.3333333333%; } + .columns.is-mobile > .column.is-11 { + flex: none; + width: 91.6666666667%; } + .columns.is-mobile > .column.is-offset-11 { + margin-left: 91.6666666667%; } + .columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; } + .column.is-full-mobile { + flex: none; + width: 100%; } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + .column.is-half-mobile { + flex: none; + width: 50%; } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + .column.is-offset-half-mobile { + margin-left: 50%; } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + .column.is-0-mobile { + flex: none; + width: 0%; } + .column.is-offset-0-mobile { + margin-left: 0%; } + .column.is-1-mobile { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-mobile { + margin-left: 8.3333333333%; } + .column.is-2-mobile { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-mobile { + margin-left: 16.6666666667%; } + .column.is-3-mobile { + flex: none; + width: 25%; } + .column.is-offset-3-mobile { + margin-left: 25%; } + .column.is-4-mobile { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-mobile { + margin-left: 33.3333333333%; } + .column.is-5-mobile { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-mobile { + margin-left: 41.6666666667%; } + .column.is-6-mobile { + flex: none; + width: 50%; } + .column.is-offset-6-mobile { + margin-left: 50%; } + .column.is-7-mobile { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-mobile { + margin-left: 58.3333333333%; } + .column.is-8-mobile { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-mobile { + margin-left: 66.6666666667%; } + .column.is-9-mobile { + flex: none; + width: 75%; } + .column.is-offset-9-mobile { + margin-left: 75%; } + .column.is-10-mobile { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-mobile { + margin-left: 83.3333333333%; } + .column.is-11-mobile { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-mobile { + margin-left: 91.6666666667%; } + .column.is-12-mobile { + flex: none; + width: 100%; } + .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + .column.is-narrow, .column.is-narrow-tablet { + flex: none; } + .column.is-full, .column.is-full-tablet { + flex: none; + width: 100%; } + .column.is-three-quarters, .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + .column.is-two-thirds, .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + .column.is-half, .column.is-half-tablet { + flex: none; + width: 50%; } + .column.is-one-third, .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + .column.is-one-quarter, .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + .column.is-one-fifth, .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + .column.is-two-fifths, .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + .column.is-three-fifths, .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + .column.is-four-fifths, .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + .column.is-offset-half, .column.is-offset-half-tablet { + margin-left: 50%; } + .column.is-offset-one-third, .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + .column.is-0, .column.is-0-tablet { + flex: none; + width: 0%; } + .column.is-offset-0, .column.is-offset-0-tablet { + margin-left: 0%; } + .column.is-1, .column.is-1-tablet { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1, .column.is-offset-1-tablet { + margin-left: 8.3333333333%; } + .column.is-2, .column.is-2-tablet { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2, .column.is-offset-2-tablet { + margin-left: 16.6666666667%; } + .column.is-3, .column.is-3-tablet { + flex: none; + width: 25%; } + .column.is-offset-3, .column.is-offset-3-tablet { + margin-left: 25%; } + .column.is-4, .column.is-4-tablet { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4, .column.is-offset-4-tablet { + margin-left: 33.3333333333%; } + .column.is-5, .column.is-5-tablet { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5, .column.is-offset-5-tablet { + margin-left: 41.6666666667%; } + .column.is-6, .column.is-6-tablet { + flex: none; + width: 50%; } + .column.is-offset-6, .column.is-offset-6-tablet { + margin-left: 50%; } + .column.is-7, .column.is-7-tablet { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7, .column.is-offset-7-tablet { + margin-left: 58.3333333333%; } + .column.is-8, .column.is-8-tablet { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8, .column.is-offset-8-tablet { + margin-left: 66.6666666667%; } + .column.is-9, .column.is-9-tablet { + flex: none; + width: 75%; } + .column.is-offset-9, .column.is-offset-9-tablet { + margin-left: 75%; } + .column.is-10, .column.is-10-tablet { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10, .column.is-offset-10-tablet { + margin-left: 83.3333333333%; } + .column.is-11, .column.is-11-tablet { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11, .column.is-offset-11-tablet { + margin-left: 91.6666666667%; } + .column.is-12, .column.is-12-tablet { + flex: none; + width: 100%; } + .column.is-offset-12, .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1055px) { + .column.is-narrow-touch { + flex: none; } + .column.is-full-touch { + flex: none; + width: 100%; } + .column.is-three-quarters-touch { + flex: none; + width: 75%; } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + .column.is-half-touch { + flex: none; + width: 50%; } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-touch { + flex: none; + width: 25%; } + .column.is-one-fifth-touch { + flex: none; + width: 20%; } + .column.is-two-fifths-touch { + flex: none; + width: 40%; } + .column.is-three-fifths-touch { + flex: none; + width: 60%; } + .column.is-four-fifths-touch { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-touch { + margin-left: 75%; } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + .column.is-offset-half-touch { + margin-left: 50%; } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-touch { + margin-left: 25%; } + .column.is-offset-one-fifth-touch { + margin-left: 20%; } + .column.is-offset-two-fifths-touch { + margin-left: 40%; } + .column.is-offset-three-fifths-touch { + margin-left: 60%; } + .column.is-offset-four-fifths-touch { + margin-left: 80%; } + .column.is-0-touch { + flex: none; + width: 0%; } + .column.is-offset-0-touch { + margin-left: 0%; } + .column.is-1-touch { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-touch { + margin-left: 8.3333333333%; } + .column.is-2-touch { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-touch { + margin-left: 16.6666666667%; } + .column.is-3-touch { + flex: none; + width: 25%; } + .column.is-offset-3-touch { + margin-left: 25%; } + .column.is-4-touch { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-touch { + margin-left: 33.3333333333%; } + .column.is-5-touch { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-touch { + margin-left: 41.6666666667%; } + .column.is-6-touch { + flex: none; + width: 50%; } + .column.is-offset-6-touch { + margin-left: 50%; } + .column.is-7-touch { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-touch { + margin-left: 58.3333333333%; } + .column.is-8-touch { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-touch { + margin-left: 66.6666666667%; } + .column.is-9-touch { + flex: none; + width: 75%; } + .column.is-offset-9-touch { + margin-left: 75%; } + .column.is-10-touch { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-touch { + margin-left: 83.3333333333%; } + .column.is-11-touch { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-touch { + margin-left: 91.6666666667%; } + .column.is-12-touch { + flex: none; + width: 100%; } + .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1056px) { + .column.is-narrow-desktop { + flex: none; } + .column.is-full-desktop { + flex: none; + width: 100%; } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + .column.is-half-desktop { + flex: none; + width: 50%; } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + .column.is-offset-half-desktop { + margin-left: 50%; } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + .column.is-0-desktop { + flex: none; + width: 0%; } + .column.is-offset-0-desktop { + margin-left: 0%; } + .column.is-1-desktop { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-desktop { + margin-left: 8.3333333333%; } + .column.is-2-desktop { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-desktop { + margin-left: 16.6666666667%; } + .column.is-3-desktop { + flex: none; + width: 25%; } + .column.is-offset-3-desktop { + margin-left: 25%; } + .column.is-4-desktop { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-desktop { + margin-left: 33.3333333333%; } + .column.is-5-desktop { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-desktop { + margin-left: 41.6666666667%; } + .column.is-6-desktop { + flex: none; + width: 50%; } + .column.is-offset-6-desktop { + margin-left: 50%; } + .column.is-7-desktop { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-desktop { + margin-left: 58.3333333333%; } + .column.is-8-desktop { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-desktop { + margin-left: 66.6666666667%; } + .column.is-9-desktop { + flex: none; + width: 75%; } + .column.is-offset-9-desktop { + margin-left: 75%; } + .column.is-10-desktop { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-desktop { + margin-left: 83.3333333333%; } + .column.is-11-desktop { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-desktop { + margin-left: 91.6666666667%; } + .column.is-12-desktop { + flex: none; + width: 100%; } + .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + .column.is-narrow-widescreen { + flex: none; } + .column.is-full-widescreen { + flex: none; + width: 100%; } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + .column.is-half-widescreen { + flex: none; + width: 50%; } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + .column.is-offset-half-widescreen { + margin-left: 50%; } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + .column.is-0-widescreen { + flex: none; + width: 0%; } + .column.is-offset-0-widescreen { + margin-left: 0%; } + .column.is-1-widescreen { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-widescreen { + margin-left: 8.3333333333%; } + .column.is-2-widescreen { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-widescreen { + margin-left: 16.6666666667%; } + .column.is-3-widescreen { + flex: none; + width: 25%; } + .column.is-offset-3-widescreen { + margin-left: 25%; } + .column.is-4-widescreen { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-widescreen { + margin-left: 33.3333333333%; } + .column.is-5-widescreen { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-widescreen { + margin-left: 41.6666666667%; } + .column.is-6-widescreen { + flex: none; + width: 50%; } + .column.is-offset-6-widescreen { + margin-left: 50%; } + .column.is-7-widescreen { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-widescreen { + margin-left: 58.3333333333%; } + .column.is-8-widescreen { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-widescreen { + margin-left: 66.6666666667%; } + .column.is-9-widescreen { + flex: none; + width: 75%; } + .column.is-offset-9-widescreen { + margin-left: 75%; } + .column.is-10-widescreen { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-widescreen { + margin-left: 83.3333333333%; } + .column.is-11-widescreen { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-widescreen { + margin-left: 91.6666666667%; } + .column.is-12-widescreen { + flex: none; + width: 100%; } + .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + .column.is-narrow-fullhd { + flex: none; } + .column.is-full-fullhd { + flex: none; + width: 100%; } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + .column.is-half-fullhd { + flex: none; + width: 50%; } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + .column.is-offset-half-fullhd { + margin-left: 50%; } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + .column.is-0-fullhd { + flex: none; + width: 0%; } + .column.is-offset-0-fullhd { + margin-left: 0%; } + .column.is-1-fullhd { + flex: none; + width: 8.3333333333%; } + .column.is-offset-1-fullhd { + margin-left: 8.3333333333%; } + .column.is-2-fullhd { + flex: none; + width: 16.6666666667%; } + .column.is-offset-2-fullhd { + margin-left: 16.6666666667%; } + .column.is-3-fullhd { + flex: none; + width: 25%; } + .column.is-offset-3-fullhd { + margin-left: 25%; } + .column.is-4-fullhd { + flex: none; + width: 33.3333333333%; } + .column.is-offset-4-fullhd { + margin-left: 33.3333333333%; } + .column.is-5-fullhd { + flex: none; + width: 41.6666666667%; } + .column.is-offset-5-fullhd { + margin-left: 41.6666666667%; } + .column.is-6-fullhd { + flex: none; + width: 50%; } + .column.is-offset-6-fullhd { + margin-left: 50%; } + .column.is-7-fullhd { + flex: none; + width: 58.3333333333%; } + .column.is-offset-7-fullhd { + margin-left: 58.3333333333%; } + .column.is-8-fullhd { + flex: none; + width: 66.6666666667%; } + .column.is-offset-8-fullhd { + margin-left: 66.6666666667%; } + .column.is-9-fullhd { + flex: none; + width: 75%; } + .column.is-offset-9-fullhd { + margin-left: 75%; } + .column.is-10-fullhd { + flex: none; + width: 83.3333333333%; } + .column.is-offset-10-fullhd { + margin-left: 83.3333333333%; } + .column.is-11-fullhd { + flex: none; + width: 91.6666666667%; } + .column.is-offset-11-fullhd { + margin-left: 91.6666666667%; } + .column.is-12-fullhd { + flex: none; + width: 100%; } + .column.is-offset-12-fullhd { + margin-left: 100%; } } +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .columns:last-child { + margin-bottom: -0.75rem; } + .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + .columns.is-centered { + justify-content: center; } + .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + .columns.is-gapless:last-child { + margin-bottom: 0; } + .columns.is-mobile { + display: flex; } + .columns.is-multiline { + flex-wrap: wrap; } + .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1056px) { + .columns.is-desktop { + display: flex; } } +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + .columns.is-variable .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1055px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1055px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1056px) and (max-width: 1215px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + .tile.is-child { + margin: 0 !important; } + .tile.is-parent { + padding: 0.75rem; } + .tile.is-vertical { + flex-direction: column; } + .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; } + .tile.is-1 { + flex: none; + width: 8.3333333333%; } + .tile.is-2 { + flex: none; + width: 16.6666666667%; } + .tile.is-3 { + flex: none; + width: 25%; } + .tile.is-4 { + flex: none; + width: 33.3333333333%; } + .tile.is-5 { + flex: none; + width: 41.6666666667%; } + .tile.is-6 { + flex: none; + width: 50%; } + .tile.is-7 { + flex: none; + width: 58.3333333333%; } + .tile.is-8 { + flex: none; + width: 66.6666666667%; } + .tile.is-9 { + flex: none; + width: 75%; } + .tile.is-10 { + flex: none; + width: 83.3333333333%; } + .tile.is-11 { + flex: none; + width: 91.6666666667%; } + .tile.is-12 { + flex: none; + width: 100%; } } +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + .hero .navbar { + background: none; } + .hero .tabs ul { + border-bottom: none; } + .hero.is-white { + background-color: white; + color: #0a0a0a; } + .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-white strong { + color: inherit; } + .hero.is-white .title { + color: #0a0a0a; } + .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + .hero.is-white .subtitle a:not(.button), + .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1055px) { + .hero.is-white .navbar-menu { + background-color: white; } } + .hero.is-white .navbar-item, + .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, + .hero.is-white .navbar-link:hover, + .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + .hero.is-white .tabs a:hover { + opacity: 1; } + .hero.is-white .tabs li.is-active a { + opacity: 1; } + .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + .hero.is-black { + background-color: #0a0a0a; + color: white; } + .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-black strong { + color: inherit; } + .hero.is-black .title { + color: white; } + .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-black .subtitle a:not(.button), + .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1055px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + .hero.is-black .navbar-item, + .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, + .hero.is-black .navbar-link:hover, + .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + .hero.is-black .tabs a:hover { + opacity: 1; } + .hero.is-black .tabs li.is-active a { + opacity: 1; } + .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { + color: white; } + .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + .hero.is-light { + background-color: whitesmoke; + color: #363636; } + .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-light strong { + color: inherit; } + .hero.is-light .title { + color: #363636; } + .hero.is-light .subtitle { + color: rgba(54, 54, 54, 0.9); } + .hero.is-light .subtitle a:not(.button), + .hero.is-light .subtitle strong { + color: #363636; } + @media screen and (max-width: 1055px) { + .hero.is-light .navbar-menu { + background-color: whitesmoke; } } + .hero.is-light .navbar-item, + .hero.is-light .navbar-link { + color: rgba(54, 54, 54, 0.7); } + .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, + .hero.is-light .navbar-link:hover, + .hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: #363636; } + .hero.is-light .tabs a { + color: #363636; + opacity: 0.9; } + .hero.is-light .tabs a:hover { + opacity: 1; } + .hero.is-light .tabs li.is-active a { + opacity: 1; } + .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { + color: #363636; } + .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: #363636; + border-color: #363636; + color: whitesmoke; } + .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } + .hero.is-dark, .content kbd.hero { + background-color: #363636; + color: whitesmoke; } + .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-dark strong, + .content kbd.hero strong { + color: inherit; } + .hero.is-dark .title, .content kbd.hero .title { + color: whitesmoke; } + .hero.is-dark .subtitle, .content kbd.hero .subtitle { + color: rgba(245, 245, 245, 0.9); } + .hero.is-dark .subtitle a:not(.button), .content kbd.hero .subtitle a:not(.button), + .hero.is-dark .subtitle strong, + .content kbd.hero .subtitle strong { + color: whitesmoke; } + @media screen and (max-width: 1055px) { + .hero.is-dark .navbar-menu, .content kbd.hero .navbar-menu { + background-color: #363636; } } + .hero.is-dark .navbar-item, .content kbd.hero .navbar-item, + .hero.is-dark .navbar-link, + .content kbd.hero .navbar-link { + color: rgba(245, 245, 245, 0.7); } + .hero.is-dark a.navbar-item:hover, .content kbd.hero a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, .content kbd.hero a.navbar-item.is-active, + .hero.is-dark .navbar-link:hover, + .content kbd.hero .navbar-link:hover, + .hero.is-dark .navbar-link.is-active, + .content kbd.hero .navbar-link.is-active { + background-color: #292929; + color: whitesmoke; } + .hero.is-dark .tabs a, .content kbd.hero .tabs a { + color: whitesmoke; + opacity: 0.9; } + .hero.is-dark .tabs a:hover, .content kbd.hero .tabs a:hover { + opacity: 1; } + .hero.is-dark .tabs li.is-active a, .content kbd.hero .tabs li.is-active a { + opacity: 1; } + .hero.is-dark .tabs.is-boxed a, .content kbd.hero .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .content kbd.hero .tabs.is-toggle a { + color: whitesmoke; } + .hero.is-dark .tabs.is-boxed a:hover, .content kbd.hero .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .content kbd.hero .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-dark .tabs.is-boxed li.is-active a, .content kbd.hero .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .content kbd.hero .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: whitesmoke; + border-color: whitesmoke; + color: #363636; } + .hero.is-dark.is-bold, .content kbd.hero.is-bold { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } + @media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu, .content kbd.hero.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } + .hero.is-primary, .docstring > section > a.hero.docs-sourcelink { + background-color: #4eb5de; + color: #fff; } + .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-primary strong, + .docstring > section > a.hero.docs-sourcelink strong { + color: inherit; } + .hero.is-primary .title, .docstring > section > a.hero.docs-sourcelink .title { + color: #fff; } + .hero.is-primary .subtitle, .docstring > section > a.hero.docs-sourcelink .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-primary .subtitle a:not(.button), .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), + .hero.is-primary .subtitle strong, + .docstring > section > a.hero.docs-sourcelink .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-primary .navbar-menu, .docstring > section > a.hero.docs-sourcelink .navbar-menu { + background-color: #4eb5de; } } + .hero.is-primary .navbar-item, .docstring > section > a.hero.docs-sourcelink .navbar-item, + .hero.is-primary .navbar-link, + .docstring > section > a.hero.docs-sourcelink .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-primary a.navbar-item:hover, .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, + .hero.is-primary .navbar-link:hover, + .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, + .hero.is-primary .navbar-link.is-active, + .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { + background-color: #39acda; + color: #fff; } + .hero.is-primary .tabs a, .docstring > section > a.hero.docs-sourcelink .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-primary .tabs a:hover, .docstring > section > a.hero.docs-sourcelink .tabs a:hover { + opacity: 1; } + .hero.is-primary .tabs li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { + opacity: 1; } + .hero.is-primary .tabs.is-boxed a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { + color: #fff; } + .hero.is-primary .tabs.is-boxed a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-primary .tabs.is-boxed li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #4eb5de; } + .hero.is-primary.is-bold, .docstring > section > a.hero.is-bold.docs-sourcelink { + background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } + @media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu, .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { + background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } } + .hero.is-link { + background-color: #2e63b8; + color: #fff; } + .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-link strong { + color: inherit; } + .hero.is-link .title { + color: #fff; } + .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-link .subtitle a:not(.button), + .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-link .navbar-menu { + background-color: #2e63b8; } } + .hero.is-link .navbar-item, + .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, + .hero.is-link .navbar-link:hover, + .hero.is-link .navbar-link.is-active { + background-color: #2958a4; + color: #fff; } + .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-link .tabs a:hover { + opacity: 1; } + .hero.is-link .tabs li.is-active a { + opacity: 1; } + .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { + color: #fff; } + .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #2e63b8; } + .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } + @media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } } + .hero.is-info { + background-color: #209cee; + color: #fff; } + .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-info strong { + color: inherit; } + .hero.is-info .title { + color: #fff; } + .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-info .subtitle a:not(.button), + .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-info .navbar-menu { + background-color: #209cee; } } + .hero.is-info .navbar-item, + .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, + .hero.is-info .navbar-link:hover, + .hero.is-info .navbar-link.is-active { + background-color: #1190e3; + color: #fff; } + .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-info .tabs a:hover { + opacity: 1; } + .hero.is-info .tabs li.is-active a { + opacity: 1; } + .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { + color: #fff; } + .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #209cee; } + .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } + @media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } } + .hero.is-success { + background-color: #22c35b; + color: #fff; } + .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-success strong { + color: inherit; } + .hero.is-success .title { + color: #fff; } + .hero.is-success .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-success .subtitle a:not(.button), + .hero.is-success .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-success .navbar-menu { + background-color: #22c35b; } } + .hero.is-success .navbar-item, + .hero.is-success .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, + .hero.is-success .navbar-link:hover, + .hero.is-success .navbar-link.is-active { + background-color: #1ead51; + color: #fff; } + .hero.is-success .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-success .tabs a:hover { + opacity: 1; } + .hero.is-success .tabs li.is-active a { + opacity: 1; } + .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { + color: #fff; } + .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #22c35b; } + .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } + @media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } } + .hero.is-warning { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-warning strong { + color: inherit; } + .hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-warning .subtitle a:not(.button), + .hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); } + @media screen and (max-width: 1055px) { + .hero.is-warning .navbar-menu { + background-color: #ffdd57; } } + .hero.is-warning .navbar-item, + .hero.is-warning .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, + .hero.is-warning .navbar-link:hover, + .hero.is-warning .navbar-link.is-active { + background-color: #ffd83e; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-warning .tabs a:hover { + opacity: 1; } + .hero.is-warning .tabs li.is-active a { + opacity: 1; } + .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ffdd57; } + .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } + @media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } } + .hero.is-danger { + background-color: #da0b00; + color: #fff; } + .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-danger strong { + color: inherit; } + .hero.is-danger .title { + color: #fff; } + .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-danger .subtitle a:not(.button), + .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1055px) { + .hero.is-danger .navbar-menu { + background-color: #da0b00; } } + .hero.is-danger .navbar-item, + .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, + .hero.is-danger .navbar-link:hover, + .hero.is-danger .navbar-link.is-active { + background-color: #c10a00; + color: #fff; } + .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-danger .tabs a:hover { + opacity: 1; } + .hero.is-danger .tabs li.is-active a { + opacity: 1; } + .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { + color: #fff; } + .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #da0b00; } + .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } + @media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } } + .hero.is-small .hero-body, #documenter .docs-sidebar form.docs-search > input.hero .hero-body { + padding-bottom: 1.5rem; + padding-top: 1.5rem; } + @media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding-bottom: 9rem; + padding-top: 9rem; } } + @media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding-bottom: 18rem; + padding-top: 18rem; } } + .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + .hero.is-halfheight { + min-height: 50vh; } + .hero.is-fullheight { + min-height: 100vh; } + +.hero-video { + overflow: hidden; } + .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + .hero-video { + display: none; } } +.hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; } + +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + +.section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1056px) { + .section.is-medium { + padding: 9rem 1.5rem; } + .section.is-large { + padding: 18rem 1.5rem; } } +.footer { + background-color: #fafafa; + padding: 3rem 1.5rem 6rem; } + +h1 .docs-heading-anchor, h1 .docs-heading-anchor:hover, h1 .docs-heading-anchor:visited, h2 .docs-heading-anchor, h2 .docs-heading-anchor:hover, h2 .docs-heading-anchor:visited, h3 .docs-heading-anchor, h3 .docs-heading-anchor:hover, h3 .docs-heading-anchor:visited, h4 .docs-heading-anchor, h4 .docs-heading-anchor:hover, h4 .docs-heading-anchor:visited, h5 .docs-heading-anchor, h5 .docs-heading-anchor:hover, h5 .docs-heading-anchor:visited, h6 .docs-heading-anchor, h6 .docs-heading-anchor:hover, h6 .docs-heading-anchor:visited { + color: #222222; } + +h1 .docs-heading-anchor-permalink, h2 .docs-heading-anchor-permalink, h3 .docs-heading-anchor-permalink, h4 .docs-heading-anchor-permalink, h5 .docs-heading-anchor-permalink, h6 .docs-heading-anchor-permalink { + visibility: hidden; + vertical-align: middle; + margin-left: 0.5em; + font-size: 0.7rem; } + h1 .docs-heading-anchor-permalink::before, h2 .docs-heading-anchor-permalink::before, h3 .docs-heading-anchor-permalink::before, h4 .docs-heading-anchor-permalink::before, h5 .docs-heading-anchor-permalink::before, h6 .docs-heading-anchor-permalink::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f0c1"; } + +h1:hover .docs-heading-anchor-permalink, h2:hover .docs-heading-anchor-permalink, h3:hover .docs-heading-anchor-permalink, h4:hover .docs-heading-anchor-permalink, h5:hover .docs-heading-anchor-permalink, h6:hover .docs-heading-anchor-permalink { + visibility: visible; } + +.docs-dark-only { + display: none !important; } + +pre { + position: relative; + overflow: hidden; } + pre code, pre code.hljs { + padding: 0 0.75rem !important; + overflow: auto; + display: block; } + pre code:first-of-type, pre code.hljs:first-of-type { + padding-top: 0.5rem !important; } + pre code:last-of-type, pre code.hljs:last-of-type { + padding-bottom: 0.5rem !important; } + pre .copy-button { + opacity: 0.2; + transition: opacity 0.2s; + position: absolute; + right: 0em; + top: 0em; + padding: 0.5em; + width: 2.5em; + height: 2.5em; + background: transparent; + border: none; + font-family: "Font Awesome 5 Free"; + color: #222222; + cursor: pointer; + text-align: center; } + pre .copy-button:focus, pre .copy-button:hover { + opacity: 1; + background: rgba(34, 34, 34, 0.1); + color: #2e63b8; } + pre .copy-button.success { + color: #259a12; + opacity: 1; } + pre .copy-button.error { + color: #cb3c33; + opacity: 1; } + pre:hover .copy-button { + opacity: 1; } + +.admonition { + background-color: #b5b5b5; + border-style: solid; + border-width: 1px; + border-color: #363636; + border-radius: 4px; + font-size: 1rem; } + .admonition strong { + color: currentColor; } + .admonition.is-small, #documenter .docs-sidebar form.docs-search > input.admonition { + font-size: 0.75rem; } + .admonition.is-medium { + font-size: 1.25rem; } + .admonition.is-large { + font-size: 1.5rem; } + .admonition.is-default { + background-color: #b5b5b5; + border-color: #363636; } + .admonition.is-default > .admonition-header { + background-color: #363636; + color: #fff; } + .admonition.is-default > .admonition-body { + color: #fff; } + .admonition.is-info { + background-color: #def0fc; + border-color: #209cee; } + .admonition.is-info > .admonition-header { + background-color: #209cee; + color: #fff; } + .admonition.is-info > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-success { + background-color: #bdf4d1; + border-color: #22c35b; } + .admonition.is-success > .admonition-header { + background-color: #22c35b; + color: #fff; } + .admonition.is-success > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-warning { + background-color: #fff3c5; + border-color: #ffdd57; } + .admonition.is-warning > .admonition-header { + background-color: #ffdd57; + color: rgba(0, 0, 0, 0.7); } + .admonition.is-warning > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-danger { + background-color: #ffaba7; + border-color: #da0b00; } + .admonition.is-danger > .admonition-header { + background-color: #da0b00; + color: #fff; } + .admonition.is-danger > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + .admonition.is-compat { + background-color: #bdeff5; + border-color: #1db5c9; } + .admonition.is-compat > .admonition-header { + background-color: #1db5c9; + color: #fff; } + .admonition.is-compat > .admonition-body { + color: rgba(0, 0, 0, 0.7); } + +.admonition-header { + color: #fff; + background-color: #363636; + align-items: center; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.5rem 0.75rem; + position: relative; } + .admonition-header:before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 0.75rem; + content: "\f06a"; } + +.admonition-body { + color: #222222; + padding: 0.5rem 0.75rem; } + .admonition-body pre { + background-color: whitesmoke; } + .admonition-body code { + background-color: rgba(0, 0, 0, 0.05); } + +.docstring { + margin-bottom: 1em; + background-color: transparent; + border: 1px solid #dbdbdb; + box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); + max-width: 100%; } + .docstring > header { + display: flex; + flex-grow: 1; + align-items: stretch; + padding: 0.5rem 0.75rem; + background-color: whitesmoke; + box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); + box-shadow: none; + border-bottom: 1px solid #dbdbdb; } + .docstring > header code { + background-color: transparent; } + .docstring > header .docstring-binding { + margin-right: 0.3em; } + .docstring > header .docstring-category { + margin-left: 0.3em; } + .docstring > section { + position: relative; + padding: 0.75rem 0.75rem; + border-bottom: 1px solid #dbdbdb; } + .docstring > section:last-child { + border-bottom: none; } + .docstring > section > a.docs-sourcelink { + transition: opacity 0.3s; + opacity: 0; + position: absolute; + right: 0.375rem; + bottom: 0.375rem; } + .docstring > section > a.docs-sourcelink:focus { + opacity: 1 !important; } + .docstring:hover > section > a.docs-sourcelink { + opacity: 0.2; } + .docstring:focus-within > section > a.docs-sourcelink { + opacity: 0.2; } + .docstring > section:hover a.docs-sourcelink { + opacity: 1; } + +.documenter-example-output { + background-color: white; } + +.outdated-warning-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + z-index: 999; + background-color: #ffaba7; + color: rgba(0, 0, 0, 0.7); + border-bottom: 3px solid #da0b00; + padding: 10px 35px; + text-align: center; + font-size: 15px; } + .outdated-warning-overlay .outdated-warning-closer { + position: absolute; + top: calc(50% - 10px); + right: 18px; + cursor: pointer; + width: 12px; } + .outdated-warning-overlay a { + color: #2e63b8; } + .outdated-warning-overlay a:hover { + color: #363636; } + +.content pre { + border: 1px solid #dbdbdb; } + +.content code { + font-weight: inherit; } + +.content a code { + color: #2e63b8; } + +.content h1 code, .content h2 code, .content h3 code, .content h4 code, .content h5 code, .content h6 code { + color: #222222; } + +.content table { + display: block; + width: initial; + max-width: 100%; + overflow-x: auto; } + +.content blockquote > ul:first-child, .content blockquote > ol:first-child, .content .admonition-body > ul:first-child, .content .admonition-body > ol:first-child { + margin-top: 0; } + +pre, code { + font-variant-ligatures: no-contextual; } + +.breadcrumb a.is-disabled { + cursor: default; + pointer-events: none; } + .breadcrumb a.is-disabled, .breadcrumb a.is-disabled:hover { + color: #222222; } + +.hljs { + background: initial !important; } + +.katex .katex-mathml { + top: 0; + right: 0; } + +.katex-display, mjx-container, .MathJax_Display { + margin: 0.5em 0 !important; } + +html { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; } + +li.no-marker { + list-style: none; } + +/* This file contain the overall layout. + * + * The main container is
    that is identified by id #documenter. + */ +#documenter .docs-main > article { + overflow-wrap: break-word; } + #documenter .docs-main > article .math-container { + overflow-x: auto; + overflow-y: hidden; } + +@media screen and (min-width: 1056px) { + #documenter .docs-main { + max-width: 52rem; + margin-left: 20rem; + padding-right: 1rem; } } + +@media screen and (max-width: 1055px) { + #documenter .docs-main { + width: 100%; } + #documenter .docs-main > article { + max-width: 52rem; + margin-left: auto; + margin-right: auto; + margin-bottom: 1rem; + padding: 0 1rem; } + #documenter .docs-main > header, #documenter .docs-main > nav { + max-width: 100%; + width: 100%; + margin: 0; } } + +#documenter .docs-main header.docs-navbar { + background-color: white; + border-bottom: 1px solid #dbdbdb; + z-index: 2; + min-height: 4rem; + margin-bottom: 1rem; + display: flex; } + #documenter .docs-main header.docs-navbar .breadcrumb { + flex-grow: 1; } + #documenter .docs-main header.docs-navbar .docs-right { + display: flex; + white-space: nowrap; } + #documenter .docs-main header.docs-navbar .docs-right .docs-icon, #documenter .docs-main header.docs-navbar .docs-right .docs-label, #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + display: inline-block; } + #documenter .docs-main header.docs-navbar .docs-right .docs-label { + padding: 0; + margin-left: 0.3em; } + #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { + margin: auto 0 auto 1rem; } + #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { + font-size: 1.5rem; + margin: auto 0 auto 1rem; } + #documenter .docs-main header.docs-navbar > * { + margin: auto 0; } + @media screen and (max-width: 1055px) { + #documenter .docs-main header.docs-navbar { + position: sticky; + top: 0; + padding: 0 1rem; + /* For Headroom.js */ + transition-property: top, box-shadow; + -webkit-transition-property: top, box-shadow; + /* Safari */ + transition-duration: 0.3s; + -webkit-transition-duration: 0.3s; + /* Safari */ } + #documenter .docs-main header.docs-navbar.headroom--not-top { + box-shadow: 0.2rem 0rem 0.4rem #bbb; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } + #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { + top: -4.5rem; + transition-duration: 0.7s; + -webkit-transition-duration: 0.7s; + /* Safari */ } } +#documenter .docs-main section.footnotes { + border-top: 1px solid #dbdbdb; } + #documenter .docs-main section.footnotes li .tag:first-child, #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, #documenter .docs-main section.footnotes li .content kbd:first-child, .content #documenter .docs-main section.footnotes li kbd:first-child { + margin-right: 1em; + margin-bottom: 0.4em; } + +#documenter .docs-main .docs-footer { + display: flex; + flex-wrap: wrap; + margin-left: 0; + margin-right: 0; + border-top: 1px solid #dbdbdb; + padding-top: 1rem; + padding-bottom: 1rem; } + @media screen and (max-width: 1055px) { + #documenter .docs-main .docs-footer { + padding-left: 1rem; + padding-right: 1rem; } } + #documenter .docs-main .docs-footer .docs-footer-nextpage, #documenter .docs-main .docs-footer .docs-footer-prevpage { + flex-grow: 1; } + #documenter .docs-main .docs-footer .docs-footer-nextpage { + text-align: right; } + #documenter .docs-main .docs-footer .flexbox-break { + flex-basis: 100%; + height: 0; } + #documenter .docs-main .docs-footer .footer-message { + font-size: 0.8em; + margin: 0.5em auto 0 auto; + text-align: center; } + +#documenter .docs-sidebar { + display: flex; + flex-direction: column; + color: #0a0a0a; + background-color: whitesmoke; + border-right: 1px solid #dbdbdb; + padding: 0; + flex: 0 0 18rem; + z-index: 5; + font-size: 1rem; + position: fixed; + left: -18rem; + width: 18rem; + height: 100%; + transition: left 0.3s; + /* Setting up a nicer theme style for the scrollbar */ } + #documenter .docs-sidebar.visible { + left: 0; + box-shadow: 0.4rem 0rem 0.8rem #bbb; } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar.visible { + box-shadow: none; } } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar { + left: 0; + top: 0; } } + #documenter .docs-sidebar .docs-logo { + margin-top: 1rem; + padding: 0 1rem; } + #documenter .docs-sidebar .docs-logo > img { + max-height: 6rem; + margin: auto; } + #documenter .docs-sidebar .docs-package-name { + flex-shrink: 0; + font-size: 1.5rem; + font-weight: 700; + text-align: center; + white-space: nowrap; + overflow: hidden; + padding: 0.5rem 0; } + #documenter .docs-sidebar .docs-package-name .docs-autofit { + max-width: 16.2rem; } + #documenter .docs-sidebar .docs-package-name a, #documenter .docs-sidebar .docs-package-name a:hover { + color: #0a0a0a; } + #documenter .docs-sidebar .docs-version-selector { + border-top: 1px solid #dbdbdb; + display: none; + padding: 0.5rem; } + #documenter .docs-sidebar .docs-version-selector.visible { + display: flex; } + #documenter .docs-sidebar ul.docs-menu { + flex-grow: 1; + user-select: none; + border-top: 1px solid #dbdbdb; + padding-bottom: 1.5rem; + /* Managing collapsible submenus */ } + #documenter .docs-sidebar ul.docs-menu > li > .tocitem { + font-weight: bold; } + #documenter .docs-sidebar ul.docs-menu > li li { + font-size: 0.95rem; + margin-left: 1em; + border-left: 1px solid #dbdbdb; } + #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { + display: none; } + #documenter .docs-sidebar ul.docs-menu ul.collapsed { + display: none; } + #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { + display: block; } + #documenter .docs-sidebar ul.docs-menu label.tocitem { + display: flex; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { + flex-grow: 2; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; + font-size: 0.75rem; + margin-left: 1rem; + margin-top: auto; + margin-bottom: auto; } + #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { + font-family: "Font Awesome 5 Free"; + font-weight: 900; + content: "\f054"; } + #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { + content: "\f078"; } + #documenter .docs-sidebar ul.docs-menu .tocitem { + display: block; + padding: 0.5rem 0.5rem; } + #documenter .docs-sidebar ul.docs-menu .tocitem, #documenter .docs-sidebar ul.docs-menu .tocitem:hover { + color: #0a0a0a; + background: whitesmoke; } + #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { + color: #0a0a0a; + background-color: #ebebeb; } + #documenter .docs-sidebar ul.docs-menu li.is-active { + border-top: 1px solid #dbdbdb; + border-bottom: 1px solid #dbdbdb; + background-color: white; } + #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { + background-color: white; + color: #0a0a0a; } + #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { + background-color: #ebebeb; + color: #0a0a0a; } + #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { + border-top: none; } + #documenter .docs-sidebar ul.docs-menu ul.internal { + margin: 0 0.5rem 0.5rem; + border-top: 1px solid #dbdbdb; } + #documenter .docs-sidebar ul.docs-menu ul.internal li { + font-size: 0.85rem; + border-left: none; + margin-left: 0; + margin-top: 0.5rem; } + #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { + width: 100%; + padding: 0; } + #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { + content: "⚬"; + margin-right: 0.4em; } + #documenter .docs-sidebar form.docs-search { + margin: auto; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } + #documenter .docs-sidebar form.docs-search > input { + width: 14.4rem; } + @media screen and (min-width: 1056px) { + #documenter .docs-sidebar ul.docs-menu { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { + width: .3rem; + background: none; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; } + #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { + background: #cccccc; } } + @media screen and (max-width: 1055px) { + #documenter .docs-sidebar { + overflow-y: auto; + -webkit-overflow-scroll: touch; } + #documenter .docs-sidebar::-webkit-scrollbar { + width: .3rem; + background: none; } + #documenter .docs-sidebar::-webkit-scrollbar-thumb { + border-radius: 5px 0px 0px 5px; + background: #e0e0e0; } + #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { + background: #cccccc; } } +#documenter .docs-main #documenter-search-info { + margin-bottom: 1rem; } + +#documenter .docs-main #documenter-search-results { + list-style-type: circle; + list-style-position: outside; } + #documenter .docs-main #documenter-search-results li { + margin-left: 2rem; } + #documenter .docs-main #documenter-search-results .docs-highlight { + background-color: yellow; } + +.ansi span.sgr1 { + font-weight: bolder; } + +.ansi span.sgr2 { + font-weight: lighter; } + +.ansi span.sgr3 { + font-style: italic; } + +.ansi span.sgr4 { + text-decoration: underline; } + +.ansi span.sgr7 { + color: white; + background-color: #222222; } + +.ansi span.sgr8 { + color: transparent; } + .ansi span.sgr8 span { + color: transparent; } + +.ansi span.sgr9 { + text-decoration: line-through; } + +.ansi span.sgr30 { + color: #242424; } + +.ansi span.sgr31 { + color: #a7201f; } + +.ansi span.sgr32 { + color: #066f00; } + +.ansi span.sgr33 { + color: #856b00; } + +.ansi span.sgr34 { + color: #2149b0; } + +.ansi span.sgr35 { + color: #7d4498; } + +.ansi span.sgr36 { + color: #007989; } + +.ansi span.sgr37 { + color: gray; } + +.ansi span.sgr40 { + background-color: #242424; } + +.ansi span.sgr41 { + background-color: #a7201f; } + +.ansi span.sgr42 { + background-color: #066f00; } + +.ansi span.sgr43 { + background-color: #856b00; } + +.ansi span.sgr44 { + background-color: #2149b0; } + +.ansi span.sgr45 { + background-color: #7d4498; } + +.ansi span.sgr46 { + background-color: #007989; } + +.ansi span.sgr47 { + background-color: gray; } + +.ansi span.sgr90 { + color: #616161; } + +.ansi span.sgr91 { + color: #cb3c33; } + +.ansi span.sgr92 { + color: #0e8300; } + +.ansi span.sgr93 { + color: #a98800; } + +.ansi span.sgr94 { + color: #3c5dcd; } + +.ansi span.sgr95 { + color: #9256af; } + +.ansi span.sgr96 { + color: #008fa3; } + +.ansi span.sgr97 { + color: whitesmoke; } + +.ansi span.sgr100 { + background-color: #616161; } + +.ansi span.sgr101 { + background-color: #cb3c33; } + +.ansi span.sgr102 { + background-color: #0e8300; } + +.ansi span.sgr103 { + background-color: #a98800; } + +.ansi span.sgr104 { + background-color: #3c5dcd; } + +.ansi span.sgr105 { + background-color: #9256af; } + +.ansi span.sgr106 { + background-color: #008fa3; } + +.ansi span.sgr107 { + background-color: whitesmoke; } + +code.language-julia-repl > span.hljs-meta { + color: #066f00; + font-weight: bolder; } + +/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/ +/* +This is left on purpose making default.css the single file that can be lifted +as-is from the repository directly without the need for a build step + +Typically this "required" baseline CSS is added by `makestuff.js` during build. +*/ +pre code.hljs { + display: block; + overflow-x: auto; } + +code.hljs { + padding: 3px 5px; } + +/* end baseline CSS */ +.hljs { + background: #F0F0F0; + color: #444; } + +/* Base color: saturation 0; */ +.hljs-subst { + /* default */ } + +/* purposely ignored */ +.hljs-comment { + color: #888888; } + +.hljs-tag, +.hljs-punctuation { + color: #444a; } + +.hljs-tag .hljs-name, +.hljs-tag .hljs-attr { + color: #444; } + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta .hljs-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; } + +/* User color: hue: 0 */ +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; } + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; } + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-operator, +.hljs-selector-pseudo { + color: #BC6060; } + +/* Language color: hue: 90; */ +.hljs-literal { + color: #78A960; } + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; } + +/* Meta color: hue: 200 */ +.hljs-meta { + color: #1f7199; } + +.hljs-meta .hljs-string { + color: #4d99bf; } + +/* Misc effects */ +.hljs-emphasis { + font-style: italic; } + +.hljs-strong { + font-weight: bold; } diff --git a/v0.15.2/assets/themeswap.js b/v0.15.2/assets/themeswap.js new file mode 100644 index 00000000..c58e993e --- /dev/null +++ b/v0.15.2/assets/themeswap.js @@ -0,0 +1,66 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Intialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if(window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the browser supports user color preference + var darkPreference = false; + // Check if the users preference is for dark color scheme + if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) { + darkPreference = true; + } + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; var disabled = []; var darkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if(themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null); + // Check if the theme is primary dark theme + var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null); + // If ss is for dark theme then set the value of darkTheme to the name of the theme + if(isDarkTheme) darkTheme = themename; + // If we find a matching theme (and it's not the default), we'll set active to non-null + if(themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if(themename !== theme) disabled.push(ss); + } + if(active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + theme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + ss.disabled = true; + }); + } + else if(darkTheme !== null && darkPreference === true) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName('html')[0].className = "theme--" + darkTheme; + // and (2) disable all the other theme stylesheets + disabled.forEach(function(ss){ + if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) { + ss.disabled = true; + } + }); + } +} +set_theme_from_local_storage(); diff --git a/v0.15.2/assets/warner.js b/v0.15.2/assets/warner.js new file mode 100644 index 00000000..5531c885 --- /dev/null +++ b/v0.15.2/assets/warner.js @@ -0,0 +1,49 @@ +function maybeAddWarning () { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return + }; + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return + }; + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return + }; + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement('meta'); + meta.name = 'robots'; + meta.content = 'noindex'; + + document.getElementsByTagName('head')[0].appendChild(meta); + }; + + const div = document.createElement('div'); + div.classList.add('outdated-warning-overlay'); + const closer = document.createElement('button'); + closer.classList.add('outdated-warning-closer', 'delete'); + closer.addEventListener('click', function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE; + div.innerHTML = 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +}; + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', maybeAddWarning); +} else { + maybeAddWarning(); +}; diff --git a/v0.15.2/contributing/index.html b/v0.15.2/contributing/index.html new file mode 100644 index 00000000..45b6a0a0 --- /dev/null +++ b/v0.15.2/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

    Contributors' Guide

    This is a short guide for potential GeophysicalFlows.jl contributors.

    Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

    We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

    What can I do?

    • Tackle an existing issue.

    • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

    • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

    • Improve documentation, docstrings, or comments if you found something is hard to use.

    • Implement a new feature (e.g., a new diagnostic into a module).

    • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

    If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

    Ground Rules

    • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
    • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
    • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
    • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

    Reporting a bug

    The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

    • Head over to the issues page.
    • Search to see if your issue already exists or has even been solved previously.
    • If you indeed have a new issue or request, click the "New Issue" button.
    • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

    Setting up your development environment

    • Install Julia on your system.
    • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
    • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
    • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
      git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
    • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
    • Connect your repository to the upstream (main project).
      git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
    • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
    • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

    Your development environment is now ready!

    Pull Requests

    Changes and contributions should be made via GitHub pull requests against the main branch.

    When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

    When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

    Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

    Documentation

    All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

    We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

    You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

    julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    +julia --project=docs/ docs/make.jl

    and then open docs/build/index.html in your favorite browser.

    Credits

    This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

    diff --git a/v0.15.2/gpu/index.html b/v0.15.2/gpu/index.html new file mode 100644 index 00000000..63fb0cad --- /dev/null +++ b/v0.15.2/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

    GPU

    GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

    All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

    julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
    +Problem
    +  ├─────────── grid: grid (on GPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper

    Selecting GPU device

    FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

    diff --git a/v0.15.2/index.html b/v0.15.2/index.html new file mode 100644 index 00000000..44c2a576 --- /dev/null +++ b/v0.15.2/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

    GeophysicalFlows.jl Documentation

    Overview

    GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

    Examples

    Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

    Fourier transforms normalization

    Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

    \[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

    The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

    \[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

    where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

    Read more in the FourierFlows.jl Documentation; see Grids section.

    Unicode

    Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

    Read more about Unicode symbols in the Julia Documentation.

    Developers

    The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

    Citing

    If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

    Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

    The bibtex entry for the paper is:

    @article{GeophysicalFlowsJOSS,
    +  doi = {10.21105/joss.03053},
    +  url = {https://doi.org/10.21105/joss.03053},
    +  year = {2021},
    +  publisher = {The Open Journal},
    +  volume = {6},
    +  number = {60},
    +  pages = {3053},
    +  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
    +  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
    +  journal = {Journal of Open Source Software}
    +}

    Papers using GeophysicalFlows.jl

    1. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

    2. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.

    3. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.

    4. Drivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.

    5. Palóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

    6. Karrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

    diff --git a/v0.15.2/installation_instructions/index.html b/v0.15.2/installation_instructions/index.html new file mode 100644 index 00000000..eb3cfe0a --- /dev/null +++ b/v0.15.2/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

    Installation instructions

    You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

    julia>]
    +(v1.6) pkg> add GeophysicalFlows
    +(v1.6) pkg> instantiate

    We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

    (v1.6) pkg> update GeophysicalFlows

    Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

    Use Julia 1.6 or newer

    The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

    Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

    Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1

    diff --git a/v0.15.2/lib/functions/index.html b/v0.15.2/lib/functions/index.html new file mode 100644 index 00000000..0ebb8619 --- /dev/null +++ b/v0.15.2/lib/functions/index.html @@ -0,0 +1,89 @@ + +Functions · GeophysicalFlows.jl

    Functions

    GeophysicalFlows

    Exported functions

    GeophysicalFlows.lambdipoleFunction
    lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

    Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

    source
    GeophysicalFlows.peakedisotropicspectrumFunction
    peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

    Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

    source

    TwoDNavierStokes

    Exported functions

    GeophysicalFlows.TwoDNavierStokes.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                  μ = 0,
    +                 nμ = 0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a two-dimensional Navier-Stokes problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Large-scale (hypo)-viscosity coefficient.
    • : (Hypo)-viscosity order, $≤ 0$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.TwoDNavierStokes.energy_workFunction
    energy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

    \[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

    where $ψ$ is the stream flow.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
    enstrophy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

    \[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

    where $ζ$ is the relative vorticity.

    source

    Private functions

    GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

    source
    GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
    energy_dissipation(prob, ξ, νξ)

    Return the domain-averaged energy dissipation rate done by the viscous term,

    \[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
    enstrophy_dissipation(prob, ξ, νξ)

    Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

    \[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source

    SingleLayerQG

    Exported functions

    GeophysicalFlows.SingleLayerQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    + deformation_radius = Inf,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a single-layer quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    GeophysicalFlows.SingleLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

    source

    MultiLayerQG

    Exported functions

    GeophysicalFlows.MultiLayerQG.ProblemFunction
    Problem(nlayers :: Int,
    +                    dev = CPU();
    +                     nx = 128,
    +                     ny = nx,
    +                     Lx = 2π,
    +                     Ly = Lx,
    +                     f₀ = 1.0,
    +                      β = 0.0,
    +                      g = 1.0,
    +                      U = zeros(nlayers),
    +                      H = 1/nlayers * ones(nlayers),
    +                      ρ = Array{Float64}(1:nlayers),
    +                    eta = nothing,
    +topographic_pv_gradient = (0, 0),
    +                      μ = 0,
    +                      ν = 0,
    +                     nν = 1,
    +                     dt = 0.01,
    +                stepper = "RK4",
    +                 calcFq = nothingfunction,
    +             stochastic = false,
    +                 linear = false,
    +       aliased_fraction = 1/3,
    +                      T = Float64)

    Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

    Arguments

    • nlayers: (required) Number of fluid layers.
    • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • f₀: Constant planetary vorticity.
    • β: Planetary vorticity $y$-gradient.
    • g: Gravitational acceleration constant.
    • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
    • H: Rest height of each fluid layer.
    • ρ: Density of each fluid layer.
    • eta: Periodic component of the topographic potential vorticity.
    • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
    • μ: Linear bottom drag coefficient.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
    • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64 (default); floating point type used for problem data.
    source
    GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
    streamfunctionfrompv!(ψh, qh, params, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

    source
    streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

    source
    streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    \[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source
    GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
    pvfromstreamfunction!(qh, ψh, params, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

    source
    pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

    source
    pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) * (ψ̂₂ - ψ̂₁) ,\]

    \[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) * (ψ̂₁ - ψ̂₂) .\]

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source

    Private functions

    GeophysicalFlows.MultiLayerQG.LinearEquationFunction
    LinearEquation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcNlinear!.

    source
    GeophysicalFlows.MultiLayerQG.calcS!Function
    calcS!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
    calcS⁻¹!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcNlinear!Function
    calcNlinear!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term of the linearized equations:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, vars, params, grid)

    Compute the advection term and stores it in N:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
    calcN_linearadvection!(N, sol, vars, params, grid)

    Compute the advection term of the linearized equations and stores it in N:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source

    SurfaceQG

    Exported functions

    GeophysicalFlows.SurfaceQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 Lx = 2π,
    +                 ny = nx,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a surface quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
    buoyancy_dissipation(prob)

    Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

    \[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

    where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

    source
    GeophysicalFlows.SurfaceQG.buoyancy_workFunction
    buoyancy_work(prob)
    +buoyancy_work(sol, vars, grid)

    Return the domain-averaged rate of work of buoyancy variance by the forcing,

    \[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

    source

    Private functions

    GeophysicalFlows.SurfaceQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

    source

    BarotropicQGQL

    Exported functions

    GeophysicalFlows.BarotropicQGQL.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    diff --git a/v0.15.2/lib/types/index.html b/v0.15.2/lib/types/index.html new file mode 100644 index 00000000..573889d5 --- /dev/null +++ b/v0.15.2/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

    Private types

    TwoDNavierStokes

    GeophysicalFlows.TwoDNavierStokes.ParamsType
    struct Params{T} <: AbstractParams

    The parameters for a two-dimensional Navier-Stokes problem:

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • μ::Any: large-scale (hypo)-viscosity coefficient

    • nμ::Int64: (hypo)-viscosity order, $≤ 0$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.TwoDNavierStokes.VarsType
    struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

    The variables for two-dimensional Navier-Stokes problem:

    • ζ: relative vorticity

    • u: x-component of velocity

    • v: y-component of velocity

    • ζh: Fourier transform of relative vorticity

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SingleLayerQG

    GeophysicalFlows.SingleLayerQG.ParamsType
    struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

    The parameters for the SingleLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • deformation_radius::Any: Rossby radius of deformation

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SingleLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

    The variables for SingleLayer QG:

    • q: relative vorticity (+ vortex stretching)

    • ψ: streamfunction

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • qh: Fourier transform of relative vorticity (+ vortex stretching)

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    MultiLayerQG

    GeophysicalFlows.MultiLayerQG.ParamsType
    struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams

    The parameters for the MultiLayerQG problem.

    • nlayers::Int64: number of fluid layers

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Any: array with density of each fluid layer

    • H::Any: array with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: array with the reduced gravity constants for each fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • S::Any: array containing coeffients for getting PV from streamfunction

    • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
    struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a single-layer MultiLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • U::Any: array with imposed constant zonal flow $U(y)$

    • eta::Any: array containing the periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
    struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a two-layer MultiLayerQG problem.

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Any: array with density of each fluid layer

    • H::Tuple: tuple with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: the reduced gravity constants for the fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: AbstractVars

    The variables for multi-layer QG problem.

    • q: relative vorticity + vortex stretching

    • ψ: streamfunction

    • u: x-component of velocity

    • v: y-component of velocity

    • qh: Fourier transform of relative vorticity + vortex stretching

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fqh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SurfaceQG

    GeophysicalFlows.SurfaceQG.ParamsType
    Params{T}(ν, nν, calcF!)

    A struct containing the parameters for Surface QG dynamics. Included are:

    • ν::Any: buoyancy (hyper)-viscosity coefficient

    • nν::Int64: buoyancy (hyper)-viscosity order

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SurfaceQG.VarsType
    Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

    The variables for surface QG problem:

    • b: buoyancy

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • bh: Fourier transform of buoyancy

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    BarotropicQGQL

    GeophysicalFlows.BarotropicQGQL.ParamsType
    Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

    A struct containing the parameters for a barotropic QL QG problem. Included are:

    • β::Any: planetary vorticity $y$-gradient

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.BarotropicQGQL.VarsType
    Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

    The variables for barotropic QL QG:

    • u: $x$-component of small-scale velocity

    • v: $y$-component of small-scale velocity

    • U: $x$-component of large-scale velocity

    • uzeta: small-scale $u′ζ′$

    • vzeta: small-scale $v′ζ′$

    • zeta: small-scale relative vorticity

    • Zeta: large-scale relative vorticity

    • psi: small-scale streamfunction

    • Psi: large-scale streamfunction

    • Nz: small-scale nonlinear term

    • NZ: large-scale nonlinear term

    • uh: Fourier transform of $x$-component of small-scale velocity

    • vh: Fourier transform of $y$-component of small-scale velocity

    • Uh: Fourier transform of $x$-component of large-scale velocity

    • zetah: Fourier transform of small-scale relative vorticity

    • Zetah: Fourier transform of large-scale relative vorticity

    • psih: Fourier transform of small-scale relative vorticity

    • Psih: Fourier transform of large-scale relative vorticity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source
    diff --git a/v0.15.2/literated/barotropicqgql_betaforced.ipynb b/v0.15.2/literated/barotropicqgql_betaforced.ipynb new file mode 100644 index 00000000..8d571ae7 --- /dev/null +++ b/v0.15.2/literated/barotropicqgql_betaforced.ipynb @@ -0,0 +1,650 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence\n", + "\n", + "\n", + "A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on\n", + "a beta plane under the *quasi-linear approximation*. The dynamics include\n", + "linear drag and stochastic excitation.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CUDA, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n", + "\n", + "using Statistics: mean\n", + "\n", + "parsevalsum = FourierFlows.parsevalsum\n", + "record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical parameters and time-stepping parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n = 128 # 2D resolution = n^2\n", + "stepper = \"FilteredRK4\" # timestepper\n", + " dt = 0.05 # timestep\n", + " nsteps = 8000 # total number of time-steps\n", + " nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Physical parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "L = 2π # domain size\n", + "β = 10.0 # planetary PV gradient\n", + "μ = 0.01 # bottom drag\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Forcing" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We force the vorticity equation with stochastic excitation that is delta-correlated in time\n", + "and while spatially homogeneously and isotropically correlated. The forcing has a spectrum\n", + "with power in a ring in wavenumber space of radius $k_f$ (`forcing_wavenumber`) and width\n", + "$δ_f$ (`forcing_bandwidth`), and it injects energy per unit area and per unit time\n", + "equal to $\\varepsilon$. That is, the forcing covariance spectrum is proportional to\n", + "$\\exp{[-(|\\bm{k}| - k_f)^2 / (2 δ_f^2)]}$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\n", + "forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\n", + "ε = 0.001 # energy input rate by the forcing\n", + "\n", + "grid = TwoDGrid(dev; nx=n, Lx=L)\n", + "\n", + "K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n", + "\n", + "forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n", + "@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n", + "\n", + "ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n", + "@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "We reset of the random number generator for reproducibility" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "Next we construct function `calcF!` that computes a forcing realization every timestep.\n", + "First we make sure that if `dev=GPU()`, then `CUDA.rand()` function is called for random\n", + "numbers uniformly distributed between 0 and 1." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "random_uniform = dev==CPU() ? rand : CUDA.rand\n", + "\n", + "function calcF!(Fh, sol, t, clock, vars, params, grid)\n", + " T = eltype(grid)\n", + " @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n", + "\n", + " return nothing\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`.\n", + "Thus, we choose not to do any dealiasing by providing `aliased_fraction=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n", + " calcF=calcF!, stochastic=true, aliased_fraction=0)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "and define some shortcuts." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "x, y = grid.x, grid.y\n", + "Lx, Ly = grid.Lx, grid.Ly\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "First let's see how a forcing realization looks like. Note that when plotting, we decorate\n", + "the variable to be plotted with `Array()` to make sure it is brought back on the CPU when\n", + "`vars` live on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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meXLl+/YsePVV1+dfeSuu+6qq6v78MMPyzsx+pl4qdK8xU+wiObw9ddfd3d333///fv375eP79y50+VylWtWdMNMJtPu3btffvnlHTt2bNmy5cCBA0ePHj106FC550U/Fy9Vmre4wCKaw8WLFzVN27dv3/95/L777uO79i/UM888Ew6H7777bovFYjab33zzzXvuuafck6Kfi5cqzVu8RUhEN5F4PN7T09PS0uJwOMo9FyJayLjAIiIiIjIYyzQQERERGYwLLCIiIiKDcYFFREREZDAusIiIiIgMxgUWERERkcG4wCIiIiIyGBdYRERERAbjAouIiIjIYFxgERERERmMCywiIiIig3GBRURERGQwLrCIaOH74Ycf3nvvvWw2O/vPRCJx8ODBK1eulHdWRLSAsdkzES18kUiktbX1scce27t3r6Zpe/bsOXLkSFdXl8vlKvfUiGhh4gKLiG4Kn3zyyQMPPHDs2LFoNHrvvfd2dna2t7eXe1JEtGBxgUVEN4tdu3adPHkymUw+/vjjzz//fLmnQ0QLGRdYRHSziMVizc3NwWDw/PnzFoul3NMhooWMIXciulkcPnw4mUx2d3efOHGi3HMhogWOn2AR0U1hdHS0tbX12WefPXXq1PHjx8+cOcOEOxH95XCBRUQ3he3bt4+Pj3/11VexWKylpeXBBx/ct29fuSdFRAsWbxES0cK3f//+zz777MCBA2azubKy8q233nr99dePHj1a7nkR0YLFT7CIiIiIDMZPsIiIiIgMxgUWERERkcG4wCIiIiIyGBdYRERERAbjAouIiIjIYFxgERERERmMCywiIiIig3GBRURERGQwLrCIiIiIDMYFFhEREZHBuMAiIiIiMhgXWEREREQG4wKLiIiIyGBcYBEREREZjAssIiIiIoNxgUVERERkMC6wiIiIiAz2v405Tn5VF+FiAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n", + "\n", + "fig = Figure()\n", + "\n", + "ax = Axis(fig[1, 1],\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " title = \"a forcing realization\",\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n", + " colormap = :balance, colorrange = (-8, 8))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition is simply fluid at rest." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics -- `energy` and `enstrophy` are functions imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\n", + "Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "We can also define our custom diagnostics via functions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "zetaMean(prob) = prob.sol[1, :]\n", + "\n", + "zMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "We combile all diags in a list." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "filepath = \".\"\n", + "plotpath = \"./plots_forcedbetaQLturb\"\n", + "plotname = \"snapshots\"\n", + "filename = joinpath(filepath, \"forcedbetaQLturb.jld2\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 15 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if isfile(filename); rm(filename); end\n", + "if !isdir(plotpath); mkdir(plotpath); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 16 + }, + { + "cell_type": "markdown", + "source": [ + "and then create Output." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Output\n ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}\n ├──── path: ./forcedbetaQLturb.jld2\n └── fields: Dict{Symbol, Function}(:sol => Main.##305.get_sol, :u => Main.##305.get_u)" + }, + "metadata": {}, + "execution_count": 17 + } + ], + "cell_type": "code", + "source": [ + "get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n", + "\n", + "function get_u(prob)\n", + " grid, vars = prob.grid, prob.vars\n", + "\n", + " @. vars.uh = im * grid.l * grid.invKrsq * sol\n", + " ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n", + "\n", + " return vars.u\n", + "end\n", + "\n", + "out = Output(prob, filename, (:sol, get_sol), (:u, get_u))" + ], + "metadata": {}, + "execution_count": 17 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We define a function that plots the vorticity and streamfunction fields, the\n", + "corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries\n", + "of energy and enstrophy." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\n", + "title_ψ = \"streamfunction ψ\"\n", + "\n", + "fig = Figure(resolution=(1000, 600))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n", + "\n", + "axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n", + "\n", + "axζ̄ = Axis(fig[1, 2],\n", + " xlabel = \"zonal mean ζ\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-3, 3), (-Ly/2, Ly/2)))\n", + "\n", + "axū = Axis(fig[2, 2],\n", + " xlabel = \"zonal mean u\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n", + "\n", + "axE = Axis(fig[1, 3],\n", + " xlabel = \"μ t\",\n", + " ylabel = \"energy\",\n", + " aspect = 1,\n", + " limits = ((-0.1, 4.1), (0, 0.05)))\n", + "\n", + "axZ = Axis(fig[2, 3],\n", + " xlabel = \"μ t\",\n", + " ylabel = \"enstrophy\",\n", + " aspect = 1,\n", + " limits = ((-0.1, 4.1), (0, 5)))\n", + "\n", + "ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\n", + "ζ = Observable(Array(@. ζ̄ + ζ′))\n", + "ψ̄, ψ′= prob.vars.Psi, prob.vars.psi\n", + "ψ = Observable(Array(@. ψ̄ + ψ′))\n", + "ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\n", + "ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n", + "\n", + "μt = Observable(μ * E.t[1:1])\n", + "energy = Observable(E.data[1:1])\n", + "enstrophy = Observable(Z.data[1:1])\n", + "\n", + "heatmap!(axζ, x, y, ζ;\n", + " colormap = :balance, colorrange = (-8, 8))\n", + "\n", + "heatmap!(axψ, x, y, ψ;\n", + " colormap = :viridis, colorrange = (-0.22, 0.22))\n", + "\n", + "lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\n", + "lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n", + "\n", + "lines!(axū, ūₘ, y; linewidth = 3)\n", + "lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n", + "\n", + "lines!(axE, μt, energy; linewidth = 3)\n", + "lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n", + "\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 18 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\n", + "step: 1000, t: 50, cfl: 0.70, E: 0.0306, Q: 3.9157, walltime: 0.18 min\n", + "step: 2000, t: 100, cfl: 0.75, E: 0.0385, Q: 3.5612, walltime: 0.32 min\n", + "step: 3000, t: 150, cfl: 0.90, E: 0.0424, Q: 3.8748, walltime: 0.47 min\n", + "step: 4000, t: 200, cfl: 0.85, E: 0.0447, Q: 4.0860, walltime: 0.62 min\n", + "step: 5000, t: 250, cfl: 0.77, E: 0.0468, Q: 3.9408, walltime: 0.78 min\n", + "step: 6000, t: 300, cfl: 1.05, E: 0.0464, Q: 3.7644, walltime: 0.95 min\n", + "step: 7000, t: 350, cfl: 0.90, E: 0.0470, Q: 3.6078, walltime: 1.11 min\n", + "step: 8000, t: 400, cfl: 0.92, E: 0.0476, Q: 3.8718, walltime: 1.29 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "frames = 0:round(Int, nsteps / nsubs)\n", + "\n", + "record(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n", + " if j % (1000 / nsubs) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n", + " (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + " end\n", + "\n", + " ζ[] = @. ζ̄ + ζ′\n", + " ψ[] = @. ψ̄ + ψ′\n", + " ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n", + " ūₘ[] = vec(mean(prob.vars.U, dims=1))\n", + "\n", + " μt.val = μ * E.t[1:E.i]\n", + " energy[] = E.data[1:E.i]\n", + " enstrophy[] = Z.data[1:E.i]\n", + "\n", + " title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " BarotropicQGQL.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 19 + }, + { + "cell_type": "markdown", + "source": [ + "![](barotropicqgql_betaforced.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Save" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Finally, we can save, e.g., the last snapshot via\n", + "```julia\n", + "savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\n", + "savefig(savename)\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/barotropicqgql_betaforced.jl b/v0.15.2/literated/barotropicqgql_betaforced.jl new file mode 100644 index 00000000..69b244b9 --- /dev/null +++ b/v0.15.2/literated/barotropicqgql_betaforced.jl @@ -0,0 +1,213 @@ +using GeophysicalFlows, CUDA, Random, Printf, CairoMakie + +using Statistics: mean + +parsevalsum = FourierFlows.parsevalsum +record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record +nothing # hide + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n = 128 # 2D resolution = n^2 +stepper = "FilteredRK4" # timestepper + dt = 0.05 # timestep + nsteps = 8000 # total number of time-steps + nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs) +nothing # hide + +L = 2π # domain size +β = 10.0 # planetary PV gradient +μ = 0.01 # bottom drag +nothing # hide + +forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space +forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f` +ε = 0.001 # energy input rate by the forcing + +grid = TwoDGrid(dev; nx=n, Lx=L) + +K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber + +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2)) +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average + +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly) +@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε +nothing # hide + +if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end +nothing # hide + +random_uniform = dev==CPU() ? rand : CUDA.rand + +function calcF!(Fh, sol, t, clock, vars, params, grid) + T = eltype(grid) + @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt) + + return nothing +end +nothing # hide + +prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, + calcF=calcF!, stochastic=true, aliased_fraction=0) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid +x, y = grid.x, grid.y +Lx, Ly = grid.Lx, grid.Ly +nothing # hide + +calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid) + +fig = Figure() + +ax = Axis(fig[1, 1], + xlabel = "x", + ylabel = "y", + aspect = 1, + title = "a forcing realization", + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx)); + colormap = :balance, colorrange = (-8, 8)) + +fig + +BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny))) +nothing # hide + +E = Diagnostic(BarotropicQGQL.energy, prob; nsteps) +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps) +nothing # hide + +zetaMean(prob) = prob.sol[1, :] + +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity +nothing # hide + +diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will be updated every timestep. +nothing # hide + +filepath = "." +plotpath = "./plots_forcedbetaQLturb" +plotname = "snapshots" +filename = joinpath(filepath, "forcedbetaQLturb.jld2") +nothing # hide + +if isfile(filename); rm(filename); end +if !isdir(plotpath); mkdir(plotpath); end +nothing # hide + +get_sol(prob) = prob.sol # extracts the Fourier-transformed solution + +function get_u(prob) + grid, vars = prob.grid, prob.vars + + @. vars.uh = im * grid.l * grid.invKrsq * sol + ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh)) + + return vars.u +end + +out = Output(prob, filename, (:sol, get_sol), (:u, get_u)) + +title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t)) +title_ψ = "streamfunction ψ" + +fig = Figure(resolution=(1000, 600)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...) + +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...) + +axζ̄ = Axis(fig[1, 2], + xlabel = "zonal mean ζ", + ylabel = "y", + aspect = 1, + limits = ((-3, 3), (-Ly/2, Ly/2))) + +axū = Axis(fig[2, 2], + xlabel = "zonal mean u", + ylabel = "y", + aspect = 1, + limits = ((-0.5, 0.5), (-Ly/2, Ly/2))) + +axE = Axis(fig[1, 3], + xlabel = "μ t", + ylabel = "energy", + aspect = 1, + limits = ((-0.1, 4.1), (0, 0.05))) + +axZ = Axis(fig[2, 3], + xlabel = "μ t", + ylabel = "enstrophy", + aspect = 1, + limits = ((-0.1, 4.1), (0, 5))) + +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta +ζ = Observable(Array(@. ζ̄ + ζ′)) +ψ̄, ψ′= prob.vars.Psi, prob.vars.psi +ψ = Observable(Array(@. ψ̄ + ψ′)) +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1)))) +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1)))) + +μt = Observable(μ * E.t[1:1]) +energy = Observable(E.data[1:1]) +enstrophy = Observable(Z.data[1:1]) + +heatmap!(axζ, x, y, ζ; + colormap = :balance, colorrange = (-8, 8)) + +heatmap!(axψ, x, y, ψ; + colormap = :viridis, colorrange = (-0.22, 0.22)) + +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3) +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash) + +lines!(axū, ūₘ, y; linewidth = 3) +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash) + +lines!(axE, μt, energy; linewidth = 3) +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red) + +nothing # hide + +startwalltime = time() + +frames = 0:round(Int, nsteps / nsubs) + +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j + if j % (1000 / nsubs) == 0 + cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], + (time()-startwalltime)/60) + + println(log) + end + + ζ[] = @. ζ̄ + ζ′ + ψ[] = @. ψ̄ + ψ′ + ζ̄ₘ[] = vec(mean(ζ̄, dims=1)) + ūₘ[] = vec(mean(prob.vars.U, dims=1)) + + μt.val = μ * E.t[1:E.i] + energy[] = E.data[1:E.i] + enstrophy[] = Z.data[1:E.i] + + title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t) + + stepforward!(prob, diags, nsubs) + BarotropicQGQL.updatevars!(prob) +end +nothing # hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/barotropicqgql_betaforced.mp4 b/v0.15.2/literated/barotropicqgql_betaforced.mp4 new file mode 100644 index 00000000..32c74b48 Binary files /dev/null and b/v0.15.2/literated/barotropicqgql_betaforced.mp4 differ diff --git a/v0.15.2/literated/barotropicqgql_betaforced/index.html b/v0.15.2/literated/barotropicqgql_betaforced/index.html new file mode 100644 index 00000000..2288d4f8 --- /dev/null +++ b/v0.15.2/literated/barotropicqgql_betaforced/index.html @@ -0,0 +1,170 @@ + +Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +using Statistics: mean
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n^2
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                              calcF=calcF!, stochastic=true, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x, grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics – energy and enstrophy are functions imported at the top.

    E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
    +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

    We can also define our custom diagnostics via functions.

    zetaMean(prob) = prob.sol[1, :]
    +
    +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

    We combile all diags in a list.

    diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaQLturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "forcedbetaQLturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  grid, vars = prob.grid, prob.vars
    +
    +  @. vars.uh = im * grid.l  * grid.invKrsq * sol
    +  ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))
    +
    +  return  vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    Output
    +  ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
    +  ├──── path: ./forcedbetaQLturb.jld2
    +  └── fields: Dict{Symbol, Function}(:sol => Main.get_sol, :u => Main.get_u)

    Visualizing the simulation

    We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

    title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axζ̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean ζ",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.05)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 5)))
    +
    +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta
    +ζ = Observable(Array(@. ζ̄ + ζ′))
    +ψ̄, ψ′= prob.vars.Psi,  prob.vars.psi
    +ψ = Observable(Array(@. ψ̄ + ψ′))
    +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))
    +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))
    +
    +μt = Observable(μ * E.t[1:1])
    +energy = Observable(E.data[1:1])
    +enstrophy = Observable(Z.data[1:1])
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +heatmap!(axψ, x, y, ψ;
    +         colormap = :viridis, colorrange = (-0.22, 0.22))
    +
    +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)
    +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, μt, energy; linewidth = 3)
    +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],
    +      (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = @. ζ̄ + ζ′
    +  ψ[] = @. ψ̄ + ψ′
    +  ζ̄ₘ[] = vec(mean(ζ̄, dims=1))
    +  ūₘ[] = vec(mean(prob.vars.U, dims=1))
    +
    +  μt.val = μ * E.t[1:E.i]
    +  energy[] = E.data[1:E.i]
    +  enstrophy[] = Z.data[1:E.i]
    +
    +  title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  BarotropicQGQL.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.70, E: 0.0306, Q: 3.9157, walltime: 0.15 min
    +step: 2000, t: 100, cfl: 0.75, E: 0.0385, Q: 3.5612, walltime: 0.29 min
    +step: 3000, t: 150, cfl: 0.90, E: 0.0424, Q: 3.8748, walltime: 0.44 min
    +step: 4000, t: 200, cfl: 0.85, E: 0.0447, Q: 4.0860, walltime: 0.59 min
    +step: 5000, t: 250, cfl: 0.77, E: 0.0468, Q: 3.9408, walltime: 0.75 min
    +step: 6000, t: 300, cfl: 1.05, E: 0.0464, Q: 3.7644, walltime: 0.91 min
    +step: 7000, t: 350, cfl: 0.90, E: 0.0470, Q: 3.6078, walltime: 1.09 min
    +step: 8000, t: 400, cfl: 0.92, E: 0.0476, Q: 3.8718, walltime: 1.26 min

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/decayingTwoDNavierStokes.jld2 b/v0.15.2/literated/decayingTwoDNavierStokes.jld2 new file mode 100644 index 00000000..7dc12240 Binary files /dev/null and b/v0.15.2/literated/decayingTwoDNavierStokes.jld2 differ diff --git a/v0.15.2/literated/multilayerqg_2layer.ipynb b/v0.15.2/literated/multilayerqg_2layer.ipynb new file mode 100644 index 00000000..22dd7b48 --- /dev/null +++ b/v0.15.2/literated/multilayerqg_2layer.ipynb @@ -0,0 +1,533 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Phillips model of Baroclinic Instability\n", + "\n", + "\n", + "A simulation of the growth of barolinic instability in the Phillips 2-layer model\n", + "when we impose a vertical mean flow shear as a difference $\\Delta U$ in the\n", + "imposed, domain-averaged, zonal flow at each layer.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CairoMakie, Printf\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CairoMakie, Printf\n", + "\n", + "using Random: seed!" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical parameters and time-stepping parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "n = 128 # 2D resolution = n²\n", + "stepper = \"FilteredRK4\" # timestepper\n", + " dt = 2.5e-3 # timestep\n", + " nsteps = 20000 # total number of time-steps\n", + " nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Physical parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "L = 2π # domain size\n", + "μ = 5e-2 # bottom drag\n", + "β = 5 # the y-gradient of planetary PV\n", + "\n", + "nlayers = 2 # number of layers\n", + "f₀, g = 1, 1 # Coriolis parameter and gravitational constant\n", + "H = [0.2, 0.8] # the rest depths of each layer\n", + "ρ = [4.0, 5.0] # the density of each layer\n", + "\n", + "U = zeros(nlayers) # the imposed mean zonal flow in each layer\n", + "U[1] = 1.0\n", + "U[2] = 0.0\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,\n", + " dt, stepper, aliased_fraction=0)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "and define some shortcuts." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\n", + "x, y = grid.x, grid.y\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition is some small-amplitude random noise. We smooth our initial\n", + "condidtion using the `timestepper`'s high-wavenumber `filter`.\n", + "\n", + "`device_array()` function returns the array type appropriate for the device, i.e., `Array` for\n", + "`dev = CPU()` and `CuArray` for `dev = GPU()`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "seed!(1234) # reset of the random number generator for reproducibility\n", + "q₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\n", + "q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\n", + "q₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n", + "\n", + "MultiLayerQG.set_q!(prob, q₀)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics -- `energies` function is imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\n", + "diags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "filepath = \".\"\n", + "plotpath = \"./plots_2layer\"\n", + "plotname = \"snapshots\"\n", + "filename = joinpath(filepath, \"2layer.jld2\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if isfile(filename); rm(filename); end\n", + "if !isdir(plotpath); mkdir(plotpath); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "And then create Output" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n", + "\n", + "function get_u(prob)\n", + " sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n", + "\n", + " @. vars.qh = sol\n", + " streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n", + " @. vars.uh = -im * grid.l * vars.ψh\n", + " invtransform!(vars.u, vars.uh, params)\n", + "\n", + " return vars.u\n", + "end\n", + "\n", + "out = Output(prob, filename, (:sol, get_sol), (:u, get_u))\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We create a figure using Makie's [`Observable`](https://makie.juliaplots.org/stable/documentation/nodes/)s\n", + "that plots the potential vorticity field and the evolution of energy and enstrophy.\n", + "Note that when plotting, we decorate the variable to be plotted with `Array()`\n", + "to make sure it is brought back on the CPU when `vars` live on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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" + }, + "metadata": {}, + "execution_count": 12 + } + ], + "cell_type": "code", + "source": [ + "Lx, Ly = grid.Lx, grid.Ly\n", + "\n", + "title_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n", + "\n", + "q₁ = Observable(Array(vars.q[:, :, 1]))\n", + "ψ₁ = Observable(Array(vars.ψ[:, :, 1]))\n", + "q₂ = Observable(Array(vars.q[:, :, 2]))\n", + "ψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n", + "\n", + "function compute_levels(maxf, nlevels=8)\n", + " # -max(|f|):...:max(|f|)\n", + " levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n", + "\n", + " # only positive\n", + " levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n", + "\n", + " # only negative\n", + " levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n", + "\n", + " return levelsf, levelsf⁺, levelsf⁻\n", + "end\n", + "\n", + "maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\n", + "maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n", + "\n", + "levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\n", + "levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n", + "\n", + "KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\n", + "KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\n", + "PE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n", + "\n", + "fig = Figure(resolution=(1000, 600))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "axq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n", + "\n", + "axψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n", + "\n", + "axq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n", + "\n", + "axψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n", + "\n", + "axKE = Axis(fig[1, 3],\n", + " xlabel = \"μ t\",\n", + " ylabel = \"KE\",\n", + " title = title_KE,\n", + " yscale = log10,\n", + " limits = ((-0.1, 2.6), (1e-9, 5)))\n", + "\n", + "axPE = Axis(fig[2, 3],\n", + " xlabel = \"μ t\",\n", + " ylabel = \"PE\",\n", + " yscale = log10,\n", + " limits = ((-0.1, 2.6), (1e-9, 5)))\n", + "\n", + "heatmap!(axq₁, x, y, q₁; colormap = :balance)\n", + "\n", + "heatmap!(axq₂, x, y, q₂; colormap = :balance)\n", + "\n", + "contourf!(axψ₁, x, y, ψ₁;\n", + " levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n", + " contour!(axψ₁, x, y, ψ₁;\n", + " levels = levelsψ₁⁺, color=:black)\n", + " contour!(axψ₁, x, y, ψ₁;\n", + " levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n", + "\n", + "contourf!(axψ₂, x, y, ψ₂;\n", + " levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n", + " contour!(axψ₂, x, y, ψ₂;\n", + " levels = levelsψ₂⁺, color=:black)\n", + " contour!(axψ₂, x, y, ψ₂;\n", + " levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n", + "\n", + "ke₁ = lines!(axKE, KE₁; linewidth = 3)\n", + "ke₂ = lines!(axKE, KE₂; linewidth = 3)\n", + "Legend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n", + "\n", + "lines!(axPE, PE; linewidth = 3)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Finally, we time-step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.155e-08, KE₂: 5.483e-08, PE: 2.958e-09, walltime: 0.01 min\n", + "step: 1000, t: 2.5, cfl: 0.00, KE₁: 5.244e-08, KE₂: 5.825e-08, PE: 5.358e-08, walltime: 0.32 min\n", + "step: 2000, t: 5.0, cfl: 0.00, KE₁: 2.217e-07, KE₂: 1.199e-07, PE: 2.265e-07, walltime: 0.58 min\n", + "step: 3000, t: 7.5, cfl: 0.00, KE₁: 1.086e-06, KE₂: 4.801e-07, PE: 1.064e-06, walltime: 0.83 min\n", + "step: 4000, t: 10.0, cfl: 0.00, KE₁: 5.889e-06, KE₂: 2.540e-06, PE: 5.620e-06, walltime: 1.07 min\n", + "step: 5000, t: 12.5, cfl: 0.00, KE₁: 3.371e-05, KE₂: 1.462e-05, PE: 3.161e-05, walltime: 1.34 min\n", + "step: 6000, t: 15.0, cfl: 0.01, KE₁: 1.982e-04, KE₂: 8.661e-05, PE: 1.830e-04, walltime: 1.62 min\n", + "step: 7000, t: 17.5, cfl: 0.01, KE₁: 1.183e-03, KE₂: 5.208e-04, PE: 1.079e-03, walltime: 1.90 min\n", + "step: 8000, t: 20.0, cfl: 0.03, KE₁: 7.085e-03, KE₂: 3.135e-03, PE: 6.403e-03, walltime: 2.18 min\n", + "step: 9000, t: 22.5, cfl: 0.07, KE₁: 4.052e-02, KE₂: 1.793e-02, PE: 3.677e-02, walltime: 2.47 min\n", + "step: 10000, t: 25.0, cfl: 0.14, KE₁: 1.811e-01, KE₂: 8.137e-02, PE: 1.657e-01, walltime: 2.74 min\n", + "step: 11000, t: 27.5, cfl: 0.25, KE₁: 4.429e-01, KE₂: 2.442e-01, PE: 4.258e-01, walltime: 3.01 min\n", + "step: 12000, t: 30.0, cfl: 0.32, KE₁: 4.698e-01, KE₂: 3.582e-01, PE: 4.651e-01, walltime: 3.24 min\n", + "step: 13000, t: 32.5, cfl: 0.26, KE₁: 5.896e-01, KE₂: 4.633e-01, PE: 6.751e-01, walltime: 3.46 min\n", + "step: 14000, t: 35.0, cfl: 0.34, KE₁: 6.182e-01, KE₂: 5.679e-01, PE: 7.170e-01, walltime: 3.70 min\n", + "step: 15000, t: 37.5, cfl: 0.30, KE₁: 5.797e-01, KE₂: 6.093e-01, PE: 6.326e-01, walltime: 3.93 min\n", + "step: 16000, t: 40.0, cfl: 0.46, KE₁: 6.247e-01, KE₂: 7.122e-01, PE: 6.174e-01, walltime: 4.14 min\n", + "step: 17000, t: 42.5, cfl: 0.29, KE₁: 6.080e-01, KE₂: 7.531e-01, PE: 5.883e-01, walltime: 4.36 min\n", + "step: 18000, t: 45.0, cfl: 0.26, KE₁: 5.854e-01, KE₂: 7.434e-01, PE: 5.653e-01, walltime: 4.58 min\n", + "step: 19000, t: 47.5, cfl: 0.29, KE₁: 5.787e-01, KE₂: 8.048e-01, PE: 5.229e-01, walltime: 4.79 min\n", + "step: 20000, t: 50.0, cfl: 0.25, KE₁: 5.467e-01, KE₂: 7.608e-01, PE: 5.300e-01, walltime: 5.01 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "frames = 0:round(Int, nsteps / nsubs)\n", + "\n", + "record(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n", + " if j % (1000 / nsubs) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + " end\n", + "\n", + " q₁[] = vars.q[:, :, 1]\n", + " ψ₁[] = vars.ψ[:, :, 1]\n", + " q₂[] = vars.q[:, :, 2]\n", + " ψ₂[] = vars.ψ[:, :, 2]\n", + "\n", + " maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n", + " maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n", + "\n", + " KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n", + " KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n", + " PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n", + "\n", + " title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " MultiLayerQG.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "![](multilayerqg_2layer.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Save\n", + "Finally, we can save, e.g., the last snapshot via\n", + "```julia\n", + "savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\n", + "savefig(savename)\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/multilayerqg_2layer.jl b/v0.15.2/literated/multilayerqg_2layer.jl new file mode 100644 index 00000000..bb766829 --- /dev/null +++ b/v0.15.2/literated/multilayerqg_2layer.jl @@ -0,0 +1,195 @@ +using GeophysicalFlows, CairoMakie, Printf + +using Random: seed! + +dev = CPU() # Device (CPU/GPU) +nothing # hide + +n = 128 # 2D resolution = n² +stepper = "FilteredRK4" # timestepper + dt = 2.5e-3 # timestep + nsteps = 20000 # total number of time-steps + nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs) +nothing # hide + +L = 2π # domain size +μ = 5e-2 # bottom drag +β = 5 # the y-gradient of planetary PV + +nlayers = 2 # number of layers +f₀, g = 1, 1 # Coriolis parameter and gravitational constant +H = [0.2, 0.8] # the rest depths of each layer +ρ = [4.0, 5.0] # the density of each layer + +U = zeros(nlayers) # the imposed mean zonal flow in each layer +U[1] = 1.0 +U[2] = 0.0 +nothing # hide + +prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β, + dt, stepper, aliased_fraction=0) +nothing # hide + +sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid +x, y = grid.x, grid.y +nothing # hide + +seed!(1234) # reset of the random number generator for reproducibility +q₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers))) +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2 +q₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2 + +MultiLayerQG.set_q!(prob, q₀) +nothing # hide + +E = Diagnostic(MultiLayerQG.energies, prob; nsteps) +diags = [E] # A list of Diagnostics types passed to "stepforward!" will be updated every timestep. +nothing # hide + +filepath = "." +plotpath = "./plots_2layer" +plotname = "snapshots" +filename = joinpath(filepath, "2layer.jld2") +nothing # hide + +if isfile(filename); rm(filename); end +if !isdir(plotpath); mkdir(plotpath); end +nothing # hide + +get_sol(prob) = prob.sol # extracts the Fourier-transformed solution + +function get_u(prob) + sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid + + @. vars.qh = sol + streamfunctionfrompv!(vars.ψh, vars.qh, params, grid) + @. vars.uh = -im * grid.l * vars.ψh + invtransform!(vars.u, vars.uh, params) + + return vars.u +end + +out = Output(prob, filename, (:sol, get_sol), (:u, get_u)) +nothing # hide + +Lx, Ly = grid.Lx, grid.Ly + +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t)) + +q₁ = Observable(Array(vars.q[:, :, 1])) +ψ₁ = Observable(Array(vars.ψ[:, :, 1])) +q₂ = Observable(Array(vars.q[:, :, 2])) +ψ₂ = Observable(Array(vars.ψ[:, :, 2])) + +function compute_levels(maxf, nlevels=8) + # -max(|f|):...:max(|f|) + levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels)) + + # only positive + levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2))) + + # only negative + levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2))) + + return levelsf, levelsf⁺, levelsf⁻ +end + +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1])) +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2])) + +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁) +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂) + +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])]) +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])]) +PE = Observable(Point2f[(μ * E.t[1], E.data[1][2])]) + +fig = Figure(resolution=(1000, 600)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...) + +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...) + +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...) + +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...) + +axKE = Axis(fig[1, 3], + xlabel = "μ t", + ylabel = "KE", + title = title_KE, + yscale = log10, + limits = ((-0.1, 2.6), (1e-9, 5))) + +axPE = Axis(fig[2, 3], + xlabel = "μ t", + ylabel = "PE", + yscale = log10, + limits = ((-0.1, 2.6), (1e-9, 5))) + +heatmap!(axq₁, x, y, q₁; colormap = :balance) + +heatmap!(axq₂, x, y, q₂; colormap = :balance) + +contourf!(axψ₁, x, y, ψ₁; + levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto) + contour!(axψ₁, x, y, ψ₁; + levels = levelsψ₁⁺, color=:black) + contour!(axψ₁, x, y, ψ₁; + levels = levelsψ₁⁻, color=:black, linestyle = :dash) + +contourf!(axψ₂, x, y, ψ₂; + levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto) + contour!(axψ₂, x, y, ψ₂; + levels = levelsψ₂⁺, color=:black) + contour!(axψ₂, x, y, ψ₂; + levels = levelsψ₂⁻, color=:black, linestyle = :dash) + +ke₁ = lines!(axKE, KE₁; linewidth = 3) +ke₂ = lines!(axKE, KE₂; linewidth = 3) +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"]) + +lines!(axPE, PE; linewidth = 3) + +fig + +startwalltime = time() + +frames = 0:round(Int, nsteps / nsubs) + +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j + if j % (1000 / nsubs) == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60) + + println(log) + end + + q₁[] = vars.q[:, :, 1] + ψ₁[] = vars.ψ[:, :, 1] + q₂[] = vars.q[:, :, 2] + ψ₂[] = vars.ψ[:, :, 2] + + maxψ₁[] = maximum(abs, vars.ψ[:, :, 1]) + maxψ₂[] = maximum(abs, vars.ψ[:, :, 2]) + + KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1])) + KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2])) + PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2])) + + title_KE[] = @sprintf("μ t = %.2f", μ * clock.t) + + stepforward!(prob, diags, nsubs) + MultiLayerQG.updatevars!(prob) +end +nothing # hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/multilayerqg_2layer.mp4 b/v0.15.2/literated/multilayerqg_2layer.mp4 new file mode 100644 index 00000000..0e1b1197 Binary files /dev/null and b/v0.15.2/literated/multilayerqg_2layer.mp4 differ diff --git a/v0.15.2/literated/multilayerqg_2layer/index.html b/v0.15.2/literated/multilayerqg_2layer/index.html new file mode 100644 index 00000000..cc5db4c8 --- /dev/null +++ b/v0.15.2/literated/multilayerqg_2layer/index.html @@ -0,0 +1,181 @@ + +Phillips model of Baroclinic Instability · GeophysicalFlows.jl

    Phillips model of Baroclinic Instability

    This example can be viewed as a Jupyter notebook via .

    A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf
    +
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

    n = 128                  # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 2.5e-3         # timestep
    + nsteps = 20000          # total number of time-steps
    + nsubs  = 50             # number of time-steps for plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π                   # domain size
    +μ = 5e-2                 # bottom drag
    +β = 5                    # the y-gradient of planetary PV
    +
    +nlayers = 2              # number of layers
    +f₀, g = 1, 1             # Coriolis parameter and gravitational constant
    +H = [0.2, 0.8]           # the rest depths of each layer
    +ρ = [4.0, 5.0]           # the density of each layer
    +
    +U = zeros(nlayers)       # the imposed mean zonal flow in each layer
    +U[1] = 1.0
    +U[2] = 0.0

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,
    +                            dt, stepper, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

    device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    seed!(1234) # reset of the random number generator for reproducibility
    +q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
    +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft  only in dims=1, 2
    +q₀  = irfft(q₀h, grid.nx, (1, 2))                 # apply irfft only in dims=1, 2
    +
    +MultiLayerQG.set_q!(prob, q₀)

    Diagnostics

    Create Diagnostics – energies function is imported at the top.

    E = Diagnostic(MultiLayerQG.energies, prob; nsteps)
    +diags = [E] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_2layer"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "2layer.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid
    +
    +  @. vars.qh = sol
    +  streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +  @. vars.uh = -im * grid.l * vars.ψh
    +  invtransform!(vars.u, vars.uh, params)
    +
    +  return vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t))
    +
    +q₁ = Observable(Array(vars.q[:, :, 1]))
    +ψ₁ = Observable(Array(vars.ψ[:, :, 1]))
    +q₂ = Observable(Array(vars.q[:, :, 2]))
    +ψ₂ = Observable(Array(vars.ψ[:, :, 2]))
    +
    +function compute_levels(maxf, nlevels=8)
    +  # -max(|f|):...:max(|f|)
    +  levelsf  = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))
    +
    +  # only positive
    +  levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))
    +
    +  # only negative
    +  levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))
    +
    +  return levelsf, levelsf⁺, levelsf⁻
    +end
    +
    +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))
    +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))
    +
    +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)
    +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)
    +
    +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])
    +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])
    +PE  = Observable(Point2f[(μ * E.t[1], E.data[1][2])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...)
    +
    +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...)
    +
    +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...)
    +
    +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...)
    +
    +axKE = Axis(fig[1, 3],
    +            xlabel = "μ t",
    +            ylabel = "KE",
    +            title = title_KE,
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +axPE = Axis(fig[2, 3],
    +            xlabel = "μ t",
    +            ylabel = "PE",
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +heatmap!(axq₁, x, y, q₁; colormap = :balance)
    +
    +heatmap!(axq₂, x, y, q₂; colormap = :balance)
    +
    +contourf!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁺, color=:black)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁻, color=:black, linestyle = :dash)
    +
    +contourf!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁺, color=:black)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁻, color=:black, linestyle = :dash)
    +
    +ke₁ = lines!(axKE, KE₁; linewidth = 3)
    +ke₂ = lines!(axKE, KE₂; linewidth = 3)
    +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"])
    +
    +lines!(axPE, PE; linewidth = 3)
    +
    +fig

    Time-stepping the Problem forward

    Finally, we time-step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min",
    +                   clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q₁[] = vars.q[:, :, 1]
    +  ψ₁[] = vars.ψ[:, :, 1]
    +  q₂[] = vars.q[:, :, 2]
    +  ψ₂[] = vars.ψ[:, :, 2]
    +
    +  maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])
    +  maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])
    +
    +  KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))
    +  KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))
    +  PE[]  = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))
    +
    +  title_KE[] = @sprintf("μ t = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  MultiLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.155e-08, KE₂: 5.483e-08, PE: 2.958e-09, walltime: 0.00 min
    +step: 1000, t: 2.5, cfl: 0.00, KE₁: 5.244e-08, KE₂: 5.825e-08, PE: 5.358e-08, walltime: 0.24 min
    +step: 2000, t: 5.0, cfl: 0.00, KE₁: 2.217e-07, KE₂: 1.199e-07, PE: 2.265e-07, walltime: 0.48 min
    +step: 3000, t: 7.5, cfl: 0.00, KE₁: 1.086e-06, KE₂: 4.801e-07, PE: 1.064e-06, walltime: 0.72 min
    +step: 4000, t: 10.0, cfl: 0.00, KE₁: 5.889e-06, KE₂: 2.540e-06, PE: 5.620e-06, walltime: 0.97 min
    +step: 5000, t: 12.5, cfl: 0.00, KE₁: 3.371e-05, KE₂: 1.462e-05, PE: 3.161e-05, walltime: 1.22 min
    +step: 6000, t: 15.0, cfl: 0.01, KE₁: 1.982e-04, KE₂: 8.661e-05, PE: 1.830e-04, walltime: 1.50 min
    +step: 7000, t: 17.5, cfl: 0.01, KE₁: 1.183e-03, KE₂: 5.208e-04, PE: 1.079e-03, walltime: 1.78 min
    +step: 8000, t: 20.0, cfl: 0.03, KE₁: 7.085e-03, KE₂: 3.135e-03, PE: 6.403e-03, walltime: 2.07 min
    +step: 9000, t: 22.5, cfl: 0.07, KE₁: 4.052e-02, KE₂: 1.793e-02, PE: 3.677e-02, walltime: 2.34 min
    +
    +step: 10000, t: 25.0, cfl: 0.14, KE₁: 1.811e-01, KE₂: 8.137e-02, PE: 1.657e-01, walltime: 2.60 min
    +step: 11000, t: 27.5, cfl: 0.25, KE₁: 4.429e-01, KE₂: 2.442e-01, PE: 4.258e-01, walltime: 2.86 min
    +step: 12000, t: 30.0, cfl: 0.32, KE₁: 4.698e-01, KE₂: 3.582e-01, PE: 4.651e-01, walltime: 3.10 min
    +step: 13000, t: 32.5, cfl: 0.26, KE₁: 5.896e-01, KE₂: 4.633e-01, PE: 6.751e-01, walltime: 3.34 min
    +step: 14000, t: 35.0, cfl: 0.34, KE₁: 6.182e-01, KE₂: 5.679e-01, PE: 7.170e-01, walltime: 3.57 min
    +step: 15000, t: 37.5, cfl: 0.30, KE₁: 5.797e-01, KE₂: 6.093e-01, PE: 6.326e-01, walltime: 3.79 min
    +step: 16000, t: 40.0, cfl: 0.46, KE₁: 6.247e-01, KE₂: 7.122e-01, PE: 6.174e-01, walltime: 4.01 min
    +step: 17000, t: 42.5, cfl: 0.29, KE₁: 6.080e-01, KE₂: 7.531e-01, PE: 5.883e-01, walltime: 4.22 min
    +step: 18000, t: 45.0, cfl: 0.26, KE₁: 5.854e-01, KE₂: 7.434e-01, PE: 5.653e-01, walltime: 4.44 min
    +step: 19000, t: 47.5, cfl: 0.29, KE₁: 5.787e-01, KE₂: 8.048e-01, PE: 5.229e-01, walltime: 4.65 min
    +step: 20000, t: 50.0, cfl: 0.25, KE₁: 5.467e-01, KE₂: 7.608e-01, PE: 5.300e-01, walltime: 4.87 min

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/v0.15.2/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 new file mode 100644 index 00000000..36fdfb86 Binary files /dev/null and b/v0.15.2/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/v0.15.2/literated/singlelayerqg_betadecay.ipynb b/v0.15.2/literated/singlelayerqg_betadecay.ipynb new file mode 100644 index 00000000..72ff1e9f --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_betadecay.ipynb @@ -0,0 +1,512 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Decaying barotropic QG beta-plane turbulence\n", + "\n", + "\n", + "An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CairoMakie, Printf, Random\n", + "\n", + "using Statistics: mean" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical parameters and time-stepping parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n = 128 # 2D resolution: n² grid points\n", + "stepper = \"FilteredRK4\" # timestepper\n", + " dt = 0.04 # timestep\n", + " nsteps = 2000 # total number of time-steps\n", + " nsubs = 20 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Physical parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "L = 2π # domain size\n", + "β = 10.0 # planetary PV gradient\n", + "μ = 0.0 # bottom drag\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`.\n", + "Thus, we choose not to do any dealiasing by providing `aliased_fraction=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "and define some shortcuts" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "x, y = grid.x, grid.y\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition consist of a flow that has power only at wavenumbers with\n", + "$6 < \\frac{L}{2\\pi} \\sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$.\n", + "`device_array()` function returns the array type appropriate for the device, i.e., `Array` for\n", + "`dev = CPU()` and `CuArray` for `dev = GPU()`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E₀ = 0.08 # energy of initial condition\n", + "\n", + "K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n", + "\n", + "Random.seed!(1234)\n", + "q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n", + "@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n", + "@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n", + "@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\n", + "q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\n", + "q₀ = irfft(q₀h, grid.nx)\n", + "\n", + "SingleLayerQG.set_q!(prob, q₀)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate\n", + "the variable to be plotted with `Array()` to make sure it is brought back on the CPU when\n", + "`vars` live on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAFoCAIAAAAghggXAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOy9eXRkZ3nn/7lL7XuV9q3V6l29ut3ewJjFJhgz/BJCEhho5mDwycIwgSGZOQOEIWc4yTCThGFIMmQyOSc5c8I4MOHYhjB2wAQ7tmna7kXdUm9Sa5dKqirVvi/33t8fb1VJLaklud2423A/f+joVt373ve+t+qp537f53leyTAMTExMTExMTExMbh7yre6AiYmJiYmJicnPGqaDZWJiYmJiYmJykzEdLBMTExMTExOTm4zpYJmYmJiYmJiY3GRMB8vExMTExMTE5CZjOlgmJiYmJiYmJjcZ08EyMTExMTExMbnJmA6WiYmJiYmJiclNxnSwTExMTExMTExuMqaDZWJiYmJiYmJykzEdLBMTExMTExOTm4zpYJmYmJiYmJiY3GRMB8vExMTExMTE5CZjOlgmJiYmJiYmJjcZ08EyMTExMTExMbnJmA6WiYmJiYmJiclNxnSwTExMTExMTExuMqaDZWJiYmJiYmJykzEdLBMTExMTExOTm4zpYN169u/f39LS8sQTT7zGPbfYzsc//vEPfvCDp06dupG+3ig36xq3yNmzZz//+c9/8YtffPHFF1/VgX/xF3/x3HPP3fDhr70DN7EPJiY/bX4ebNdNwTCMv/zLv3z00Uf/zb/5N6/bSW+KLd2A3/zN3/zgBz944sSJn1L7PwOYDtatJx6Px+Pxcrn8avf83Oc+d++99371q199Ve18+9vf/uY3vzk3N/cau70xN9a3VXuuamSL6Lr+e7/3e9/61rdOnDjxtre97ROf+IRhGFs58MKFC7/1W781NjZ2Y4e/9g7cxD6YmLwOvCFs142ZkZvL448//hu/8Rt/8zd/8/jjj//0znLDVvfGePLJJ7/5zW9OT0//lNr/GUC91R0w4a/+6q9KpdK99977avccHR09efJkc3Pr7bwO3HDfVu65qpEtIsvyk08+WSwWvV7vH/3RH/37f//vd+zY8Tu/8zubHvjMM88ADz/88Ec/+tEbOPy1d+Am9sHE5HXgDWG7bsyM3FzOnj0L3H///eIL/lPidv5F+PnEVLBuPd/97neffPLJSCQCHD9+/Pjx45cvX/7v//2/v/e97/3VX/3V733ve+vu+X/+z/8ZHR0Fzpw587//9/9e9W6hUPjqV7/6/ve//+1vf/uHPvShv//7v9+0G1/72teOHz/+ta99rfnKpz71qePHj//DP/yD2Lx06dJnPvOZhx9++Nd+7df+y3/5L4VCobmn6Pbo6Og3vvGND3/4wxv3TXDixIlPfOITDz300Ec+8pHvfOc7a69xbSN/+Id/ePz48ZVPov/xP/7H48ePr9XALRaL1+sFfv3Xf12W5a985SuVSmXTC3z66acPHDjQ29u77uFPPfWUuMz5+XnghRdeEJvDw8NrB3PdFnK5nDhkYWFB7PbXf/3Xx48f//M///PmgRv3YesjYGLyOrDqe72B+dq67eKGzFe1Wv3Lv/zLX/3VX33HO97x6KOPPvvss+L1tedijb0SLz7xxBOPPvroL/zCL3zmM5+5fPlys+XrdaZcLot2rly58tnPfvZd73rXZz7zmVgsNj09/clPfvKhhx767d/+7cXFRdGHkydPAul0+utf//qmdmDjXwGuYzw3HdVNDfgGZ1x1yTMzM6ve+oM/+IPjx48/9dRTm96pny8Mk1uNz+cDnnjiCaMxDXTHHXesvEff//731+55zz33NHc4fPjwync1TXvwwQdX3eg/+ZM/WdvISv7qr/4KaG9v13XdMIzZ2Vlx4Llz5wzD+Na3vmWz2VY2ODAwEIlExLHilU984hNAKBTaoG9i///5P/+nLF/j3H/xi19c1b21jfzRH/2RaL9WqxmGkclkLBYL8PLLL28wvNu3bwdeeOGFjS8wl8tZrdbf/d3fvd7h6XS6p6cH+PjHP67rurhHDz300Kb3t9lCLBYTZ7x06ZJ46zd+4zeAD3zgA2Jz0z7c2AiYmPyUWPW93sB8bdF2GYaxgfm6nu0yDONXfuVXVh3yx3/8x+uey1hjrwzD+MxnPiNeFHbJ5XI9++yzG3cmm82KTWEWBIODg52dnc3No0ePruoDsKkd2GAYjesbz41HdSsG/HpnbNK85LNnzxqG0d7eDjz++OOGYbz1rW8FvvSlL72mz9PPHKaDdetZ62Dt2bPn29/+9ve+9z3xXf3oRz+6ds9yufy+970P+OQnP1kul1e++8orrwCKonz/+99fXFwUduTOO+9c28hKksmk1WoFTp48aTT8rX379hmGkU6nW1tbgQ9/+MOzs7MnT54cGBgAPv7xj4tjRbftdvv73//+//bf/tsGfTMMY2lpSWx+8YtfDIfDf/InfyJ6G4vFVu65tpG5uTlhWf75n//ZMAwh2+zYsWPtkGqa9nd/93ef+9znvvGNb+zevRv4m7/5mw0u0DAM8SDYtKprDzcMQzzVKYryhS98AXC5XJOTk+ve03Vb2NSwbtqHrY+AicnrwLoO1rrma4u2yzCMDczX9WxXU1D5wQ9+kE6n/+AP/oCG57T2XMYaezU0NCRJkiRJ3/nOd1Kp1L/+1/8aGBwc1DRtg840vY03v/nNzz///O/93u+t3PzsZz8rNqenp8vl8ic/+Ungfe97X7FY3KKDte4wbmA8NxjVLRrw6/3uNDEdrFeLOUV4O/LZz372l3/5lx955JFf+qVfAtYN6rRareK3VlEU4Tc02b59+4kTJ06fPn3//ffPzs4mEglgaWlp45P6/f53v/vdgJgy+8d//Efggx/8IHDy5MlYLOZ0Or/+9a/39PTcfffd/+k//afmnk0+9alP/f3f//2nP/3pDfoGnDhxIp1Oh0KhL3zhC52dnf/23/7b3/md33nssceadud6F9jd3f22t70N+O53vws8/fTTwL/8l/9y7bV88IMf/PCHP3zmzJlPfepTQjbP5/MbXCDwzDPPuFyut7zlLdc7HHjkkUc+8pGPaJr2pS99CfjP//k/9/f3i6a+3OAb3/jGBi1szKZ92PoImJjcKjY1XxvbhxswX5qmiX/+/M///JlnnnnssccuXbr04osv6rq+wbma9ur//b//ZxjGgQMHOjs7x8bG3vOe90iSdPHixZGRka105j/8h//wwAMP/O7v/u7KzWbEZCKRsFqtiqIAsizb7fbXMowbGM8NrnSLBnwrvzsmrwrTwbod2bFjh/gnGAwCxqvMIAuFQpcuXfrYxz7mdrvvuuuub37zm1s88EMf+hDwve99T9M0EcQg/I/x8XGgv7/f4/GIPQ8ePAhEIpFcLtc8/Bd+4Re2cpbJyUmgr69PGB1Jkv74j//4L/7iL/bt27fpscePH2cz9+KZZ575v//3/77jHe94+umnI5GIeBoTT2zXu0Bx1IMPPmi1Wjc4HPjKV74iZuX27t0rnnSBJ5544rMNvv71r2/cwgZspQ9bGQETk1vI62+++vv7P/CBDwBPPvnkBz7wga6urk984hOFQmHVVNoqmvZK2Lfh4eG77rrrrrvueuSRR0Sfr169upXOiClCYc3Wbt4w6w7jjRnPLRrw13jjTNZiOlg/gzzzzDMf+9jHRkZGPve5zz3//PNCRt4K733ve91u99mzZ5966qlkMnnnnXeKyamWlhYgHo839xT/OxwOp9PZfHHtw+i6BAIBIJVKbfmClnn/+99vt9svX778xBNPzM7OHjp0aHBwcNU+P/zhDwHhlGQymYWFBYvFIsILrneBo6OjExMTDz/88MaHA9/4xjeq1ao45Mc//rF48ciRI7/Y4IEHHti4BVY8cK+MM91iH7YyAiYmb1xuzHz93d/93cjIyO///u/fcccdmqb96Ec/uu+++9Lp9AaHNO2VyCZ58MEHn76We+6554Zt6VZY1w5szI0Zzy0acJObjulgveGp1WqrXhGlKQ8ePPilL33pgQce+MEPfrDFphwOxy/+4i8ahvHv/t2/Y4W6c+TIEUmSIpHIt771LUDX9T/7sz8Tr2/8jLi2b8CBAweAyclJUaFuZmbG6/WqqioymTduxOv1/ot/8S8AEZS6rngjHCBVVQGRvHP8+HERLnC9CxRSkHBuNjh8fHz8c5/7HPD2t79d1/VHH31UWMbf/M3ffLLBH/7hH16vBbfbLUkS8E//9E/A4uKiEKJeVR+2MgImJm8I1rUPN2C+vvWtbz300ENf/vKXv/CFL5w5c2ZoaEiW5Uqlcvr06Y3PJRAWaW5u7p3vfOfDDz98//33T0xMXL161Waz3bAt3YCN7cDGbMV4rr3SGzbgq3A6nULceuGFF4SNEkxPTwuRrLe3d+ut/Vxw68K/TOqsDXJ/4YUXxFuf//zngQcffHDtnoZhPProo0BPT89XvvKVle/+r//1v0Q7DzzwwLFjx8SXube3d91GVtGclZckaWZmpvn6Y489Bqiq+tBDD+3fv1/s89xzz4l3V3V7g76Jd4WL4Ha73/Wud4lv7Jvf/GaR3Ldyz1WNCJolCSRJWjfG/IUXXpAk6ciRI3/7t387MDCwe/fuubm5jS/w4Ycf3rNnz8aH67ouAjkfeOCBbDYr3J1Pf/rTr6oDR48eFWffu3evqqrCuong1q30YYsjYGLy+rBukPu65muLtsswjA3M1/Vs16lTp8SU2bFjxz70oQ8dOXIEcLlcIm9mrRlZ1c9SqSQSde++++7HHntMTLcdO3ZM1/UNOrMq4nvVZjKZXLn5qU99Cnj/+98vzriBHdh4GI0NjecGo/qqDPiqM67ky1/+sti5GfLVjCobHBxMJBKv6vPzM4/pYN16btjBOnHiREdHB2uScsvlsohSlCTprW99q3g8kmV5aGhobSOrqFQqoVAIuP/++1e+XiqVPv/5z/v9ftHsvn37nn766ea7ax2s6/VNvJtKpR599FHxzVQU5dd+7deaCcMr91zViKBcLgud/E1vetP1hvTxxx8/cODA7t27f+u3fqvZ8vUusFgsOhyOla7SuoeLZz4aSYj/43/8DzGqL7744tY7cObMmZ07dwIWi+UjH/nIRz/6UWFYt9iHrY+AicnrwA07WBvYhw3M1wa269vf/vbKOKSDBw/+4Ac/WPdca/tpGMb4+Pg73vEO4aVZrdbjx48LX2GDzrwWB+t6dmDTYTQ2NJ4bjOqrMuAbOFiGYTz33HMf+9jHjh49Khysrq6ud7/73V/72tfS6fRGn5WfSyTDDGR7g5PJZBwOh4i8XkkikZBlWXyjbiKLi4tut9vtdr+Wvgl0XZ+fn29vb984eGttI+985zufffbZP/3TPxXJz6+RQqFw5syZXbt2CVHqdWBhYSEYDK4sS/Nq+3BzR8DE5JawgX24MfOVy+VisVhLS0szmnsr52pSKpWi0WhnZ+eq3X5KtnStHdg6GxjPja/0VRnwjeno6IhEIo8//ngz1sJkFaaDZfJGYnZ29rnnnvv4xz8uJvheN5fo9sEcARMTk9sB08HaFDPI3eSNxBe+8IV/9a/+VbVa/eQnP/nz6VuYI2BiYmLyhsBc7NnkjcSv/MqvHDp06MiRI6Le5s8h5giYmJjcDrz73e9OJpMrVwoyWYU5RWhiYmJiYmJicpMxpwhNTExMTExMTG4y5hThJnz1q18dGhoSS86ZmPwcMjU1deTIkU9/+tO3uiMm62PaKJOfc25bG2UqWJswNDQ0NTV1q3tRJ5fLNVdX+Plh4/UufibRNG3lGmG3lqmpqaGhoVvdC5PrYtqoW45po24tt62NMhWsTejv728L+H771x8DDK0G6JUyoFcrAAaAbLMDVq8fSOZLQDidBeYzBSCWLwPZyrLR8VgVoN1tB7b53UB/ix/QUktAaXEWqKZigF7KA0gSoDg8gCXYBjjaewDcfmAmkQHC6TwQL5aBUk0HFFkC/DYL0Ol1AtuCPsBRKwD5matAaX4CKEfngGoqDuilAmDoBiBbbYDq9gIWfwtgbekArK1dgK21G3C0dgKpYhmI54tAtlQByjUNEIWPnRYVCLrsQKffC5Si80BxbhwozY2v6EMC0CslQFItgMXrJwRE6yft7Afs4m9bF2Bxe4FytQbIkgRYVQWoFQuAVi41h111uYFcVQfGYkng/GIaOBMpAVejBhBJS0ClBuB1GEBfC8AdnSpwX7cfuKO3DbCV80AltdS8QVZ/C1CxuYDLi3Hg8lIGmM1WgGLNALxWGdjhtwOHOoJAv98JZK+OAOXFGUAvFwHV4wccfbsBuWMb8NJEGDgxnwHG4hpQrAC0uiXgnm478P/t6wOMiyeAxX/4W2D8e1eAE2mAq7U0UNRrQECxA3tkL3BHSAO6720H/EfvAdx7jgKO3p2Y3Pb09/f39/f//u///q3uCMDi4mIwGNzisqQ/M8zMzPT19d3qXryuVCqVRCIh6precm6TD/9aTAfLxMTE5I3NV4de+uu//q+vpYUuj3Nvu1uTikW9BLgVp6HZhsLpZLG8cre7Qz3nz0e2nhhltyqhHc6JTKL5iirL929rycmJ2cIS4FRtOx29w/P5xXxR7CDBIUvX5akYoMjygOYJh+v60Pa2YPZ8vFJZvdaeJEktx9rGI/WzSIqk91kKlYo4ndFnFMTzMLS4HJ5golArr24BaZdt5wtTMbHptFgtYblU0YCjnZ1XTi0097ynt/vSS1Mrj23r8k9YCnojXSwUcM27Clpj885DXT+OT286UEGH7Wiv92phuqhVmi8O+n1e23mDa8b7l9v0QmUE+FH2zrK2vCCgTXEMx3uT5frhu9zdiwnlajwjNlVZ3tfqa/dYEnp8vlhf9XmPz7vTq9qUck3PgaFI1qruvZiqTGRzwICr48KsnilXnKqlJeOKJPPNc3V5vT6bdSyeqOl6/XTdobS7OJtLW2Tlzf2hkpyeLkTFmKiSst3Vns3azy0m9vpaoxOFVoczPZrb29Ey9eLskd1dV565sG2gdeLpE9cbnH2/9JbRSws7jvWPJNLegDPRIhXKlX13dZ0KhxVJuvT5225msInpYG1OSZcW8mXAIiuAw+YGXB4LoCrLc6w1ofrIEuCxWYEOtwG4LCpQ1ZZVJbfNArS6HEBnwAPUUnGgHAvT0K5q2RRgVEoAigIgyYBczAG1fBZweAOA32kDStUadSWFck0HVFkCfA4r0Op2AF67BcjNLgHVZGzF3yUa6pFWEmbOABSbHcDQAElVAdnuAGSHm4aiVnW4AK/HB4gvm4QElGo1QBgZm6oAqqw0x0pWLYBscwCKywuobj9g6Dqgl0uApKjNdwFFnNTuBBS7A1DtDqBQrgKFcqXeabAoCuCwWgGrfXmt+GKlQkNizJarQEnTm50Ud9KqGs1LUJf7W9efhEA4m8wA3T4PYO8eAAqVKjCVzAIXJ6aBs5ECMBrVgUgaoKoBBFwaMNNeA6q6AbjtVsAbbAeqiQhQyySAspASa1XAUasB79y3D+j2xoDpVA4o1jQg6LACBzpCgHVpFohfPg3kp2eBZFYBikYFkJEAl2wBQrId6BQyZ7cCOHv7AEfvLsDZvxewd5hLt/68EM4WwtnCihfWmfO6I9g1PBJb6115bLYd/oAqK6OJpUz5Gt+lVNEqC3oo5IyX6o3XdP25ySjQ6elSJTlSLE1Wl1Yecneod+j8ovj/WHvXyKk58b/TZrEsVtZ6V4BhGEHDOt7c1IwdAf9wJCpOt8/TOpQIi7eW8sWdod45ebKqL08pyJK027rr+alo85UD3rZzUxHxv01fYQjAWBNW493h1aeXnY+egcDMYn1zR3fwZGJmbYdVRepxu9s8NpdNVhQ9q2dmCrHhbGTVbnt8xXBp9Xjren1NHp9ija5wsMpa8YF211MzdQdrLDePlZ199oDVU9aq8XI6aiSieYA+l+tI0FY2plPVqaXKquZpc0qHgwd/MF+YyC/u7WkbnlEL1Wqox7nSwWqv2UcvRf12y+79XecTsVylPDYft1mU+/b2DWUWnpuIAiFHe5vbDsyl8y+GC1A4Fuy5OhpXDEWN6ZJBbjxjsSjRc3OAS77utHLvwf6xy4tAyWMlQcfBtrmp+cH9na+Ew8Adhzqvd+DtgOlgmZiYmLyx2R5w7d/ljlfSZaPqVhxBiz9fUF+ZixpIN+sU94b6Ri5G9YZi0WRfW+viSGJsYhGwqMqde9qGMkvait1iqXyf1ad4pWgxv/LAhWv8uTrdLu/YaF2IUiRpcSLVfOtgR9ulF6au171M7JrG7cryQjHOa3/mfjKzdKy7P6bMlLQq0O0IWqvBld4VkI8vu3Gl3DUu3VKpIEk0qxvtPNQ5NLO4fF67ZSybbPa/7K1pmWUPScK4b1ub1VaZKISLWnJag3XGYJl4dXbti+fy23yWHTXDiFXiq96SpMyqV7LVUra6HCbR5XDe2yaFSxcjFQPwqrY7fV6PUlSNtC7Zy7rndLYSLefCpfNv7+r5/rx1uhB9U9+uH47HzibCHR5vMlsEdoSCo+ejQLFUPXd6zumwHNrXcyWXiOcLZ4YXvC7bHdu74np+PJuIF0uAVVEG/e2WvDI8HHFarf2GZzKydE9v16WXpg/u6rj6j5eA2NXwuiPgDLhobzVmk3vfsefsVHTnoc4z0+G+nsDFYlyV5QMH2k7E1/Ffbx9MB2tz5tL5U7MxwGFRgYDDCoScdsDvtNMQIYRw4rHbAIfVAgTdTqCmaTRkEqF4OW0WQKpWgHJsAagkozS0Ky2foRF9JQQMZAWQZAXQ8lmgak/SUIBaWzsAWZIBl9UClGoaDbVMaGktHhdQTieAWiYJ1PJpQCtkAa2Yp6Fd6aUSIMyyJMmAXq0CxjV/K4BeLQNapQSougdwWq2AphvNs+u60bxq8YqouyaiuxSnm0awkWgNWaYR5SYpCqA462uKid1Utw9QXR5AkxQgU8zTCPxaeWq7RaUhnglZsVrTgWJ1WVqzqzLgt0tAi1scC1DVDMBhBfA7JMCuSs320yL0ycgCQgNfKpSA0XgeOBspAyNzBjARVgBXojmizAUBaroGtLqKwJ6WPBDwumgIePUblEkCleg8UIkvAuXYHNDfsxPYu6sbUKw2oFYuAoX5SSBz8RRQmBkHyokiYKAAXlRAUlyAS1KB7ZIC7NxVA4JHDwDew28CfEfuBzIWFzA0OY/JG4FoNW7J1ZWeXLW0WEoCd+9sT6XsV5Zea/x1h9PdS+Ds+YW1b3X7vKmxTKValx+qNe3yhejg9lDYUoznl32HmWg6WHQc3NYxnFxc20gTVZa9eftSqe6gDLa1TZxZFnXykfx1jgOQFZlrHKFlt0avrt751Hw85Ah1eRyyLA1NJnXjGgltj6/16sVl3yURv+a8E5HksTu6R8/Mq6q8676+U7ML+opakrsH205E6t+aI/s6f5xenhzcFfS2hqrjuTHWiEbXQ5HWyUKbLKYorr+/jB3WHyWXanmo052oXZwvlYEuu+duj1apndG1SkVb7tFdTrvuue+ZpXi0PPeurqPfmU1EtIgqyTWDrlaPcLDaFOciy3O+hWL13Jk5i1W5d2/3gp6fTqZOj4QBr83ucdmsqhKN5cZnEoDLZt2J7+pkrDPgvXpqHpBz9XujV9dRsJw+V8d9h6fHo9uP9I7Mxdu6/KOlrN/nWHJVioXavgOhk/FZ54aLS95yTAfLxMTE5GeQqXzE53R6rK5sZbWL4bJYd3ta7KiSIYFhyJKGXjO0iq6V9Lqf4lRVl2Sr5LRLV2PnjfUdoz6L53xutWoyMRkPBZ3uLv90cll/SmSLqYvlN+3bNpxfzFZXh0AJ7vb1it9mgdu45rezUlhncrCJt8PF3LIrmamsPMU6MWPxYknoK2txlZYj9F02a3whu2qHU0tR1263alFOTl/zBBIKuIZTdV8t5HUOF5YH7VBHMGOZH8+tf+HXRdtrky+U9fX7uRIJqdO+65Wl9d+1SMo7uoqL5TGxecTb0q28VFrvLmhGidqP7g889EIymqxdtEjdsXJme6BvLJGx2hRAlqSZicTaA6sVbfj8PHB4R6vit1yKx/Llar68/ME72N6ensxdTcaAHqvzSjkOZBbrt6zzzt2JuVhtxfzvnrcdTtaU6fHo9jt6p6sVb8iZb5VVXZG6rdlCfvf+4Jl4eE+L3+/fUAO81ZgO1uZMpcsvzeeBoEMGetxWoM+3nCUn9CqrrAG1fI5GHpyiaYAinm8MAzB0DSjWqjQijbRSHtAKORpKUl21Womh01SMClmgqogbJ9HIbfT5Q4C/1Q+UKkKkMQC7VQWolGlEbonzGrXlfcRVSIpMI9ZKkiVAslppqE1S/a8VkCxWGjFS4ljRQ4si0xCNBPoKSUnoWMLUiRgsxe6iIUqJqxCZg4YwjrJQsOqrvqu+FkD1BgCrxw8s5YtAslACMqUqUNU0GnqVXVVpiI6iS/XJEgnAZVWBNqeVhgrlstaAdFkHahqATQUI2hWg3WWhEcQmchUL1RqNWK6ZdAG4kqgAY5Fl7apzNgdY8gsAkgKotX4gFpCAZEkHSuLRzVCbH4NKPAKUImEakqEyPw2UwtNAcWYMsLZ00pD3xNCJcDqRkllNp5u3xu/UgIGCuCkKEPTUgLZdMhA4ehcQuPvtQPCeh4ArySJwZnIeGE+XAR8mtzv7/OoDvRVJUiySbzyrnkvUPZt0tXDPtu5nx2Ird7471HPpwtJFLbZeS6+OWnX1jKEgnig4i9Ujgx1Di8tOhq7rpy+EvS7bgYH2iWIiUlxO8neoliOOzpXeFVApXGMJfe3uxbnkuqfzh1wX48uaUyjgGl1a3pQtr2KedL+/7cKF5enCHq9vTl9noPKlcn6N2xMc8Mw0rrd9mzOcqHsPRzqCKXWuWNuyctXgR4vxfvfOO0JyvDpW1taXrZyqK6D2X0qrP4mkuY449p5ez0K5HqK23enrUU/W9Lp3tdOxr0O1Ochn8FwojOe0NBBSxiR8Fb10IOg5G08FnDYSSAbAjmAwPFcfW5fNsqMtaJfVGkYsX5hdSgFXx2OA3aLs7mt1emySiqe64WMAACAASURBVF41sslSU4zsDHjHz9Yd0+ZCMiPn53c/cp+cz9fKVUeLL56pXJ1NAPvesef83FKw3ZsOUTM0uduSKBU6d7rOJRbetr1trDyeKaz/CbxNMB0sExMTkzc22dpSrCK8k1mHRXpn150/CNfVjJR+jVNyV/DVpQFujO5AksXj1WoKxerVs4v3He45m1gUKS+CTL58ZnhBlqRDvZ1uj0VXkDQpGsmdmV49BSkr10yQzdbynX3+hZnUqt1au32Vdmt2afn19p3+mXB9pkyRpPnqao3tergs1lL0mrmqoGKb29qxhw73nFis73tgZ9vpRN2H6HQ7C9bFYvVVe1eCqVxuKodN6epzOdvtFpsqKUiAhpGtGLFSZTpf0I2NJk+BGsvS1mF3pVSp799t69/NkJhaDcGbnTv/MZsGSrXpFtt9sXI+YBX5SQZQq+lAyOoQnzO71dJZtky9tDw8e7cHHT3u87MRTdcrVU14WmvZ5nZfrNVdtODOtshEvW+jlxofgEgRaOtvce1qPTO+uH2wfYaizWaphijoFd9223g28eDu0Eh21CYrj/QEtjyWtwDTwdqccIrheR1o9+k0sgXdopaVx0Gj8FIlFQPKS4tANZOgWVOqVqUR9CPJcvOvUGhYoQAJTUi2O5v/67UKDYlCNCHaFPl6htC0inkaWYciUMnidNHQmYxiBdDqPakAyBLNKCiHC9Dd3mZPRMSV6KF4V4hGlkALYPG1ABZvgEZ9LKFCCUVKr9YARRY6FjT0KqVenkoFVFkGahKAbLEAsjiLJnIVLc0Rq4+GwyXugtXXAlh9QRrqUapQBkQaebpUBSqaTkNhclo0GsmbIm1TqFnir1URIWsq0OK0AblKjUZenhDehCDntCg0Qtmc1uVLKK1QsEQ2Yr5iAOK5Vi5IgFrJAdQKAIoNkEUImhgQWQIcFoWGuFjPH1yKAoW5RaCaqwCKRQFs0Shgiy0CttYOQPX6AUmx0BBNRTuyqgD2VhfQZikALTUdsLitgLO7G3DvPUgj4ip051uB58dmgBdnU8BIpAZEMwDvweSNhIGR088M+g9eTKWBsl5pFpQe8AZHRqI3cfXZ04sLb7qj59zp9Z0QQ+f82bmuFo+rzzkcuSZFTjeMKzPXmdBqIDuvcbAWk9mc3TZ4d+/MpWghWwZa2j2h3cHhhWhpaXme6MDBrpPh5Zm7Q3s7fpLZahz0QVvH2alr/Lx4eEu1NNvaXEPpunblsllmGzmYqizv7JJG1wvnf1WUNW0skx3bqqO4GlVqgfo9ko3lKxqw+lYGrinaPEjCbFskGajpAMWqDmRyYgpFTN2w3+MfO3uN4hieTDCZ6O/0+nYGzs0uamvyIQSV7LIwOTSxeORd+ydfuFoqLM9Xbjvca+30XJqIapORfW/pf2U2PNDfMiVlPBabEpIipexdO2wj2fHDAX+nez5anrjBQXldMB0sExMTkzc2u5yOu/2tZ9PxqggnMPTdPuliCsAqWWn8ivrLjnmjHlGkSNJgW5tbt+QzpUpFkyTJ7bEpTmUyl4pkX0WF7hOLc/cc67l4Jny9H9TIUpal7N0Huq4U4+nSqwhCuphY6un2zc0vR1blSuWXFxfVFjnYH8iVyhPl0sT0Nb/xBw52nU0ve3K7ekMjpdW1D67HfaG+M9cG8h9qbx8/s/nhToe1HKDYSDbcs7vlRKM0w1sHQiPZsS124HpYZMWtOqyyapVVRVKskkWRFEVSZEPWdVnTKVWNck0T9aUl8DtUp02aqywkK/X7OBSv9XrsFb0EVAk2W87qsmfFiarKAIwDquyKV0tApFgFwtmiVVEWolkJ5mdTwP6e9rGX1veqYwuZ2ELmyJHu04noujtUvYrba89lSoCuG2fGwp6dgY6g26aq5WotEs9dzubI5gYOdCRt2suz8wcP95yKLwx0B6aVhFNS9vYY47nwu7pDWe1cslKTbl6e7E8D08HanERWUpYkQJIMoMVl0BBLhMgha1UgHw3TqI0u0r5EPqCIdhK1rJR65ScPjQpP9b8ONyCpy8GVRj1Oq0BDoxJ5hXq5DNQqIgcwB8i5NA3xQ/UEaCbcOd00lCrxzCqkDnEuiy8EdVVM7KMV8oChLatHYs+GgtUGWINtgDWwrGOhWmgUgtK0+jeca/UqVZVp6FhauQholTKNpLm6UmVzQD2LUPRKqFnNGCyLL9jsUjqVBYSxFtpVurysYIkT1WvcyRIN5UmoVm67jUaOobwisVFkCK7MQlfqnVeaN1p8mUVaaLpQap7Fny8DHlsVcDsMALcBFFwtgENWgZrFCcRbVOCQrwZ0eSxAm8cJVOZmgGpqCagkk0AxVgJKGQOQVQ2olVKAoekAdQmzAiguNzRC1uwOwNraDqgeL2CIuDSrrXn77H07Ac/eOwGtrQ/4zvA48PxsFjg3pwPTURnI5SXgPV2Y3OYY+lSQwnta734qWq+bJEt1V8areiAJDK6ILtoW8HtyysR63oMkc/f+rsuFeGZrzpABP1mY23+4LTGWzlw/iPvCSNjvc2zfeU1U1sZky+VFOzv6W8enrplsqml6NL3aBXQ6rD2DoZOLy/7W3r6Wq3I8X9nS3NyxUM/Q8DUdc1gsuZnNlSdJpmcwdHax7plt7wy8nKzXVuj0OK+WprZy9lXIkjTg6rRo7miuOpfOR8rNS6hBDbZ0XxyK7b7+rtHSeFXXpnK5nd4DFU4BJzPaMadNN8rAUP6sy3Ovr/YKaEX1zhdyo+K3QlUOlrWCW/W9nMl22APnFor7/G0TM8ntwUB0Pgk4ypu4NWND80ffsu3M9DrFF4ZnFv3d9r372sZOz2k1HcjmytnGJ8futO69qzcp14YWlkJB18CR9hORuaP7uk7l5vrdLqs3FS7l3rfNGy6dBva5g/scNyGU8KeH6WCZmJiY/CxQqrzc73hgspiC5UJNRs0CSKA3cr8G21oXRhJL6yXGA4bOheHwgQNdJ0vrlyZalwvR6I7tQX2CXP66P/+pdDF1unjvsZ6fLGwxrol0qXxFTR451h2fzS5E1p8hczqtO/e2Xc0lm16OIklHBjtOZecr17nGVez2tVy5sLSy2oJVUQZtwctTm8tXh470/LgReiVLkh7QtXS9nb2dtovZ1RlLHQ7HYvE6VRYA2OXuWlhSXgpn19bIsitqm8PtsdgckkWVZNmQ0OvxDIgnW5UKtcl8MlEuFjXtn8ajg219VndqoZj8YTj+vm2H5kvno+Vc1vkWt/ScYdSAl7JnrZLTpfqTxQv1+tKS/UzOAriVAYNkq9oCsYDkgGSHzRUlKUmExzaZ3gUsxnWdsFS+9HJ+wTXg7At6nRaLgoREzTDSpdJULBWNLFqs6uGjPWcTkUgifvhQ+4n49OGOYNYSTlXKv9hnD5fOA+9uCRq154rV23o9ZdPB2hylLBXKQroQATTQCM3xO+xAaSlCYyG5+sp6sTBQy2Vp6DRCWhAyjNBm1Ho8U5CGtCDKO9Wjr6oVoJZL01jwTpT51qtLgF7IN/eRsjKNWCWRkyhis0Rclyr7aRZAt1hp1GcX8VVCPxNKm4jTQteafZCd7uUeirUIAy1AFRlIlipAZcWiE0LmqRegEhKRodPQxqqVEteu5FiPThMKn7QcGSYqfokVHsWYABaPD8gWRR32CpAv14BCVQMKVR2o6ssl7K0rqrRbZBlw2axAwGWnWRJsRVqlLpI3tVrzlolqVeUVZnelqOYJtgE7WgM0Ir2yFRGVVaahcs3ZFSBRbAGsNgPY3VIDBjslYDDkAjq8LiC6tADU0qJEWRGolUVgqQSoktG4nw1EMJ8IpKuLoC4aIuXKhElZ3HSPn8byka5tu4FwoQqcvDILvDSXB87NGcD4ggKocQkIiAU0TQXrjYNXrZt0TXdAUUK6Es0Bh4Ndl4ZjwDa/Pz6a3dTzmJ9L41r9ostm2d4dtDkUXTOy2fJEOLnSKRlPJHbsCOpjeqG4Jg96BcOn5u4+1v3ywlZLrJVrtZML85LK7iOtIdVWzlZLxVqlVnO7bDaXpSRrVxLxE5Flj62vzS+3GD9ObTXuym21FcNaZcUC1RZFOehsvXx5c6Wtvy/0ytLyrOKh3e0n03X5ak+L/3JuatX+HQ7HYHD2Tnn392bXqXQgS9Iex67nxyIry8MOeALtVm8lp8VSuWgiHyEfuU6lq5XtHOjusASks4mFi9GkO2U50t89lp1/ajb7i73750sXXkhGD3nevs36SlVLARWjUqnWpU1FcoS1e2eKcYfien4xL0vS5WhBgvn5LJCPl4CekD89vYluFGhzDy1s4p7mS+VL4WvakSWpp9vv63BdSsZ+HJnb3uEv+2svx+ce6G+frI4bmvHePnu4dEmC97Z6K9XnNm7/dsB0sExMTEx+FpCQY43iRlM5Ddjl7n5hIQfUkjrgtFqUmJZrFBhQZHlfd6tdVqKFwtxSeqW3pGu6tKJ+lNtu3b079Epy7nR5rjlDFRxw7nG1TE2mEtm6JDMeTxzY1TJ5fhN5Y/JCVG2Ra9eJ2VoXA67EVvwYS1BYLfEEPY5t/b5Tqfla+lW0fNDZcWZyWatzWCz7rMGteFeyJOW9WjVZ98zsVmVcW3abuoKksqvTCSyyXF/ybJ3W5J2Wnc+NR5uPR0eD3YWl6uTl5Dz1+VBFkjq9njaHyyopkoZW07WKrus6SBabolhkTTGWyoXJRHJsLs4c+7ray77qRCbx8oT2loEdI9nxJ2eK7+25I1IZOp+NLNoG7/TYbFwt1ebAsCohSd55NmuZKcWtsq1Q2ZOqJA56B54NJw4F26/MJ0Iu58R4HGhxOTauXdu5LZALKeUVFW57u/3+VheqVDF0MBRJkiRJMSQMMEBGh4Jenc2kLxWTLCQ9DtsdhzpfTswaWf3Bne0X8qMGxi/3u+eLI8CDLa2V6g83vUG3A6aDtTmagttuAD4nQJtTAdrdDiDkdgDJ8VmaCtbCDFCKRgCtUAQkEcTj8wGqx0cjT9AaagecvTsBw+UFlnIFoFLSAYfFAbT0hGioOAVdqEE5oKbFaVR1rwfZiDUEDQDZaqcRiSWrVhryjxAz6kXMMYBaIQ/URBWuchFAW155UIgiVl+AhkQ0nykC6WKZRr14YQzsFgXwrqhiL7SrSjoBVLMpmlW+6tFXwiqJ1EqleUbRQ5H/KFQ31VGPwdKQaAR7iWrsZU2joVqJpVWFWC66JIpvWVWZRgyWz2UHikJuFMs+JiJANZsE9EKOVWrWitXKVgaKiYGttHQC9q7twOHeHhqFvuxqCgg6S8B8SAdE4Xe7FaDPJwNHO1zAoa4WIDc7DlQSkeYQCSwOCZBVA7A6FcDe5gYcXR2AvWsbYOvoA6yhDhrhd4rD2RxAecUwioC5oiEDl5ZSwMVoCjgbKQLjSwYQSUmAlpcAV1UHdOm2DiA1WYXdeiicygKttp5/iKSBYsEOuUPBjivDceBIoP3cZF3sOdzXEb8Qn5mqb951f//JmWVVqbvXH07X3abuFm/GX1q7JkmiVDhRmrEH1Dv7uk5fqAs5I/Glu/Z3XrywTtn3JoVidUeo5UrsGj9MleXD+9sjtfxEJh6wOYI2Z4vFpRf1yXAqc/1pR0FnyNPZ7T6bCi8krplG3BHw9IccyBUN3ajazi9kktcGloXszotjy0KLw6Lukn1XRrcUF793sOOV5PJl7t/d/uNkvW57h8txJbeOhDabz2ernanKOvLVbtuO5yfrMlK7w92j+0eG691wW22DoRYtp81Mx5NzmSSbJBNub/G09/supZYmwgl1UX7T4LaTqZkfjsbf2r97vDr+1GzyrpYjIcdstLz0dDkHAZmgW7VmamUoQtEq24rVwVNLiQ67/8RkFtBTErDTFxzR5gArG83KDRzoHC1nCksVQJLZP9gVlYqXE0liq+trrMWiKrt7W1wB9Xx68SfxGYdFvW/AP5IZBd7bG5wvngFarE6b/pMtTf3eBpgOlomJickbHovsG8p6IC0hLRZaITng6vjJ1ZgsyZWYBgwEAyNDdanmrm3doy9OrVCsuPzStNxnaYpYhksSpQZCXmcxWFnKL7v+fpvVZlEy5ap4zilptR+nZu4+1HNhJCZEqSulhNdt2yDgHXCp11Rpt1mUgb2BHzeS7xLlYqJcvEockAPSQF+w1eKqFLRYIh9JrFhyOOjqbvfmlcpwcnEqvuy1WGTlvm2hgpycLcyOrJhPG+zteunalL49zpbTlbqTJEvSAUfLxUtbjcFPqssXaLOoF/PLbtn+Ts9Ifn0XM7Ve0P1B1+5nr9a9qwFvsDhbHclFALuqHg11jF6MXGgsWmWzqANtQa9qMcpataCVixWRfmX32CwOtSDVJmKpyFI2spR1Oqz37u85FQmfHgkf6GsPW7PPT0UHW3sdntwrS0s2xfe2jn6bEotVZnVDz9TKgE22B617Xo5Vw4Wk22Ivpr35SuZYqHv4fBTIRRqC4XXqfHgDro4DLWdmF3TdkGT27etckksnG8ts262W3javy2lRVPkaD00yDEmqouW08nQuNVxbIA6wp8Vv96QvZCaBe1uC0coZsfs+t1vTN5kkvX0wHazNcbn1gXYD2NkqA3uCDmAg5AMK4WmgvDgLlGPzQDkeAyrJNI26UKrTTqNOuqgdZWvtohEKk8ACXJlcABZyRRqpcF6rCvT53cC+jhBgay3SSDSjvkpghWZldhHpJapGiew8i9CuvEChZgCJTBqoiJUKV9Sgd7sDgCPUTiPvT2Rc58sVIJrKA/F8EYgXyjSCjWqaTkMiCtitgFVZXvhPhDcJYaYSjwK1XIpGuaa6dKVaANnuoJlH6fICkl2mKcDY7OIu5ETFqepydSuhV4maUhZRLF5UllJlwGVRAbfVAngdNkAv5ptdKkdmgHJkjqaOlUkBWr0QfxnQa/WKLyxHXwk1yA9Y4ws0Cp458hng0PY9QIvLAfT7M0AkV6JRW0use9jpdgC7WgOAXy8BmflJGisP1iPG3E5AVhRAElW7Aj7A3tENOHoGAHvPTsDe1Q/YWzubA1goV5q3WNS1F0JjbikLxAslIJwtApPpMhAvGkC1BmBRAVS3AWRsEqCY5uENgiK5zxUPzRTTQIf98JPTSVmS40mbQemuYM+584uyJDkzsvheH+rrWOVdAYZhOGzWfKkMeNz2YVF0zaLau+SJbBoIOmx39ngWqrFYOQq0+i3bne2lgv3k3BLwcnzu7gO9584vAplSeXBvz/CpjSLZMyvWaZGgf29gKLG+R6IbxtVMXDhbOHBss7gsVgUpWSnOaKmZzDW6iKpIb+5rWTIiV0qja5u6mgsf7dxxZmG5yHs8thxvfm979/UKeq2lp9t3ZWnZpdvZ6z1TXnawMqxfcX5dDngGfjgaEcr7Xn/r0kQxWywDe1tbK/Plc9NzgCxL+7vbLTl99nJkfnx+g/g1qyofO9SVtWpXwkvDp+Z29QRKQS7PxH0u+5GBzqHYgiWuPDCwe7w09Y/zSyAFbDu7HA6XqsTLlclcQTfSwHZXx1xMmUtn2h3u6atpYFdLaOpcfdw0abWHZXdatx/tGo7E5qbDQH9fqBqQRHRa0OPY3udfMgrjmfiIUdgsfgxgX6u/O6hcyU2nSjXApVp8jtlUwy+t6dfx725LTAtqYmJi8sZmquzzFdNAt33v92azwKBz5w/D0YDNMTOZBo51dF04NQ94nbbkxbix5kfK7rQmqvXg9IE9LSIzbv++VjEzeLQrWLREz+eWfYiyVr2cnQPevrv/1FQ+W6m+HJ+9Z0/v0JVF4Ex0od3vTKTWL3Ngs6nz6eV5rjv2djYLR21KsVYtrl1MDICD7UGLK3W5uFHdKb9Ho+HI+a326cm6f9bt846cfRVZk6EOD4119GRJmpOW1yvs8blm8lsN4R/09D9/NSWi2rd7ArHxQq5UAY50dE6ei4ji6b0tfldSm35ptnmUxaJs7wm5LKqkGxIgUYFkrjS3kKzV9NEzc8Cdd/RMlLMzc0nLonLPHd0nw/OZ4dJ9g9vO5cM/vBoNOAJ39vjiWjxcjCeXy0DQ72qza/6XJmM1zeh0ehxJ63whA3jLluboXInGt+1qnRmLSRK9O1udnc4rsYSYXw4FXO07/KcXw/qSMdAVcIWs59MLC6kM0OJy9PucLqtiUY26gmXUE3c0Q5IlJAlDrkQqiaXy1MqZ3vvbvanK8j09l0k9GLrf0M7U9Nt6FUKB6WBtTneQe7epwIEWJ3C4KwT4ZA3IzE/Q0K6qqQRQy+UBvVKjsaKfYrfRCIKxtnUDjm27gZRkA05OR4ChaB6Yy4iF8Awg6JSBfcUqDXlmf3snUFqYpqFOCYR2Vf+oSjLN/DuPH6ipNmA2lgQWs0UaZdCFgiVKmXvtVsBjs9CoSi+aFAFPiWIJiOWF4FEBshUhIC1XtBcyUsgpaoMpQCWXplHXXkSn1dJLgFYu0VgmT8SiieAh/DqN6DFWiEZGIyS0XNNolLAXWOp6lQKoosF6gqcKBJw2IOiyAwGXE8iHp2is2VdJRIHK0gJQji4AlUQCqGZyQK1YAfQV66zJFhlQneJWugGbyPjLpgGtXoosCQS7+oHugW4gX6k1ey6qcHkcNqAQmQdyomTaUphGaJricAD2jg4aQWniY2Pr6AUcPTsBZ/9ewNrWBcwspYHIYhpIl2KAKDa4colJgajyVdI0IFPWAE2U67ICtPsAHDYDKAeXwxscYhpn44hWk9uAsl6TkNpsR56YThkYg57tPxqLATuk0HA24rHZ5kbrcsteT+Dy5dm1LfTubokmYoDVql7KxIGBruDLiVng3r6W6dqEXtEBVZJ2+7wSzBeKYrbrYnbq0Lau05NGqVYbrcY8Dmu2WKloWs/OYOLU+j+BO3a0vZKu/14HPY4L19YCPdwRbHUrhlyVUNCVTEkfW8omNyzKFbDb7uzzXMiN68VN5I14dVnx6nX5R6mrMt2K+4K+/Kvud9n3tIQKkYLdY6s4ODezet4wVl2Wvga3t50uLUtfO0OuSxvVYVhm0LP9hatpYdPaHO7Kgt7wrjqa3tXRbV2zr4RFtT9gx7YWV9mYHZqdvbJOJkFfX6h1X8fVSDKdKY6dnXP7HD0HO4ZnFkdemb/7YNdIbunMxXB7wNXS4zyTCD87FgU6PV1tLrvTopRq2mK2dHKhAFFgt681N1eZz2SAwx0dl08vj0C2WB6zaI593lypPFJOMZUCrBZl76HOc4nIzMJ8X5vP3W4ZSiwYCQbbAt1+JVqNL5YWZg0ob7GM1zIOVUutKDdf0KvfjVVldnXaPVZJWqqWHnl17b2umA6WiYmJyRsbj9qSLR/6SSQJHPBsf348pRvGfcG+M8MLwH5vy/DEPNDX6r9yah3vCtA9KgmAvfs7TkTnZFkueSta1tjX6p/XpnRDtynyO7v8JX0iW5sEDjgsbda9/7xYWSqXr+bC9w/sfHZ0KVku3bmtc+TyEnAxGbNalHXrQZTtWtNr7+p3n27oFT0+1/Y2aTQ3sXjtRJI9KL/N0xNPqcORdcLD+wMeuzc5nN1SZHqklLarIbE2oluqP6b6HfbLF5YdiHa/2zJbuXRpSmyqquIcsBdKyzKPz+sYTyz3pOqqrnQaJHXz0qayJA06d/3TaL0ig99q92bss+k0MBAMTg8vCe/qyLbO8Renhdwoy9KhrtCVH22kz8Vm4rGZuMNjP/CmgZGxhVy6mH9p9u77+1+enr8wHO7u8BWC9vlkJpLM7+tqs4eU4VRkIVtYuHYln163r8vwnru4KHzVbQF/9MrqGc9ytVauLns9e/e0R5TiicU5j9N2x97OU8k5PWm8qa+tZk1P5SfjWdyqekco0GqXbbKhSLpuyDVDylSMmXx5Jr/JrOFo2tjt27lYGjdWBH/pGPOlDI3iz7ctpoO1OXtDtkd2tgLbgj7ATRXIT15mWZtJANrKPD6bSkO7sgaDgK2jB3D07gJsnf3AS1dmgBPzOeB8WKeRxiVE31afUInKQLsrB+xoCwCK20ejInw9hklVaWbeiXX9PAHAHmwHJhMZYCKRBeazZaBQ02jIP36bCrSIpLyajYamJShUakCmVAVSpSoQL9aATMWgIZPUDACfTaOhaQkFq5BNA9X4soIlRCO9VAIkRWFVqXGhunkDgCQtx2A1v8YiokicQqmv4qfSKL4lqNe7sgoFyw60edxAOSPUKSExpmmU/qqvAJjLAdVsHqiki0AlrwGaqCYmbqgCoNqrgDVfplFSvx6tVSnRSPCspmJAcXEaUN0+wCqSNzUNSIqFI0VyZSoG1PIZqNe1Egs+ChnP4m8B7J3bAOe2PQCBduDSYhwYHboKTKfLwFJRB4o1g2ZSpyoBbqsEeKwiIk0GbCtWVxQxYW1OFahq4lYaUP8AWxQJcFsUYOknmNzmXErVMqm0V3V0Kr3iZ/vuUM/Z8wvAYGvrhXN1uajT6kitJ/F09vnPz0YAq1UdzSeAI3vaT2RmPDar4kpUyjW/1frWjupi+UzzkKpenS8N39XW9ko0sFQuX8hN7Gnpu7KUGisl7FalVNHSpfK9+7qHz6+eLNu1s22osS7h7t6W040g6D0tvqojMporre2ebuiXMjPI3L+ru1RwDC0khOojYbylv31Rn09Wthr1bGAEHbZwtgag1X+bd/tDF/R6P502qz8tLSSXG6zVtIGWwMjcsgPX1x8Mx+v797X5hhPX+HaLlTgb0m73K6XgD6/WKzI4LdbOsm8imgC8NhsL1UqlBnS3+MKnF+uL2Erc0dd28Z8ub+Uai9nSxPcvH35w97mJiGFw+YWpe9+87eRcOLyYdmasd+3vPhWenwgnCeN3OLd3BSwO2ZAMCcmoGdGl/NyVTLRRAKM/4K/OljfIVwgFXcHtntOLi8DhXe1X9cRP4jPHukOGLX21OOoxLO/qDjnUVLQ8pRm1dO3agyU63ezxB9xqd7hgPRVPauvFV11MpS+mGPDs3+uz2ZVi1cjV9JIu6QoWq+yQdgQvHgAAIABJREFUcG9lTG4VpoNlYmJi8sbGpdoPuHedncuMFaMS0n2hvqGRiAEBhz03U6gvG6XI08PryDySJNHl1MJ5GvKV3Wq5UlkC7tnmHc5GbYr8lo7CYnmdAPBEJXp/h+/JaXRD7wlKV5bIVMt39nSPTESB6WpGUiRDW1GqV5FS9gqNGbSKt0oKoNPtlFzxfGUd72olY7n/n733eJIkS697f65Da5GRsrKqsnRVd7XuZhMYckCCRoKgkXtyQ+OGxhXMsHgLmOFv4OIZsafRuOIz8hF8j5ieAd70oGVpLbKqUkZGhtYeEa7e4rpHZJbsmQFmejB5rC06KjLE9esR7p+fe75zdoHfOXnsJ4/awFom+XD8EjH76xE3VHoATqABkMazEV4q5O799eZzLzEU5eA/B+pMBJaeC3kHCqrlVKz5sokSCCv6yfDKX2+0TMsnwFJ6aNFKPS43AAnWjPSDus+l5UbKs6FPhp1aLdz77DtVVwKe5z767MGFf3z2znoFuPfXm+9/euybrd3hcHLv2933zs09sTrNodkzx7eevLxrUpak9+cWHt6qWBP7pU8ATpzMPnF7W5VKSNfWzmS+aexkwsY/OJW613sSs9R/sZxuWvfb9qhtk1CNpVAypSqexNBxnwx7vcChumu3unYLmX+xdOG/bb4yBPNpr//Uj8iUIRI87MpS7/84+90n5leNowLrzVjLp8+lDGDS2AF6vnBnl0DQI7grwbsoEZE2GCbo4AvNLwPhxRMEnYMPK3XgVq0P3Ku4wKOyDJgtGfBkgLHlAJmoB1SHE6AzHAPxcJTAkEmwPoJjEV5ZqnBdzxaBvuMBm+0e8LRtAuW+DQh37qg2Y1ZjukrASMliK2QJ0BT/uEzQTCcOlRPHm943bJegrU/AdWzAGfYAq9Mg6CIcC2+w0QiQdY0pdxWKEsTq+dyVbgCqEQK6A/9gLJRMYpCiXVGomsSA9QMm8jFDBxKREAE/NG7VAaffBdyxCXiOTcD3iAbPg7ey7BI0y/gyTOE2P/EA27QBuSdMztoE1vNCDCfeX0RDBhGTGuB5s/RAd2Q+NxLhDi9uha9VaOE4kDh+Fri7WwOu334K3KyNgKd1F6h2AQ7k0BM1ANIxDyjEJWAhARDXFSAd0oBMWAdihkbAAorzh+ACNVUBDFUhaDL9P7/6EUf4fqPWln78uAaUIvGSkxChxYosr5B4HGTurs1ld5+9RMd97uPlL3fKQCSsP+w3gPNr+S/am4uJ6MPBBvCP51PVgLtKa5Ez0Wjbdp4OO2PXAfZGjy9nL19vtLZH+6qk2x5q1CeV97q9D86U7h7wxLp4cf7Lms/9XDheuNreBVRZXplzng2+a8J02/aXFJ+2uosLuum8cknuRCIeV5UbzUOdhlPO2w6OWuZg9g6tnR4voD2e/caKufjdqm95WsrGr7UOTenxbOT+y4RnYdVYCy9d2+5/Zs7sUuejiVBTe1z3C7SPSou3gtbLE8XMs29n1XD0F2ro7a/XZFkSWTqPvti8+PHi7e0KcO9eJRLRPzq3+KBdb5vPF7VxwzibzbW2+3de3QcqyZx/a+HbWtn1vFI2LuW9K42di8WME67f6+3/g7msrKxXxutJNfS76XxM3h5ZdzyEVpiETCmuhtTzD8zM/f6sOK1NHhvy4tj9ThZXEdVIqJGYGg5L4Z9/Yn51OCqwjnCEIxzhNxuSxPlUIWYbdx5Xm24V0BXlYjT/4ICrk/Gyk/Ta2wvX9v0K7MT5wld7O7qmPhjVgDNz4ds9O23oLfuOeMJCOP5u5P7EaSZVjmd/8Oc1n4ZZjnC9QccaluKZ7W6/Zc803j1tRvYsL6Zvd3xptgRtYySkS58ey90ffFciSpHklJwTQmzbIzqeX0k7D3ovF5alddV9IRFPDZo/3IBaM0ezQXYaz682ZgvxrfqsRMuvJp6W/SIsPR/aaM6uLXVV7nnPq8QEa3Vlq/Oj8SFZ+rvZha31TmPoF4vnCoW712a1Wk4LHQyRcV9wRvguqG82w2fzg+EEcF2vfb8hxX3Nw3A4uX1lR1Kk98+U5Ig8dGxNkg1JGTbHTzbrd5++oQvy/DuLX+/tAHPpeCdptnrmR4u5bfcZE/dfrsTLo6uKK/9+Nqu6XzrOyHyhZPI827RuHlPlXuiTnZE/A5pkyIedjaNqaCU8J7t6f+wOJ25vZI0dZ2DZXb/t0YOhLJn8vV9gbn5FOCqw3ozB1uPWlb9iavM9GhAIbsQjouFLKIqUSJRAP6SlMgRURHjpJGCH48Cz7R1gs2MD+x2AYUcGMl0HGGsyYMYkYGx7TCUyrgvIigpI6swjStAnQr0kMg2FMdLDZg/Y6pjATs8G6gPRaQigyIL+ESIAhUC0lBXcm6IA5sQCFAkCAkn0DwpXLTE2gYO/fkHJ+OIkITka9ACr1wec0QRQQjqgRmeZiQc9sQQbJ1y4+oG2VFB64oN8fkVTgYiuAVHfiEsG7EEfGNWE4qoL2MJKfjSYfpyszVL8NNH1LUmAomuAGjEBTfQSTlzAcz2mbaG6kIgp01e5tj39MgjOTDBtgqniwPqCmBxhly80m8JqX4xEz5WA8NIJQJtbAb56ugt8tdsGvt2dAA/3AMo1BdC7EqC4HmCGJCCUErvYBdIRDwgpElCI6MCJTBxYTMeBZEgHJu0GYPVbBD7ygldzJmOg94p++CN83xAaaut3Z0rkdCS84sUfHPbM3Gy2JWkWAi1J0plPlr/d2RMLiPPzySv7ZeDCyfyX3a2Yrq2b28An+VjdmgCKpLwf3RnZfgGheeuQEfcV2f+exA0V6B3IJ31Qq186nl9/WpufS1ZCZt/0/3T+ePFqdweIaGrFmRUWsiT//nwmpI7GjvG/dp4XM0lIi/LxnwSenMDdWluuS//w5Nqd/rr3ggPmlfpL/Kim3bXi50xwMPQ3IRUeHpYcpU6nn236JFypmLgaREpfOjH3bfNQYfc7q9nb/ZkIXZbkc7HVWzuDz4aHEvfSRuiUmr9xa7Z3TueytQdt50CL9Kh1aAw3H+9d/OTE4y+evLg5r8HixYUH3Rkv2GkOjx0vPqvOSkDP8V7vuf9SnL8wL6qrqKFRdFs983Ips+ttKLL3z5b0XfN2QY9+mmwPrb90QJf05dCJvBpWcC1P3rRqlbE/aR7uxZi2EzBoCe246fiFbFQNrepL32y3n05e4v+uynLaCMdVPaaFItL3uob5Xg/uCEc4whGO8EaMLUdofcOaeik39/Ru9bFZfe45rb751t9bMmwJQJOfddpfb/uVjSxJWtGwqx1FkjacFvB2Kf14UgNUpYkFkNaMkX1InCQjuXiAG5xHRJ+E4x269Lo5rhXPRJuu1RrMVqPM8ETQVx8tZ+4OZ/TVP19KVMZXsImoUcgf/DgJ6Vx07WB1JeB63mePax8snmjL5Y71Zm+kKUmiqf7dcHjmepNeTVV3O1OjkzOfrny96dM5kiLp8yG72gWyicgTDtV/v3Os8GA4K4B0Wc17Kz9+9HyN+G5mfnejf6M3q64uFIv795vPJWRr4UOqL8/jUat39p+c7281d+/ve4eC318GRTr9ycnyYW+LRDraH7+5w/H1iIS1OwO/XlxZjV/v7WfCRlcrTyz7X64kd82bcdX4OLE5tMrAsdCps8qe5N4g0HFlZemKdrxq+YuPmuSPR5eNq3V/BlYihWrD+HHb/5Sopp+MZ6KeYY2cbn/c6o06g1GXSZcJ9GVJ4g9/yW36W8RRgfVmjPe3Bw9vELAsogNOUBeSphGYFRFPge9+7QfApXIEPYPh0gqw1ekTuEkNJx7gywBkANNQgJEBkAm7QNyAQEAjCBu3bx/4dANQNNF/lwG0TAEYSxqw1x0CewMLaAxdQCgNIjoEjWbZsAYsJqPAai4FYPYB1+wDkXAESBYzBBd5wkVXHEA7YwcwFGFAdYDa9b3PYcpsHWhPE38Qcyi0VkJ4JFy7xIxJ4SjQaPWAdnDJKy7vDnJX6WgYCCsSMOk0gL7oEBz2mOqcBJFmjQHPsqaTJgg/X+wVSwB6uk9Atgl60hkOCYy7PMtm6i8ldFq6aNuMAGp0pqDy5XEiCeTAlTEHvR0FfSgrBI2fWjIDGPkSEJ0/BtzdqwO3ql3gemUC3N2RgPqOAszXO4A66QGerAG9eA7oRWVAlQESIQlYiM+4q3PzeWBU2QJa9zcIMhmFRZnta9RGTJk233F/kSN8v7EQj78zt2h2rWeb9Tsbr5TOvOjnJHD+3YWv9naAs8fzVwe7gGHYTACGtk8h1CdDJRadppR03dMu/imwOVIARZI32j0gqRmdw2ZH+71D626L+cS9dhWQ8BrujN25nE1VJ7fE/ZRagkPy6jPhl1RXU3yzUy/Ekmul1Hr/TX6hwbFK0f0iJpyY5fZ8s7l75qM5reFEMuE2k2l1BVy8vPDl3g6gynJiSS+3ZwZxf3858ZzcfkVd/dnmIeIqphvntcKN27NdoCvKB/n5m9d33Be65+rS8+TxaGxdf1QGcu8uzGfjquWO2sNOpdtvDSamBciKkllIJucSeiay2xzc2D0c9agpsTPJnd0avxxOnil+Wd0BSpnY7UENeGcpfru3fymd3BvdAn4v45mTMnA+emnFvcbzmipv2chPC6yKFYIekFAvbA8awJn40tdPzZHdA04mslkn8mCj8eBljZmGqkZ0LaJpL/7p+4OjAusIRzjCEX6zUSv3vnvMy3O4dMmvGwA74jIC6Lq+zEiWZlTKw/G7pyOyKo3L48iNln/OS2uFzytd4ER0vmz3gbQS3nptIHFxLvak2QDO5NOV0cb08WOxYXkk/Bek+ijJAYroUvzkjx7NqqtCOFoIxXRJ7dqjnUFn5NhAtW+2nig/OHnyVm/9NZ8eLAziKD4PtDPqKbI8XaF7IEqT8qHlxYuXFr6u7CIsrC7kv234M5Yw9PeORUVk3hSr0eLP1g+VMsVwLNLWb9QPLQt6Vef61ZerxzZqrfOfLERdpf6sVd8/pLuvN/v1ZrDwF5IoxVRVFr5ZA7zteof6IWvgWCK0dK64Zw0f/NLVFdBwfRpyrhTbaLc0WXk03AROJKzyyDsTzZiTvwJUSVvxbsNLFOuT4FI7pC7ebDaBudCxP99qMquu7JQeOq0Xbj2obHv+F+l4Jp03ItKEfm/caQ37g/HEsifYtvSGztNfL44KrDfD6rSFI7kaTxKYGynROAFTJYyLBDXiszLCo1zYcOfnAUJRoN+cfcWjugRk4x5BeNwoIQGFkAcs5zzgRFYBlpIRIJeIAp2dHtMmOEWdfrrwvtJTOWC/NwTqwzHQGbnA2IbgyCI+txRVgePpGHC6lAOGm48J6A0hxBFNcKG5ZeDs0gkCEsr3u5InBGyW0GkJFxNF0wlc2n12KhoHtMQQUEQ+Y1y0y+UBPTcPGMUlIDK3BGw1ukClNyDwnSfwuBLiMNEtGFYlwNzfJfBkt4QhmdkHvAPKKknRmIYbRuLT6fLJNtdhGuw4GhKokXyZ3WimTBJaKzENByff/xqEI4BsRKaf5XcXiv5B2wY8e0LQbyjJ8nSShQZLjaUI/N/rgxGwP7CBRh+g3ZeAZN8GlEkfwJ0AnhoGBiEFSMYdAmf2E2kNOJNLEHBXg42HwPDZPWC08wQYV8uA1W4wDSGwZpfOQlzI2hGD9XcThqGeujgn6gZgPhu/2/Y71/q2f96KKIttyy901gftdZ+K8v+nydpGrziwe0Cv5y+0mZ03SPeqtl8fzCe05oE1PdszAQkpqb7zv3dn1dXFxPHPHtYE9XQqmYuPjLvr1Q6+ligWMt45sfBk3Ng3+5br/OhR/dOVU1vOs7Hz8mEoQYVVDuTVW+3ORxcXbt98pbL74tuL39R3Xc+T4K2Lc181/GCf4+l4LNW7232eV4uSFDJ8gVI0rte0csuvk0Kqejkzd+fGrvtiYtEB3N2pAhhET8VKqVjc0DVkyfZs054MrX53NOiORsMJIKqrKVRVSWUj6VJcjekta7y+3yiXf44UoNdAktnp+tWbKVnAyWy86TSAvlMBFkOyqKlKxjLevRffwVFP3On5JOXG5NTYrUfV+Ne1sO2Zp2KLX6wPLdc5lcyZZedGew8oxGInoqndjdb+7db+z5Pw+D3BUYF1hCMc4Qi/XSjk43NLyWdm+6u9Ge+VX4g8a/hVS0Q2mvSAL6uTd/Ol+vglUuiElu6NVx90msDF+MnPHtWBtVh6/dHrToSJiPGk6xdPrnKoBmqYhWI4N7Dlg9XVWmzhr9ZbHpIsSR+llq/f3XuuLumPJlfvlkO69vHp5a9b267n/Wyzei6/EInUW5OXWD9owcL9zqBzei6/UWkD93r15cX01s7zI89lornVxFcVkbgsX7pQmFZXv3OssONs7Y9ewqC0hjPmRpXlWNvYavl1yXIqabS4df3noBsHo/F65QWrTx1y6GoopKtRY6YhG06s1nDU9EY0RxzuaFRVuZCLxxMhPaxKiiTJeA6Tkb35rHGwj/I1UFWlPfGfaTo2ENWVpouENHIGgBp0Ow6cPloE75AkzlWWr44dF9HV9IMb9bouGy3zZGXYOhkrXd8cW67zXnbx4d36xHHCmvZ2unj3ZvmW+139O76HOCqw3gzPdcTFk3LAbVxPFwA1mSGgHwI2S/BYM2JDjyeBzmgCqLIMZMM6cDxtA4psA8WkBziOB8RCEnAspQJvF2LAuWIGGAmyoVMnIFQEASPcsASjpsWTQHe/DfQtBxBeesL5JaxJwFxMAU6kIsDZuSwweHIP6N2/CozKGwREjnjPSWOPQMZ0+tgZYOI3wfWB3mSWbCgeH44tQE/mCCydRFSf0KuJmEM1kQJC86sENuWxlVME3NWzZgeoi+7i4GCaMGaxiYLBmnRaBCoiYRYf2JLNftVKKMzU/v6A2klI1tRIfLrLfNGYbREYmwkGy1dlCVZsIvRJznTyhYG+v7uFvb5uEPBbQnclvK+c8RBwzSHgTkwCHkt8umgLFZzWwTZPoRIxVIBIyAM6MRWQvQL4jGIroQHxogOszXnAxTkVuFxMABcX8sBw8xEwWL8NmJsPgdHeFjCu1wCr0wcc05qOShIJj8JW6wi/4YiEteJcMpowZE0yXXtv2H/W6z07vPD0nKVTRk3tUAcqpvn5XuyH8291rGcDxw8nyRolvLnPdjtjtwmcT6z+5FEDiOnGsOK8npgp5eI1xz9lmu6h0L4vas9LbebD6Ttblu14YVU7Ixeu3ikDEpzK51OarriSJbv7w+FWuz2aWNdu711cmduQm53J+F6tXYolVueizwbPe6tqB+Tj0YJGBaA7Hg9l6933F6ob3WZrICGtrGTCaeN6rbJZ2QPiYaN0IvZ1YxvQVfkfnsxd77zSWqI5nGnJP0gtXr3tl6cns5n+02HjZW71r4Gqyvl8PBrWVUORA/rNnjjAaGR7rjcZ2x6ekMnLEoVsXNHlSEjXQ6pqKJ6C6dkNc7jX63fcDoMOh50oIiXtfG6+/Kjd7ryhRcCaOFFDF/3dEUUDuqaFgYeXVLO1SXlvLJUUgKa1v6O/tehd9VcJJb2pvHOlf9f2JoCi/eDPa01FUi3r/PVm80SsdGPTHkysj7Mr12+VPTidz092zFuBmlCSOF7IZENhLNedOPbY0SOaFFL2hoOd+vc6KvWowDrCEY5whL9r0DXl+Mm8HFOq5mCr1a5N6rwkHXiGwkJkozFjPO7umXO5dGXUArqW9X9tdmQptxhZAnq21RpPoAmEFf24ceynj+uu50U1/YSTftB5Q1BMOKwSUBLWa10lk1qk0Yi2x31NVk5L+XvPqsClYtGqTrZu1A5SQJfXCv2I87jeeLBZX8glQilt3+zv9YftTfW91cVHvUN0kaLM6r/rjfL7a0s3H1cA23W/Lu+iQxFFkm6OagS03dpSth02b7cqwGIiulCwXlNdAfWhX0IlNOPuQ3+tcDGZ6D0Z9AffNet4fi6ZX4zvj4eb7XbH7bwuJtk4cAv+875zrPJwYn1bLqfyoXOLpTe6NhxPpW7vV4GQpwEb3f7qfLRtDRSpCOV7/eaJ/NvDyQ3g1uDmMzVX1EqWZ+2NdifedUCVo33p47+qVXU5ZDtnv6o312ILNzcnpmV/nFy5dqsswYelxfvXykISp8jyO8ul6oN67dv9lyrIMhdS32kjf004KrDeDCUUNvJzgFFYBIziIqDnFwh8p/REClD0EEGzm2g3E7/jsePLNoFUxACOA5AMacCJ1AQYWA5Bd0vc0ICFeAQ4nk8B+rADDLbXgUljn4BQEYSH6G0U9ImiGQSeVa4fKgeQMCQgGZKB40kDOF1IAXJ7H+jcvwL07l4BhtubgDMcA2oiShCc53N44SiwkikQJBUiNLEegGk7QHNgAnOFecDqt6ev1dKF6ZRqySyBQ1jsxDlguzcCHlbbwFbXBHoTh8DaioAkExMrGCyz155OSGCsX2VmTqYBXjwFyGHR3xeaDiNSWgK6YxtoD0fAyBd7yYChJYFYMQckRKCkcNgaDZmplGZKLEUI73SDgHIT1/BC7SFeZXU7gNVtAFa3TWASFii0JoA97AHRbAEoxSPAatIEGuaQwC5/V7eB/mjWLXg8bgPH8gBvzWnAh/Mp4L2VOcDafQoMntwGRtuPp3M1abUAZyC0ZQ74Gj1ZUwE1bBBI5Y7wmwVdV89cnLvbql3tVl6rNfcRNtQzp/PfHLZ0KvcGraHy946vPRw+m7g24HruwVzerJEoaXN3y72fDKrAQjQR6xoPKrPq6p1SqbczdGw3sRK9UZmJu2Vl1nGsy688AWmyEp4UH3VaElwOlW4+3pfgk9LSzWvbL3oUPHpcVWT53bdK16p7u/VuyYvn09GaOTAt+8sngx+cPH67+3T6ZEea0UseXB+VL6zOiept9pyAhEtGQyeOp79pbTsDD/hgMdeUdzYGr6OgNFnpB+to5xLF6xt7gCxJqaH2bPAd9gdoqnLurdI31fLjvRk9k4yGFgpxw1BlVfIO+45KngR4rn949B8ESZEAT/I8PFfyHGEBKMmKJ8muPOhPnu60xLID0DZHV8y9jy4vvn75Uuv7u29zq62m5IntLhrzbevxX+71Pyyku3brz+vKP8teHFq3gZ7d7tlTIysprL/zVcfYG1czWmG9W3zcbZ1PrH7+uKtI0ruhhWv3yiFVvRQvTB3kzy4UnJ3hw59uvGowc0vp9d53jaH8teCowDrCEY5whL8L0DXlzIXS+qD1ZeXl50hVllPxcCSkhnRV1xXdUF3VfTZsTnVFB2E6zmePazE9fSqXSIYUWfYkCc9lbLPXGz2q9O55VSCsam8n5x8+rNXH/nrfQjIx50YeXPG5kHQ+eviNZwVWWHllzsmqdvzz3RrwcWZZLLF9mF24cWUb0DX1rYWi27WG3VE8G5mEpJtbe47rPri+9+FbC1/Vd/cavWNaqquPx45tO95nD5v/6NSstbA8quuqMQmE4Zbr3LTK711aqJWH5fq0d1JanU+nMsbNXuXL5hagycrvnkjf6T85GK04H47kQ/rN1iEzzLg626hBy6+03p6be3jlDeSQgCLLCxezXwR7MBkNnTyW2XE6W712ddLjl/WxOoTEknE5Prex0Wn1TMCDL6s7H1ycv3v7laL4x4+rp9/KP6zVmj3z0kLhWq/yzWZ7bTG7azb2h8vZyGRoD/5nXX0v9XtFrYXbdL2RLOfGXub+wHvWbsuSMx+6+OPyaGAPLkRP/eThfj4czw6jt7b2S/F4aqDdvVMGIiH9Yip7/8uXfC2nSOfj0kKIvaMC6zcceiYfPXmBoNMtVFwCwoV5oNk3gf2uCYztPsHBQ1cVApNx/9bQgETEAObTECRhiVtx5SFkN4amAON2AxjtPAa61R1gIiyLuk0CqZAcjhK0qgnCRvBnojcupMhAypCBuA4wF1GBk5kYsJKJA7UvvwIG63eA7oOHQHejB0xMgHCyB3jCzz0q+v6KQPryPJCPhYGBZRM0vpmWDTQGJhAPJYHYsdMEXYTOoAe+T5iezAKR0jLweL8BPKi2gfX2ENgfOIA4ACYN/3CWDolNkwjiEUW2oC04oXYdmLQagDeZAHIoROBKJV4l6DcjUwCqvRHwtNEByj0TaI8tAqMvTZYIIhpThkbgex4zVMBQ1emOdlwLGDsjglZQ33Bfkpj6dUVCQDFbJFBcCV94yxoD7rAH2MKpS7hPeQAnVtZmu1KVgXzEBHZzNjC0IFBozcVU4FQ6BFwopoFz8zmg8+gWMHx2HxjtPgVEM6w9GEzfWYlGADUWJegZVEKh6e7WkmmAN5kaHuH7gPMXSpt2V3gUTREPG6sLKTUsd9xxddxvmIOBWDdyYeSzz69Hf2JdK79k1U+WpJOJTEGOPnrWvLbpn4/Dmnounnn6oPHAmlE1m88aekGZMiXugdxSZ/JyE6ML0bUfr9eAU8n89bv7wEelxdtXdoCTpay8O56xGk8bwMUzc42wtdvo3r65+9F7i1/t7WxU2pfPzn/V9c/QP3pU/71Ta7d7j4G2NfhwYeHzzRll5XreN40dDFKroblwfOzarbF5b7I/FYmfzafiieHtvl+iGYryg7k08kZ7sgH8q5WzP9m120HsQUQJCQevsKo92/VV83bzkIq8mIotp5Kyx0GfLYFz78xPOw/eWpt7aFe/aG8CEt65fLqQ0GXFnniTsTsZu5YwrzcUTfIkTVZlZEVSxGqJIskciAmSkDxPdlx6I3e3O9zrDYGuNf6quZ3Oh96amxPrpMC9fiOVjLxKj+V63mTHjMWN/mT8eL11fC3ztNusNqLJZPRWq3PSPn423a6Ot79oiemNQxyAloQ0H1570I58WenMh7OaGf/xevVCaq6+ZT7tNd+eK1UeNrf6PeD0fM7eHt5/9LrqauV0YUcZb5brz6XrfN9wVGAd4QhHOMJvNpJzkW9aM4Ikamhrx3JDbXKvvV83+5iveenLEVG1uGZMM2QiiqbIUkjWDElRXWVd4Xw2AAAgAElEQVQ8dHZr3e2d7nawBhnR9UvZwu5688HG854F5shaTWcfBpHG1mRWYN3d70Qy2nN+ChfjJz97VAPCqjbZd1zXXc2k710rA8eL6ebVmm0/r9zaeFBJpCO5hWi9O7h7dff0pdzDev36/b23LpZuNv1p+exR7Yenjt3pbQANqbKaTj1rPb9g156M2pNDVWdc1z5aSd4ZPG0O/WFfSqdKsZ32ZGbavju6/0n21P8KxPRh1RAF1mo8/cRuAaV4/MmDmQJOlqRYzXl4a0OSJGVFP5iQc2qtMK2u3r00/0XDL61+d7VY9/Zr44364bLHUBRVkve/Ww/gDDHeyWfScu6LzaZp2a3x6Bu2Pzy9dONhBehPxhfXFttXXil4r9b7p9KF+15zZNnOvlfMxHY6/VNabi6ur/dazwbqp4X3MsbQdKsjZ6jJRlTJOG7yTmvy1X4/rJgXoqe+eNZw6H2SWr5+r6IpyseFxdvXdzyXSEi/kMk+/HrrNW0S0bixdHnu+s6+9WLG4fcPRwXWm2HMrSQvfUKQ8Sc0Rs/KdaA5HBHwN0J8I6zGhb7K11SFDECyxoBZaxDE1YlmN9FiJqgLYZXUmYwIVFbOoAvYvkF5f/r8ILkvAr4tuK/HkiQCiiUZUgkoGSEGWoyHgNVcEhhsPyMgNszdbaC/0wPq+wowsiUgbrqAFmkBobkyAYs2buwDmWgGqA9MYGQ5wMh2gcZwDChyFyjGo0B6eY2gg1KIG1p9E3i4tQc8afaB9bYJ7HYdoD+ZjVkPzABd33BLIkjKcw6EQjoD4b0+mE6jb7h/IOhQCccByQgDO7V94HGzBzxpT4DawAVG9uxTIvoYSIVkIB1SgISuEPBJ8gHrLyGzGzszm3vBgSUNFSjFQgTM1rFcBpi069Nx+jmJ5gCQlH0CVyqr1wIWlk4CxbUl4ESjA9TEhNsuEFYVoBALA8dySYBOHah/85eAKRRX+9uA1W4SuNuLmdFSaaZdlpEYoMSEF1eSwFhfTWQBrjzkCN9v1AbDLADLhVRmLnSnu/91/3UEwKtwIV0Mj7RHW/XRxGkf0Eg3XlGjRXRtLZMN2cqTh9Xbz16p3Ylroen93mBMwFvVh+O/n1994q4LeZAuqyeN4z9+tC+OnZdj81c3yxLEB0rVdUO6qu5ZB6srTVWs4J/d1nClGG/JpuO6SsuVJcn1vH5looZkO6hgvnzWP7ec3x7WGuNuKGr+w+zqT5/WbfflDG3K0C8vpnatnVt9X12tyNI/Wci0rBvtyfOndk8eEGyVgS58whKyv9VLscRdZj2bp+fzu1/uAvFUuOMesJ2T6YVthgBvn5oT1dVcNLw2L9/vPwIkpIvp5GocSeoN7IbpDqwDL9flkC4bmqypUkhBk2UVT5VQHE+1XXnkSo2Rs9EfticTYNds7tJcW0yp48y1chO4Paos5hM7tS6wPXyDVuzR4+rpE/n7brPS7M958aV88lG9E+6on66euNt/9v9VRDUZAyHidKAZ00KX4idv7PR/PKyeSxVH+/bVrb3VTNpoekL1dW6xYD7tPXgtcXX6vaWH/dY3G7MVzBPH8695/q8dRwXWEY5whCP8ZkOSpEsn5szw5E5r/3BEHqosF6LhTFhHojkcV/rmq2wULmfn7916g9l3JhLOR6IJ3VBtqdswd7Zb689eHr9zaAwHdFfV9lAuSNMxfL5ZvVhcKSTB1bbb47/crYrqajmeunFvD7hYLD65tg9cKhUffL4hXqXr6plM4tk3mxd/sHZ7u2ZZDrD5YP/tv79ydbO8udV8693S9creTq37zqX5bwLX9aFldztJUQiNHOvu4NHFY+mUVLhZ7jSDSK6orl0oJmMR91F/695wxsYZivxPl7SyefWlG+jhTAssyfPPqlKQ9KM4h5axQqpvFFE6nt2pzWbv1MnitcY+kE1Ebo8rYjDFwuhRvwWcjMfPpBu18Y0XLbEEJu5o4r5u0dfQOJOW8sbi2Cl8Vm65nrs/astS553549fKjaFtRYqqSD/a6XRL8VC3N3u3fDJ2LJU0HfvBXk3IWtaf1NaW09vGsNLqJSbGxdW5263Kjx415uNzF+eiQ69fn3TBi6rhjJYcmeq1veYTq14Mxz6ILN26W1EV5ePS4r0bZdt2s/Ho8VD84RcvN7UXiMSN0tvFbzdnNO2JE3knId2q/Q3Y0//t4ajAejOkVL6uRIHmThUQP8WWOSHodJs4oqFUAhK6SkBgeFGAkK4C5t4eYO5tEPBAQjbkB+dNxkzNvkXrsusQWC75xkuibU2QMX4qojq9FUclQavEDA3IRQzAUBTAUGVgIREFctEw0Hy8B9gdYeHdBywTYOJIgOVKgGVJgGW6BMIdQbdY3RaQzM8DcV0DumMLGE6c6X1xABWdhsJZXtBCI9uezmG5NwK2uhOg3HOAlukB4qI0onuALPmLFGJKBUHo+AmDEwI5mufaEHROiqP5gRZL36cqEgU65gioD8ZAuW8B2x0HqHYBhH+NhAeEdIB4yAGSIhpSt4GQiBlEIki3FUb5E2fWP2j4UY+zdk7h4LVwUIBi9gm8uyatGkFaohwKA5PaLjCp7QGh+WPAieIicHZuAZAVFXAmI2DcrAHmvUeAKfzZ9zaAcW0PsHtdwLMdQDZ0gkACPVsgsNHXcyUCgZ2Ig9QTaUCLJuCIwfoNgJGWvx1tTzVVqixfKKRyccWkv2PWR06QIBHjQi6VkwtfbjXNICNBQFeU1u7zp2dNUdYymaRq2KbT64zq9b65a+78AiuOBzCaWMVwbG84Y3Ru77d43qyKohPf9waAMfKPAL3d2UvOZJKPv1gH7n92/9Lvnb361C9T7EawCV3/h9Yom0pImnYFPqp3Pl2bfxzkFZbNVpmWluJEPhRVQiNn0rHaG3btue7LuKb9cN4rm6/8ISheeBq2OgwKoFGwhuVYhxive+VaNmGU1nI324ecM+yY75C/fCxZbnSAj48lbveeAJ8WMpJyrzb2t24+FD8XC0XlgeJ1vYBolDA8Qq6k215o5CqmK/Vspz4ZVyem4/kD8PCq423Y/mdLSw/aqcfdnut5I6OWMELd8eRuuzqXSDS6QyCRMKYF1nvHFh5/vvHQawFz6XDxwty1rbLnsbHVmp9PRpJapdvv3518fGb53mi/3BuWe2J5UVScjnD0mIvELkeydx5Xb1qVc4XCpDK+dWVHVeQPjs1vXNl7ODzUKPAcsoW4vRi6HlRXS4tptaDf2t9nxJEG6whHOMIRjvC3iIE9SYIsSReL6XxC2jTLe3Zz72UO2Puj9j7tT1aP/fjRoVPapVTp9taszJEl6YO5ha2Hjc2tvwGGYOQeKubmQocKrBdxLlW8dbcCKJL0eL0KSBLlZzObrk55NnizOesj27hfVY/ptuOur1cTq0Z3PN6pdy9dLF1vzhaVGm1d1RTbO1T09K1R33ol/fPDeXdv9ORVfwV6VpTA3Wur7auX2j2/EnXsQ5Th2LKlk8lr9epBJrGQi92pVoFoSL/RLgOnMok7vafAXDiMcnviWoAiy/88q42sv8Z+ncuVBhokFBbCSBElpCyPWPm2O6pP/LFVx9ulaK03Wa2MzMa4+8HS3GfrVdfzlub8AksLQpQVWa7erU2H2m2Z3c8337pYemr1usNxudxJDyMnljJPms1r9/cSUeOT1eL6qFE1p2FKyvlUUR3Kd5/UrrrlRMh4O164e7PsuRwvprWq/eCnm6+ZWCA7l+jl5Hq9Dei6evrS3Lf7ZWffBUrZeGnxe20l89tVYDmOc/v27e3t7WPHjp0/f14OJJyvx2ar+81OjUD4YloOYNouMHFnfldhRQbCqjt9RKiOBDs16TSASXUXMHefEpATviXSaMzURFs5SL2IW4PA6coP1AtHp7eCnuGAOCkZDhHYJiUMQbqoQDERJehPFF7tontREBtGXAISAxeYWBIQDruAFlamoxJaMSF+Uj0XSIQNAp96y/Gmn9sb28DIdgBlOGbKadkO0B7ZQG0obh1gMPHwbd59766ILgFx3b9AiesqENY1Alt5X1+lKIAsgiBDIfBJJCUcmU2RCEY0wgR+V8Kya2AJmg1A+P8Jj2VxNBHKUXHxKTZtZAiZnQRIkkcgcROOYOKZ4rVhn34DyIVtQLSF++GHY5OADpzUK8Bovww4Q5PARX1SF3qsOoG/l1BTiRRFsdVCUzVpVYFJdYepP3ttH7C6fQL6UwmHACMaBfRMHggvnwYiq2eB2PJJoGN5wFZvALT3u8Bgcjhr4wh/+/jFjlHZSOgHa/mKtV8ZP628rnTx8aC/XYoX93ozIbNszpgATVEuJwq3r7xEUyXLUjISEscToD0cmeM3KKw1VXnUOvRFCnv6q54sIAX2T3OJeHunC3geuqGOAzW3vJyKtAbDjgmo+Rhtf5s9z4tHjFbPdD3vZCp9c78CeIfpqPu19g9PnrgzeJ1T6EF8Usjsja695gl5Y/F/Vf2ZXAhnru0NAAkaQSOeoj2/E3df8B+fO5Z6ttcH1lYyX/e3geWsfrvvAR/mjcrYAmSkP8iFRpOvvuPIBTzPMe1n8OzDqCElP/xRozd2HWDsjj4pKv9tE6ATxPwpwfHWC6Rp5xfyG3/9/Dfh6e297FzcyEdrnUGrPQyPrEvnirf297uD8dU7e4okLSXTybhhjqxKo39/uwbIkvTe/Pzeo/adTllV5HeXSo+/3pqmKEYixmIx2e6a1cahr69hqNJSqL7fAgq5mFTSRRNAPhWdX45dbe5uNb7XAYXf6df7dwPPnj17//33L1++/G/+zb+5dOnSxx9/vLGx8ese1BGOcIQj+PiFj1EjuX27/7g2/k4+loDtOadyh+yptiqzU/57mdLdO4dMm5LR0IfLC2tuNLXjOPe6g5tN8Z++PnzngIHwS3H2Qmk4OWTfNOi/riY7ly6s7/gFWUidUQDzxzPT+892GvLp/Ml/ci736fFbj2dDVXVlHKzHRSX/tQ82a8uxQ37ff/mkdiFx/PXDniKpv24RKqFlHrTSbmB+mpZz4k42HJ2ORDHecJ5NJcM3G77ey9ID50/XZ+lGri9OOh/PjH/O6uogHG9sWz/9/exsv1fG91VJAnaGvnBvauwwHbz+Cl6vUekZO+NYyADMkfX0ZvWD+YXgg7xqu/94u7FT64oegnQkfFHP3f+23O4Mk9HQGTVx/683RHU1X0xeyCW5W93+8cPete3zJ+cOfsrxDxef7reA+flkO2U/bTYleOfcfD3R/6ax43je1In6+4nfIgbr3//7f99ut9fX10+cOHH//v0/+IM/+Nf/+l9//vnnb3xhuT+53zAJjLPFoq/4HopbVZYATZEAQ5EJZIzCBsk2B0z7AbstwGrVgXGjBlitDuCMLUCSReKhDqixCCAJU6JwhGlj16EmrwyghGMEXYSCwUrFEgSaMMtxAE1RCNimYXtEoNzS4mkgVCwBnmUDelyMxwGUkAaEckkCSyQRvSe0YtagB6QjYWAwsQh4u/7EJtClifa6g612Q8sl0K6ZjjedQ5GTKORNIRUgF1GA+Zh/sZuLhoB4SAe8fn+6CXIoShBu6HcOAkGQopgon8fyBw8gDivGgaQ//cCtEEoJ/im4oINATeW4M2ZfXIAJ0ZjfzyQ4qgOdSeILo6syIMZn+1+GJjBp1oFRVXQOjgi+BvrAnE61YKHcyQhQY03wFWbucABMWvvAuLILjCoVYFTvArZpA4ouE1CYIkxTBERGVk4B8ZMXgNs7+8CjRhfY7U2A7mRmRfa9jqL4u4Vf+Bj1C2CaagcUw7HWrr+elY9G79055DP53sr85rfl+/c3XnwTz8N6rUfAqbXi1ebzBpsb5aZWVF6VkxMbz/it/QM+3fuaFYkZw76/Mlar92r158m6Y2eL11r+mqY99n+EHhS9+BazVUXX837ysPF7a6du9x97eLwW/89O418sX66Mrz/3uCKpc8aZn1as+tgfRkwzvtn2PyVnRKauoLtmT5J4jfXAwqnsbnkHkCXpad8vLutBuTwKEhuN70ZnvgHuPUVeFt4QjufkwqHK0HQ9V5Vl23WlQNLU740BSaLy9JUUUbdlnju9/E15D/Ac796V3XfeKV2rPL+735mb33vUXO/VgHwymm5LWwGndXmt9Oizhy07WEF2PM2crSbnS4mr23tAMh7uJ91WdxQ1tJVTqS+bm0BIVT9eyew7b+6x+DXie139/Q3CNM2/+Iu/+OM//uMTJ04AZ8+e/ZM/+ZOf/exnjcYbkrOOcIQjHOFXgF/xMepAuwVz4fj0/vFkerpwA1xeKT36fHP8iirKMFS1EHrpn8Ih7a13F+9NGlOL0SlGE+dsKvfSV72Tnb/5eCYF60/GZ874lEal1YudSy8cz75qi+YW0y199lnWeHb/9qPK25n5g0/2kH70uLooH1+JvIGBA/77VsuxLyeV9+aMy0Xjck57R3XfWW+f/G+b/frYL/h0WS14y72xX1QllFk04Fa7c/GtxVe9+cnj+at7vt3ofDYujLhUiUkgXAvLvsyoPB4pcvSlb/Ld4XmOLvkXohKS63pi8EJxIVyFDVXtD0fAXCrebb3OKv3h11vTSt3zeHR973T+0J79uLj48Gp5qpfPDZTKtl+xvb2Uu/f/3rXtQ/q8YXO2bJ1Zy4iOxexaYq/bk2W5tBYXcrpTueSZZefe8FFr8h1WxH99+G1hsLrd7r/7d//uhz/84fSRgWiLO7x3X/7akdcauUDKEKogwVEJlyYZ0GUJiGgKkPItv3WmgqFuh8C/ynUspq5XokPQ8wikOUJ8o0TCgJZMEchltEwB0FJZQImnATUSJ+Cu5HCEQLMlGusEZxbTDUBWhHW4C1jDAfjkh5pIA8bCKgEvpeeKQLTbIojzQ5IJmu/0VI6APxN8jj3oAYliAphPxgl4u445AUQaV6BXE3SIR8D2idkT9X1EnV1JG4qYYQXIhjWgFPdzJ+aTMSARDgHDjuiJCxN0vUmSDDiJ2Y9TCUWmfxUMlphlweWkwjowF9WAviV2gQuI44AfzSdDQKdFdAhoNm1Gk2G5MNNgzXZlRBM+WMJDS3jBG8Ck1yFQX9nifr8HWP0RYA1sQFaF7/yEIPcw+MIIs7TZqc4ZDwncv8T7TDoDYNyxAGfiAVpkusf8NEY1lQPCpRXgYaUOXN9rAXfqY6DScwn0Z4Ky/YAj/CrwyxyjciHjh/PZmOLKsuN6SmMkf9toj1+obA5itz1rBoxMnalAsg7n3HVf+emJdEQ/Gbu++TxjEQ5pa+eKD7r1L16R2AOExy+RYeXD0e0nz69yPrZaxVx8v94D1isN4MT7xZwWGrVHjb2uY7uKqmbnE0bGuL5bsfZnwv6DoYce7D7pLiwmdg+nAV7ZbUh4Hy6tjbVm2XxdIXvltVqflBpRRoUvD1gGqI5y8Alf1XY+urx473b5YPEqS9KFtxeuNvamTY6ZZOTJqAHYHjkjsT9qA5q0CFWgPOothz5O8dlrRvJGWPI7puNvaUYvfDUaAXPh9LZnAdbYBfLRSMvtAqlI+I1JNO4BRt9zSauzgvtYOnX3xowNPbtQEAZgwKnV/P0fv0QGF8lG2BkChqHer9SBM6eLV/f3gbcvFL9sbAEfLOYqbHbMn9Ne9deB35YCq1gs/qf/9J+m/9zZ2fmP//E/fvrpp8Vi8eDT/uzP/uzP/uzPDj6ysLAA6V/RKI9whO8f+v1+LPa9btX5u4Ff5hgVWtjvO1f7QUGVUUtpNVF5dYFV0BJ3K7NaZGLONFKjwaHuNMt++Wns2PlCRZrs7B8qO3LZaCKvbVnml/uvCwwG7j2tnj6RXR80RW0hS9LJaFpqSxsvxCF3R2M5yZliYfNJyxxZwJP9pt/R5/Nuk51enReJDMU9+K/ucJwpG6cXMg/7hxT3HtJX2zVV4mJhJRFxq3arab+s/fJlCCn6vJpiErlV6Q2s2RKkIkm75UMydhHzlzkWXo3GVE/yPByZ+nj4XLSRp85mO0Vsnzbw00r3o3yu7dSBr9rVD6K/U9Af2t4LzhZvgoQscfknzdnA7HFeND9GrDBYQKXWBWKKKvar/Ipl3CkWT+U65uwNF+eTO/3ZPOiSdNBFIXRgh+iTlxfudlCSzK9lb3abQFsdA6tzSVFdnUhFd92n9oHE70ql8r09Rv22FFgH8V//63/9oz/6o3A4/J//839+7k9/+Id/+P777x985L/8l//y5GFV0BjZsArkIxqQ0DUCzkZVBJulABFNBZJhAzB0FZgIjkpVCUgXYZytxeME1EvQ+BYGtHQWMPIlQC8sAkZ+HtBSeUCNJQj6CoXuyk9QF75ZtgXYfQuwhVZMJBUqCtNIvlAYCBUWAC2ZBZyF40wt0c0+QXuaa0+mY/Ob9fTQdMz2oAOYNQmIxdNAqpABOsMR0DXHQHc0Bnq+S9asr9A60H3py6FUGYhqKoHQSlA+qYjPtCcjYcDqi+OvB6jRxHQShBzNOzTgmUJLUH2eaHsUcZCJKEF0Y1iVgULEAtpjFxgfaKvWlRnlJgg29cC6ulCCCnmZiAARx5OoJhEwZKV4CMjHI4BV2yEQ5DljMcnObNfoMqBGVEBPxQE9myPwqRJfAyWamG6LpBkEDaHCPUvWxI6eTkMAWWLaghqJEThdVSqbwFZvAux0XEA08Yj1o6gBEA6/MpH3CH9L+HmPUdX+xvSfJeP0X5Ttof2aLn7SctH1ZnSLLM3oFiN8iFvadMxcMV7fn9UvCydydla9VTnE9ywtpo28frtWdXtvkDQJTGx342E3E43OZaKuS6s72tx55VpPezS+OqoaRXUtU4i66rAz3qt0zddqv7KZ6Lb1PPnS7I9bD8cfnl565rSq5qEqyva4vi8KBXUuVlpJRyK6JMmu69k2fpGhSrKMInmK48jmxK0Nx1vt/qY34YUE5rfTpTs7L7G3aJpm03yti5g+O7jcr9rRtG46k45lX2tkPyxEapMt4JtBWzFL7ycuzKmNiXPf9V63o/2RyylJPnNzoG6Zs/o1p5X+YtcEJKTNtgfkQpHq7hBI6mGhq1fV11UI0YSxp862/eSJ/COnZfZmldOjZuvtt+YeX/NlUqY0+25ooZd3kraC3aqkdLoUcrGn7TYQzmm0UBUpnRlvm351ZSjKP10MZTKZ7+0x6rerwHry5Mm//bf/9quvvvoP/+E//Omf/umLNW+pVCqVSgcf+R//438IevYIR/jthKIob37SEf6G8Aseo/oAKT3nOcf++1bj9cLt8/GVnz09VB45B9gEzzjUNNcdjiOlxJlTxyQPZKpD8361yQFh8dJiOlQ0bu3vu9XZh+ZT0WImaoQVV2GCbbmOCzIYsqaMpAcbjdHEArqDcXfw5vpAYGzbwikKIEs+Fs2GI1FF1SRFAhxwPABVchXWO83G4CVpeh7ceFjRVOXD40umYd9r778YlVPpm5X+L2imuhhNLoQSW09fZ5v5GkwO7LjaYLSSWm5pO31rVBuPf1TW/tH8O2Nvo2s1Hdf9ql0DwsqF1XAiqysRydVkWw5qQQ/J9lQLpW/TsOynZsdxD83GnLH6dS1keSZwLnHsJ3st4GQ0d509QA5qV/vVyvxcKW4Vtb1mD1BV+dzb81eqe9YLpOmN/crH7y7euroDPK21ludT1XIb6ExsWVHcw8/PH8tu+2Uu250+MLeUelbtx0L67c4+8O58dsNcnz7/9xcSe6Mbuq5/b49Rv0UF1vXr13/wgx98/PHH9+/fX11d/e4vjGjSalIHjqeiQCkeIeCodPV5wkAcnHTRtCU4JOG9HkkQSIK8yQiQNQ1wRyMARWFqsZ0rAaG5FQIL73BxgaD/TvTrCYR0jSDrUFA7lkgtHD0fySeYM6Hc0mIJwJFkYDyeAFZ8dogRWxTRNUBybcDypUJdwBa+8+MR04TEQQ+YNKuAEokDRiwJLCTTQDEZA7p+YqMFTA5EiQnOL6yrgGj3jRoagVZMZDW6Pf9Cc9BxAOmAS7sQpemZmUbV9245aIIvmB5B9QmfdGsErObTQCpsAKWECbSGI6AznknH/MULILA0E1Sl2K1id1uuS9AyaR3QIoi8wlzYAJZTcSCqSkC31yIgCH3a0jAAPTmLldRTSSA8vwSEV04B4eU1IFRcIqAwXdsCJo19ArWZb1FmmoAzsgCpOwEUTZp+DcTXTJJVAvYuaPaEQHnm04oKBAwW33XB5Ai/LH7hY5QiqTntnf+907K9+muepkrK2cjxHz+qehyqog6ynffqdcNQx+NZzVVpdivNlxhAFAvx1FL8xv6eW/HbgU8v55SIu+cMdobtnXH7VVaYH51Zun7rzc1fIV2ZzyUNXdE0xbZdz/XGlm2O7VZvNJpYtf6g1n+jQOjlsGznxqMKkI5Gji+knZC3PWzvm2/4osuSlDbCST0UU42QpKiejCd5jmdPvN7QtG1aPbO2O6zxypjkN+K5MuHKbr0Uz5yf1+91N8eO8z+3m7KU+iR/rBAeNayNkTM0Hete/+frgUjrOc899n9vN13PBAqhxLcbgXFXxR95r+fvuae1Vjyij4bPU3Rn3l+6024MmyNgfj7pZJUv92ZrncloaGw5o+BU9WVl56P3Fm9f2ZlYtryckvY6nuc93f7/2Xuv9kjS/LrzFy4jfSINEh4oFFDedHV1d/X0DHtIakhxteIOubrQje75GfZT6BvoI+jRSnpWZsUZkjPDrnZV3eUNULBpkN5nho+9eDMSplBVTc5K083BucCDyoqMeMMg4h/nPf9zGrf/9NKz//b06GpzV2b3XpSA3Fxqq9MHRrIDrMym7tsDIBHh6FywIn3X6vx3hd+XAsvzvH/9r//1z372s3//7/+99P021z/DGc7we4jf5h7VNNL/T+GNrrDZUGJGz/iO/rTa++tSDU6uXD3ihNm3zDs3Fp7eL/onmZ1DpJKR5YvZe9WycDWNhUOX13LbdvPBoHyKFuo1fNUsxEMRw3rjHJ8sSddu5B+2y8/cCpkxnDYAACAASURBVLZQBwEgQRjCRLVQPhzLaJEwqmN4+wfdZu8fwzl1B6aotID5ZGp6KhqOaLIyFm7g4bqeY/uDkdUbWs3eqO/ZfWy+y04CcGVlOpxSu65hBWKmkKyEZDUkyYovS65kGm6zOywFfhPqSFmIHVPil3vD8ovhpdzyUkbbN8pte/CbahNQpZmrU8n5qBpRbZ+h5fUMbzB4TT2mSGpEjkTUlCYlHC9SHvn/o9h2vXEVvhLNl2uhntkH3s/OP3k4dk+oBKZoI9O++sH89hcFxxorGc5dyVtJ5cvSgVjy+nsLDzqVYdOWZfnquWkpxt6oVR31JJiPJZfDU6VC76DZ/7xcEDzWy1L945+sPPvNDnD/Zfn2P7/64hcvBI+1cGX2xf54YNMrU1ulIVAe9IFwTBUmG7Z/rNTb6oXWEje+47n4neD3pcD6zW9+s7m5+fOf//zf/bt/d/Tzf/Nv/s07p2/zMfXWzBSwPp0m6CIUvI5vuoCsCnf1KKDqYSaZeDD5XEvnCHIGhe24msoBvmsTaJsEvxWeWQZiS6tAuTMEnuwdZiCKVrWwpgC5aBhYmIoTJAxa3RYTNZUxJNBgCbmSaKYT3NVeowMU2n2gMjCA/pHArISmAPl4GFiaigMri+cBqyFsx/cBp9MB3FEP8F2PicQnlgTUVIZA45VMTAGZZIyAShF0izMcAHa3CtiFJlAXrNhocHis1CCxIZacrFCwVno6BwwE52QdBiAKEi4m7MR8j4DeE82VovlRsI5RPQysxuPApdksMLRsYGjagOm4gCdYMekw6nH88PMBxPyCMK+3x5wZgKbIBMZj+WQcGB7sExB+413Tw4CWTgNqIkGgjgrPLAAR4bF+4Sag5hcnp6zbsQjEfwtLl4BUZoaJRZnrHbnMmoDv+YAsKCnfJ1CqyfhAXPRUim7HqAeosrjAAOaTMsCZk8n/Evw296iebSePf5LQwsuROctQt5rDp73BU05ahx+Fqh+jTr4sFz/+YOHJvVNqrGwmNn8+/aBeKZULgK6p1y/lH/UPPmuPA08iqrKaTkxFVMBy/VeNfss4STO4vj+XjW+X39iXd+vK3N3G2xJUhra1Y1s7gf84SVYX0nNKcmuv1XpzpRXTQ57nj+zTC7tGdyhSYt6CsKqmI5FYSNMVsYNu37YOuqfrzi4sZJ/6FavxDp04Orn12Hok8/hZ7eFmRZak2yvz4YTa8IbbvZYwuXhR77yoo0ra5fzqbFId+L29Ye1hq/Pw8BBGIAK5uKqqgV2W5bnDwxmDEUdCJJNqZCW8+JvtluH0gYSml7fHxdlc4J4vcG+3dP69bCYc8WC/3X3QaQpKO5+LyzPq3VoBuLk2W1a69waFCWfpQ3HQLQ66SlS6s7D07ZOK4LEe3y98sVf8+Mcrzz7bBe5vltPvza3mk6bnP311MCFSDdUDQpoiSEo/aAidRNMKPGi2H7Wk/+vKOw7w7xC/LwXW8+fPgX/7b//tic///M///HurjzvDGc7w+4P/X+5RmqxcjC32h9r9QnPT+64pIu3X8pu/KBXXrmXyUqRS7hmmHY1o2XzcDPmPKgd75fHE3PXzMwW5/VlrFwip8o+Wcr463ByUGn6jEdQwelr6NLGwWfLK/WO1Syyq8Wbs2CfZuHREv72QcuRRx+l7vq9ISlyNhNH7I/l5rdsyzO1ea5tWNKPdmp/99sXJ+ccLuSwVp7TVkSGtKTP5ZDIdkcNyyx7tdToncq8nSOr6QjKR0HTFYtiz6o1BuzPs0jsxXZqLhubm4jXNLveOMVu9hGH13lVdAVAfDeqjwScXlu8/K3u+/2RnLJDXFe3CbC6ZCtuqWza6xUH3caX1uAIQ1dIXsslMTFVUZ+QZLbvfsvqe7/XfbOoR18JZLZlUE6ORcr/c3LDHW0nrkQU7tdEbv0jNRePt42HXW5XWFofXkqRIN24ufNs6GLWd+WwiNqd91doHrubTC1PK0B/2nZEuq3E1Zo5CXxYad5t7Fy9P9wvW5+XCj24vPvq68GWx9NHHy8+/2ANa7UGrfWyqV9fVjWoTyGZiLV8EJY0rfcV/22XzPcTvS4H1V3/1V3/1V3/1j/vuQiLy4bl5oL+/CbSrJQLmRvBDY3JlKgfo6WlAS6QIWrFUYSMulFhCC5WY4ngaoOCW9OwMYCo68G2hBmw2esBu1wRaxuHfajqiAKtJm8CLK5eIwlh+JBggYbbEkZJf0D+m7QCV3hB4Wu8BL5oWUO35gOVCIL5ZSo2A67kRYDsesJ7LAWatBDjDLkGioifkC4LmicQALZkhYOm05BRBQ9/Y6NwQYXzC174G2M0qYPfaBOmNsqIS+HUB+uwSkzZMPQzUe0Ngr9UF6kMTEK50opFzOh4BltIJAqbKa9cI5GLuUBBvLgH3I06BoPrCsSQQj0QJ6Ebko7Mqh++r4gKQ1TAgq+rkE3FaXdMARiJ0stMkcGMXsjwtmSZo6hRtoVpGeKxfApKX3ydwV//mwStgoyVUYj5Bl+J6ugncWcwC59//lEPHLJtJs+dwCEiaNtlfcXlYnRYwk4wCK70RgeZsZPtAUpeB1VQY2PmuoW1n+K3w29yjgLgWXtWXHpX7vyy+jaw6FU9b1ffOzT/fOdb49qrZfAWEIASMNo/IsLLJ6Py5+NeNAqDK8k9WcjX/4IVxyoXi47/sFeKZ8Hvx+QcHh2XT2zMWrePuAH98Pr/n7D0enG5MEM+qH8SXt6v2q1Zv6Nhf9Pd/fH3l3nEzerXpT7KALNvdL7YoBul7irSeSyaSET0yduRzHM807Hp90CmO9l7TkYVUJREJW45jOa64lw6H1qtXTV1X79xY+DKwDJ2eiu32jknd1zPJ6Ziua5Jhewddc6dzcp5Reu2QWK67WWwyXiWzieTCdFKPKx13tDNoHz2eIKtSciqiJ/WQriohRRYRMqbtedCz7PbIqlj2K6wTjPS1qXyvZG20Dj/U3LedmuWljJOW7lYLsiTduJB7ZNbMlvPhfFaO9HaH28eDBGvA2lI868///V51Jh9fDqc+L495rK8Oyj/69NzT3+y8LqNfuTbzdb0KxGK6OPyyPx7SfsvmB1Vi/b4UWGc4wxnO8E8V+VC2epB4ZZ1iDfAdUQ318lPxavvdHQ3XVvMbfv3rRgeYT0SXZ9znQXCyrihX4tFcVFMkaW/ovOj0REhf3zZ0vRZSNct5s7DrCKKKNnngf7yUezo6VrrNR6LLsXDfdQuDUduyLM951N1SI8ofptb+bqcKfNbavX1u/smRenG/9EYyz3f9cqVbrrwxxlGWpLXZbEYNjZpmo9TpdUY2hgQRWTq3NDW1lPq2XDFtxzSd5/fLs5fiB90+sJBPFAbjAutCJjmTdTf6ez0HBMEU5cfTc91u+HH1yMDeJbxr9UaTCVBFki5M5zLpqBTyu55VMXoNY1gfmuJV8+1QJGklkc6rsW7T2nxykixs105vHUjG9aXLua8PSl7Dz8TD6ZXI1+1yJqJ/shx91n2lGNKdXGYxbhpuvee0w0o0pmR7dupX5XbLf/nPLp67+6o3itrn59Ofl8Y81t3d4gd/sLL7RdE67ok1CDzwQ2FVFFh+4Jvzot7+kwsXHvU33rmP3xOcFVjvRiYSaj35ChjtbwB2o0LgmS4YKe1II5vgqwSDNTrSN6cqMhAREqJUBnAFmYE0+Va12we2aw3geb0LPG+YwH7n0GRcvJdMx31AkQwgH9MJeCnRRie8rAQ/xBGneCc9DcipHEFPX7HvAK9qPrDfkICBIQER3QfqWRcQzSaZSA84l5sCkBUmLFSnAdjtJgF9IgyZ3F4HUEXoXm+KgHwSKX3CCEqQSWa1BJi1KmB3uoBnu4AaDQPhuXFQhuBg9LmVyeEqFmvA01oX2O9ZBP5Vwj991Tik99ZzKcA1RoBVLwNWrUQgVhMQw1aORj3GUoAcjjKRgo3vgD6HFvzS5ICIZQQ7FfBYHoGJ/9FtCa3VeEkRCplMA+GF80BkeR34fLsE/GqvBXxdcIDtGkBvKAOxsAes5odAbWQD//LCLLBy/WMmIjbHBsx6dTJOoc0S7J3ZrAJLKxeBvmkD8ZBKYLifjoSA1UwS2OEM33dsNwepQDOuycq1qXzEDfV6ZqdnGpYdi4SyqYgWkx/1KgP7ZEeYQHnQm8nFl0OpveobCTBdU65dyX/R3Bdix2vTU3aktj0YAFOh0B/ORvvOq77b63kASZ3/fWnxeSu92esBDav3o8WLv9oZ+yy49tvmzmbDif3BeBixqDOZsHo/k56JFlv2jg8xhau6MhM+Xxokvqg1Hd99YW788fkLf7NVBVrhkSJJE4f0SEgbjk7f8bdgNZ/Jh8LFZ/XKbvl19szz/PJuq7zbWllMD3NSodlzPW81NiUKLDksMwBYSMSleH2jf1Ld9WpQ1kPa9ZmFx5WA6Dqq3JWkD2fnjZZVLLZHhi0pUiYZnZqKxBK6p9O0jN1We6/aOXqyUqFwLhmLRrSQrqiKLB0j3fE933E82/a6A7PRHhYLveJpUv2ZRHzv+cliNBLWLl6bedSqCX7uwmK2Gu49bVev5ZJ+rPWsW3k/m16IVmvW/SDQEsszu3YL+KOFdM9c/by28/7q3KN9t6x3l2dSn5cLn3y4+PDrwr3d0tyV1KIX2npUBkIh9fzHi1/ujik7JXAFa7ZHkwbLv96ofXruwkBu1K1eTA3P66dnLn1PcFZgneEMZzjDPwWkQvq12OzGVuPZ/jGzhu7QLDd6QDwcWlxLvmifbuVQGfU7YeP25fn7z0+m3wC5VCwyrwg3bWAtk+jrRcO2gfOJ+FqycGCeNH+qmYW5eE1TLj9rdwAvdEiNWPbbqCzZOCwOGtZ4teuJRDj0sHWkMnN9tzTaQOYvV279x92Oj//c2LyUW35Rb2/3Wh+tLz3cGIux0lPRf1CBtZJPR5te8evK0em0cFi7sJQL+bimK4fVgeu82KoCB4VWrBsOTauW7Qya49A903cACX95xtk6zZELMF3b0muxUFS87k4myxRJupWYefx1cbKk7/qN1qBxJBYwqioXF7OJTGSIs9ttt0eGYbmF+ht5uO+ItejUgyO+LLlsfG516mGjMkk9unVp9t6w6Iy8nyzntp0tz/L/YnmqYn5bs/zlcPL9hCt526ZXV+W4Ji/tWvl7nZokt3++fOs/7ZWvLuUf7TrN+DBvxu8GNVa51S1D5lpqIZ1s9oeT6gqQghS1vWo3taJ3rDE59+sxNxkDXkhtfvxb7vT/RJwVWO+GWS8PNh4ARmkHcDotQFj5aYkpAnJFS08TvISILsKeYRK0uQntUURVgageAsKaPllPq9sHKt0BUO6NgELPBopdDyi3AQQ3LLrBRPxTJuoCXcshaGSTjmqwui0mohzfJwihy6xcBDRFIaArRD59oysDflcC+iEASXKBXNwDqkNzskchQeeIbQkea9AjCM6TrSMctVBaeMJ2PMTEa77TAIxKCRgVi8Cg2AGGTR/wPAmIpI7dlfT8/GRVlusDxe4QeN4wgO2mBxgOQDrqMg4tZSYeBi7OZgHPHAF2qwoY5V3Aah0Sb0LXJazIhMOWkH8psQQTJdbYdv+wU0+MR+ympGgEaqqx1f5rbJZoOJUSaYKGyrF52PQ8IGdmgC+3y8Df7bWA32w5wINtBcjvG0DGaAFOKAF8sRgHXM8GUqEakL++AsTWrgHuoDM59YJuFHSpEP/Z7RqB7E+0x6Yjh/G0mXgU0K1/vKPPGf5XQpXkH2eWn2807hmltyzWN6zEgR6Na8M3BOAYrnO3t3fz+uyo6u5VDwumq6vTu1Kr2B0TFKosT2es7YEN5MKRtWSh65xurWl55uWp4bM2QNloSOjCgqv3mrXSUTx9VcucizaNIRBVxtl2l6e0mnU671U2vv350vv/cb/l+V4ubb2oA/RDhzei7Gy8WP5O5p+SxEcrC5uf77eObCsR1y/kp3a+2Nl8esx0+vpHqxXJrdV7g65x/b2V+7ulTscgDNBxDODj5emtwSYgIf3ZQiastnt2NanNN4z4ryoNoGMPPl5a+OWrKhxWWHdmFx5+XZiMZz6byseiChLQd6xKd9DqjWzH3d5pTOjllWw8Nx0PRVRfwcKzPNd0HM/3JyfacT3TcQDPp28dm0bUVTWqqXOJxJSsP7pfBCJhbf1ivqNYL2r13fJhvfXB9fm7rV0ffrqa3zA3gf9zJVY0vlUl5X/LxV37782gbrbdtu22pyX+Vf7W37X0ivnN/7F8+z/vVe+cX/7Vy15iVo8Zobvlwo8/WHxwrwA0e8Nm7+TdZuCNB+953sXEzFeNd+QvfQ9xVmCd4QxnOMMPG1FTv/foFNrpdZQbvVsLs1809t+yzMPWgRySbt6YG1QswMv633SP1W0fLWS3BmMdzKczWsl4W+1SHm0uxa7sD4Z925iOp6v9kQStI1bpCV2/npkeePardmtgWoDlujeiM58Zu0BMjonFNPn0olCgaj+4kLy20e1t9kvvzZ5/cNB81q5emp3eOWgDJbuvyLL7mmn763h/ef75r3aOfhKP6fHq8NlpzqivvtrOr+YkGd/Hb1tArz8usA5GPUAPG8LE6y9XEiXjnhBg9d0XwJ/Of/g/SnVgJI1pJy/I2iq+Gk/SzUzFUy0O7tdPTOatziSmz6V7svuiXBMv2/VGv974ro7AsZMfOBbOLoYwxrh6be7JsPF5o3hiods35z5r7AJ3Fqc3zA3P9//lbKRoPFYk5efTztD6NSAjLYbPz6upId7mcGvodYfWt5+mFn/Znqua9/9o9oO/Pdj747ULv9is3b4w//RR7bODwscfLj65X3jdECQa0XY6R66rH+a73lmB9W443ZYpCI/aAYF709GuwCD87vCTvmECnZFJIHARWh1b8zicahcppzLgej6BjdOYcvB9QEhChQRwZEkEGqyB6QNDyyewaxJrUFyHwx699uR3oRgTLXKjehmYSUSAXET4tnuAqviA7UsEUQkjUwIGlg8MLBcQFjLho/TM2BxcONq7BLbpR38ebY8RDNaY9+r1ALPRB7pVgHZXJUi8mLJdIJId3zWEfbzgigSRdtA3gN22B+zUAQxLAnoJH0iGHaBjWASEomebk8MilElmtQF4tgMo4RCgTQ0ngxyTf7ZFYFQmaEjxuaDrRL+eOKPH4iYjMQJ2Sjiti8+lSHiyNrGMlsoASjIDvDioA89Fa2fdAbYqEpAvGECo8RBwzTqgqHFgwbsJPI+ngOWMCVw+aAI/OncJsOoHkwvA7jYJLtFxL+ERC/7wjAas5KYIZHxmqw4MSjuc4YeAgWGFv/PCMm9rExPwfP/bZknV5ZCsDLsnK5uoHoi1wT7iHS8jfZJIZfXRwE/9ojEme3z89UR0fzAEEppahXQ4OgjMqGaT8URHEYRNPp80c+FSpwtsvGok8nrPNg/antDftMzT0+uCAXs30tJGFyCb9ESYz1Q+LH7ZbbU/eW/x4TfvpkDs1+KNL81lnj56o+98dbu+9scXN3dr7dqAELIkAalYuGr3IoqyPawA/2IxWzLunfii6T8+F1/f6fdLRkOVE47niefIcnqqXmwDC9mksm8c1E+RnDcqvUalB8ynYwuXcl3JeVVpHA3J+Edjbi71ZFgfvuYB+8GNeVFdzcQjbbnouf7tzFTDfwD8WTY1tP4WiMrJn8TymvMElwwshrWifPtB/1vDKfwsnf2/ayA/z4eXXo62L2Tm7zdLP762fO9J+Yty4cPbC1uPKkfDA4ALV2Y+OxIZvrHfyCxEmuZJP5Go9rar4neOd/+lneEMZzjDGX4o0BTlk7nFH+UWzqWnTl3g7UmFR+F43hsmEw81UqZnTH6fDycSyq8s5yvN/cWcfpiimAgFPuaqAuT0qPinLEnRulwqjZXa1WrX37eu5qeB7tC8Hp0FnlSb52OzwL1GN66m3jLamvVSvK9uDApJPQQ87BykE2MLsQftyvr56Xfu8n6zk5tJHP1kcPAOYVNSVYB+awioYgenosCVmZTp2qokmd4pXW+mZ9zOeoDh2ovJGMF74GxkTDDlnVD7tOrqKLqtwbPPd4t3i6miczud/2BlfnrqNX7qHwIlr75eXd2+MvdZc+z7enle7dhDYC5a9fFTath3fy3+68exWc15cvg1315wv7gavQGM7AefpKdH7uAPZlTLczIZU8L/orN/cSkHfF0uKuf0q1fG/UwhTbl2Y/5R+1hL7Mh0LoXzHMflqelk47u/WfwOcMZgvRueOXIGfcCzLAj4KkFXiNazaIKg9SyUnAIOGh0C+kS42Alr77CqEgTbhUVbnKYC4ZBKwFr1LRuYGdlAZeAB7YEPmLZgtiDgw8Tv7hHeS7DMwmxJUBR2tw0oowGB07roebxw6w+AK40usNvpAp2hB2PLFccVRuc+E9WXD0FH5JieiaUIhEoi93DsSh+OEhAzwnlL+ISJQYv+QdFSJ9IYxc1ahH6angSInlzLkgHvUAwrHMlDQNe0gPrIAWo9gEpbBixL3Pc9oD3ygaEtGiE9JuTZaAg4vT5gdUeAZ7mAagt39RCBEddRHssbM1X+5H+Fkmm8pOcS9AMK4/6x7EyossJRQArpBCSiCIUUqYKi4bTU6gK1gQE0TQcQ3daWIwExcXR80ShqA74zBBSzBfR6aeCg6wC7nQFwYz4HhOdWAGfQIbhcj/p+CU2YsPsXF4kr9sW2AKtdB6zm6c5DZ/jeYnlqKlT3Jgqe8zcyW82TffgV67smvXyYXagXR7P5eMHtFAaHDWvPDvpyUhZ/Vgl1vhv4gpat/s1w2MMAXz+Sv6tI479iQbTHlbHa72o+v33/2DXW7RnmU+fCpcxGo/nN09LNG3MPm+V6S1d1pWfbnrsOJ6mgCSzPuJRKPGt3LM+5NT/1q+3qyLFvrs62Ho6AoWU/pPbhhwuljVa788YJp/bAiMwmU3a00xwvE5tL8vCth8l2AUWVwU/E9QOMRCzEgHRULQ74aDozcLfFghIsRVJ7o/GR7DhFiYyPnwprBLcp2ZGAqVh459n4yMiydGttdlDsdCrdzFI6PJ14WWr0j4dkm6az+WA8qTcbC6Vy8Ug8JOywZE1CkR3Jbxmj3VrnLfOkqyvZx/WTuQ0Xl3Jf9ceX09V8+nlvG1iKxer2DrAaTfi+qJ6lkHeK+f6i3BVxgzNaA6haL7P6+Z1B5eOl9c/3663oMB4O9Q2r1h/UGMRX9flkojYcfNk8RUr4cqsenRnLB2VJ+iiz+Px5w3qDSez3BGcF1hnOcIYz/BNBrCvvVQ6VK8mQfmKBuWxit/9uh3dVlu+klr55fOB5XrnRm0nHPl5a+qZdEsktpf7wZ/PnHve2gO2epquSYMVcz6vbd+bCO7IUavQPma1JtrSIltKlce0Vt0+kGwOYptPfGlxYy27UG4290fR0bKPR+dn62uPBy785aPyrletF4/Gbhp0Pa8/EhpRxEfllY//OxSUROOjDV+WikpDWV6fTqi65OKY7Glj1xqB3ZLTlVndtLROz3UHPBAqdQTgWMgZvVuULC56YDkY0FsJACckMcOQRMBc1hXnBrWRuRXtquo9WIj/7dbMK9J3OYmxhfzCMaDIgChVr5ACrufSrZ+NdeG8x9+y/j0ORO7UeEEtFIpemayelWWMMB9ZwcHowZTYaWvhg7pvd0+V6sXyE44VNPBwq611nNK7J5qYkYSW6Gg+L+i4wUkCWFUeaVTnJ9il+AyTwbeclrNue9UE2/v+WDPQeUBh0bqzPvnrSdMfkgvmy/kYfL0WRY1pIFFgfJ5buPyzDeE72e4uzAus7YZyyF40Cih8F1EQSCGVngdD0PKBPzwHtoQE0hgbQMw8D8nRVASIhFZiKhQHFMgCzfXhF5oUZ0kyWoKHEcj3A8WxAUXzAsEBoIEBTJAKyfkz7jxmcw/4+u9uZ/BTymkD6kwXuLK8Q9CH6DIFU1APE3Ub4uacjEoGhlOhVVKfEvs8AnjEA1FhCDIKg7W7s4T6VJWD4RPOd6G0UZI/gsfRmE4jWW0B0JNzkJUBTfUAOYmiF5Et05wlSsC/EYQbAaCQBvi0Boj9JTOg7R3yCBX8z5qUc8bs3OdTCNkbW1MlWBD055p/GLZAOINnW5GAKvsdzbCZCNFkG/PBh66i4eARrJfyutHiKgOvqDA1gJE6BDxBVZSAdk4DZtAdsz8aBRe8aoA3LMKYD7UgeUDXxbAPomi5Q6w2BlfwCYPdagCSrgG+bTBRg4djkRBzz6xL8nGCz3O/12+EZXodxxIxgdSX7qHqSg5xZiO003hgLPcFHicWjZuiV1qDSGqzOZtvxYWXUB+5udy8tZUujxjeN1l+uvFc2vhVLfjloy4O0Jsumd/iktANz8L7tAJI7fiiWCsc8tyRp/CfQ7Zu8YuXc1G6rfT6WHmjWLzarP7t4/nFv6z/sDv5y+cOS+fWpw57QM68G5fXs8maj68O9UfGDSwuT/BzX91/UjjuyplhcTi7EEq3CQDQbvqo0Vy6lQzuDVn1QqXZv/MHa5n9/9qZj5WgyMJWP0TXC8RAGluwADasD9J1xNXMutGU4B0CKL7PalYY9ArJ6aH8wFHMaYpbANG1AD7zLF+emXv761YktDjqjy/HImwqst8AYWrt3C9c+nn+yf/LCiMf0R/WTH56/mD7au9d2xk+rtuVEQgD3O81/mc6ZXt3znF+N6n8YXVeczSMrkLb8FRDzhuNiOqaZwPagcmX63LNa+1Hr4JPry/ff1aIRDinpFf1FZyz4qzV+GKL3Mw3WGc5whjP8E8Hs0lh3dfHCTEU3TswHzecS37Tf5uMg8El25f7TUx54Owctvyy9n5kHhrbTakXToTjwXwu9WX11spiHbx6XivfscUXVNWzAtT1gNhmfGDstZJPvJ6fn2uqdmblL8zmg2zfdgrWSntoqtS4r+ZCi/N1G83pi1cf/D3v1qPxBUkufGF5cTW31Domohawn6A3H877o769fS99cm83EY1+ueAAAIABJREFUT5fsFDrdL0rFDbl9/vbMynIG2K22nOVIdjYJPNo4uPJn16TXs2xA07X9ahcIpcKApElA2zYSIa1u9vLhcMduAGvRtOHsiK84XvejVDQYs8zkJdlzAXPkAJ45PnH5eNRzT1Gv2/13O7afCsfx5PopbNza5ekT6qubF2dPOCP0nLHGfLPXz4ZmAcd3K94tVY4Dhjv41aBZkD/uax+N1Ns97c6mdOvFcKzKCinjK0SSxltfSI9Lrs+bex/cnFfewEXJknT9/MzshfikugI09YdRupwxWO+GrIe1zDSgRA9f+tVkhkDmElk4D8iJNHBQbQGtoQmMbBfQVZkgIC8biwLSqAcMijsESXy+YxFolcKzy8BH55YIeCNNbgMRzQIaA5+glzCqSQQm3ULcEFI0GLfaBbbdI8AZmoArYu0liYCSSb2vAX9yYRFIhA6AJ8kBgfZLkD/TURlIhpTJVgSpE55dmqxnbLMk/MASaSCUmQb0VAYwRJue6Cg0RwSG6eJ1VTBtrnjz9geAMZSASEw4jY3vRIJ4E+yLINIc/1CUNoZgjCQAZfxTYpLB7h/q1yRFBmRdmSyjpWKANpUGxOkOZWYA5Yhn1VjcJgRwgruyDICjAavj9auT0R6T6KUygK9qQH9kctzoPxPVgfPC0gxxii0gE3eA/XwCaHRTgKCWwmEfWM64QCYGoMqCw7MBbWYGCOcXCbRroo9ScIFHdWCiz3FsWiZJgBeOTkZ+hh8Q7lYLLAB8MzzJRkgQnlGt9jt6zW6kZ795+MYirDMwuo+MH19b/rJb2Gn1LkiZeNzp28Yvy9ofzS1Xzb1Tv7XZGwERJVRxHIJg01wk2qMPRHTN3xq+6jSA51/tSRJ3Pl5+3Gi02sOE451fzTzZql5bnXlG9Zcvmz+7cOFxf/Nvyo2Ikv3jufOSXKqbZSCiRAv9ldLocELgea/wx2sXf7E5bmZ80q4CpMjPxqZCkYiiqsiqpCi+7Dt+p2sWqh3Tdh9VKhJ88OH87pNasd5JZyNL8en9zdr9jdK1P71U+mzbODKZCKx/un5/6wDouhbQcU1ZkorD7mo61qC2Eh/fvubDGkdqXU0a3zHG0lkAHNcHHMcFPHe8tH9a1RGO6jXpjVKqdyI6HWXv2DRxLhP7pnGsUzKTiEzSoCeY0dMdewAMHfdebep62uh77c/b1bx+8ydJY2TfH3mDh4NvX9+ipkz9fTcOfcDxomACB1Zd3Od8+Kyxe+PaLB1ps9j0PA+QZfncbGoqG94aNe+NCicyIb0pTy5L3utBht8znBVYZzjDGc7wTx+3r8191j69AJogqmqtgnH0qZUM6+vpTAjFwa+OBnvttg/3npTfOz/33KttNLtX1TnC5Z5t/LKk//OFi6XXIp/TWv6L4RBIqOOGPtv2gKg8ju29Mpvb3DgcmO/z/PO9peWpfiZcbHb9Lf/yhemn27WLS7n9UPuvN2o/WlyryYW+bfyXQgP0pdi1TEir2PZO/6QA6Olw85+tr3++2xwekUJXR4Pq6JTuvOi8diOV97r+053a1+XSwmpybpR6tV03dOfa7cWX9wtPNg+mr+avJGPbn28bfSMU0dZ+evHB1gEQS4Y3Kg1NVXbb7ZlMfMdpZqKhhsVUSO66ADHZPVpg+UHdZPsQSNNEVr19PK6xPTRDYdUyDsefyMYy7y893/pHNqCkpxN7vZMHKns+uVs+5Cw1Vcksh5+0Ty42GoYjSmjkWkDFMLT23Ef5har5smr2/0ON1cinF6NaVOn4XsXxOr5vKXJclXOGP/dFz6qafSCsRF4EJX7N7Ezp+bY5JrQetQ6AxLKe1mOO77XM0TOnyhtms1906p/cWLn/5jeB7wnOCqx3Q4mlwvOrBCIVwdloUzkCtim6cA7YqraASn8IdIV7OxJBE286GgbiKkB3+xUw2nkOmNUCQWubEo4QmIzH1q4Dd67cJug61JU2sKNbwMjxgZh2qMESREg8EmVivKQJ0yMPsHsGYHcNwBM8sOcSiGyS1z8B/sXVG8BKqQbstfsE2ixB8ExFQkx85/sjIDe7DITS05MxCA+wRn8A7HcHQL26D4i7mybLwEwiClxcv0EgThJiJqHQkkPbgNUaALKuAqHMeCJAcC1CHSXeW0KyBAgpgOByXNcHEhEfiOsSENUUQBqTcaL9UwOUSAQIpVxADqmAnhWdd0tAeGEV0KcXCMi2MU047AO2qk2GPe7LE+S2YMv0CCBHYoAaTwFaMgPoU1nAQgGGA4MJHShLQCqiA6lIGJhLxoC1rAXcnBkChYURsNc1gXLfBbrmYetoQpeA+YQKZCPaZDy9kQnEpucJ+D+hPxsfgXCEINVRaJDFToyXUY6qj59zhh84rq/nv+i8zVxU4FZi/t7u+KGlyPKdmflH3xRfvDp89F4/l5MzysNK5fFW9dzsVDM+fFptXZmeTUQOerbxn/ekP5252uaF5x/yZJq0CE0gqupgEWj+JjNCmnMKS1Pea0cboRu3Zh7tV8ynzds35u7vl+eyiWQu/HmhPhtLX57Xnvf3gP3BYP8Nbgae7z0ZvFyYjaxEFmxLHliu4Xqu56uSpAUxLKbtDSy30O0NHfvrRhG4cDUbG+rPdmoHsnzn/cVHDwr3GpWPPj23eXe/Vu/V6j3ykchKyvT8+xvjY5W/nC4f1NfPTz8wa+tT2R2jqWtgEZI9XADbV7QjA9szx0/ehmUDQ8sFDMshSOlQ9PEU2Hahce2nF3Z/8dJ1XUWR1z5df9XoVl+rrrIzifxqhpDk+L6CJDn+oDEsbjXc4+XawvlsI+ZVW8fEW9dvzH9RPqxUJLh6NfflabbpXxfrF7NzyxnvZb/g4xdGo8Iu+fDaB9m4rrYK5t72SDz4MpA58r1xlRRTkvXR6ovuofAupCknqKmebfbs7zT7ebex++PrK988+U7+ur8rnBVYZzjDGc7wTxmXV3KPrYr7rvmUfCT+KLAGCKvqJTU9sXuYYHunzg53rs+/NJo7B+25bEJOS89q7Uu5mXi00reN/3owvDZ17XyyWTULEtJc+MrflcflT0gOiQJLkSWORO/Zw9N7KYYDa/9u8c5PVr7cLW7cP/jRB4uflwuxvnb70vz9RulgY/Tj5QttudIw3+FT1XVGj3qB8loOhMeTg6GCylxcXYzkIn7ySaW30WkAd24uvnrZulstvP/+XOFp48vd4uqtnN6wS9tNYHSkmWD9vfkH1ToQyeiU0aISBsguoMjjzTRtfyZQDYXV5SedFiBLSnk4BDqmDYyOOm0qhxqjJ5sHa5+el2Wp0ug92Ds2bReNhVauzzawNsuN7dJJOie6Gl7OpRKaLvv4kt+1reelun88y3t5Mf2ofyyb8v2b83cbpxguCLxsdF42OJdePDelOwzb/qBqdP5r0QB0ZfnqVHI6LEcVV5ZsH8vHBSR0H71jKncrnZF7uPmFSOZZ9R+cwH0Ud1u7n1xe+W3W8D8bZwXWu6ElpiLLFwjoCiGsCU1lgFA6D+zW20CpOwCaIwswXY+APomHNCAbjwKjgz3A2N8EBltPAaO4B9i9HiCHNCCcLwLusEego7p19UPAQ7hSdYHaUHBLENwoRFzoTCINqMksAX0ijJ181wfMngfYwy7gmRuAa5pMiJlOA7h44QawmlsEDjp9Aid674g5oeiUFEIf8al492qOGgQG66WeCVSHDjC0hT4MYC4+AGqDEfDR8jqQFCsV8ik9Alj1CsH9V8/PiP9X4lNMOvIcCUiEZGAq6gLTKY+gk246CTAdk4FUOAS4wgXe9w/XkEhMDrgSjQP67AIQWVoHIovrgJ5fYNIg6QkisM2hj5Q/WaerHb6dCiGdsAdTU1kglM4BpqQAzf6QgG4U1mhJwV1Fw4DZaQGhYY/A+2ohHgLuzM0DfigMVAU12B8R+IGNWzsVGYiHVALBn2k7gCqHCJpGxZhFp33fcgCz1SOIpBSPvWhIA6bS04ASinCGHziur+WfOVXzOzSEroWy993xQ/pWaubRw8OwlOlULKqHRqZd7fSBJ49LM7lEcia812jPeonZXPxFvXMpN5uMVLrO6Em7+6StrsavR1Xl88rhA1UJ+shCmgZYgRBeVg4ZLE1Vrp2fsVy3VO+1O0PP85//eufOx8vf1KqPvi588t7CV83y04e1H19b+bK7/9leLaqFfnzuwovhtuX9Vh2vludsDQ7gIJRS/2T+3INC/8tGYW4pcX6Q/qZUXlhNZjvR7WJTlqSbny5bpWFpu+F5vh7WVm/MftuouZ6fjOsPGxWg4wmlpshvHu/ag27957kFwylKyBvmmus3gGxobui4qqSUukNFknpDk4B+7vvHdufV3sl87nA0tHp7/mmt/kX5jRTO0LSfF08P9hZYmJsqh0eTGGwJ3r8595bqaoKdVm9nTINJST2/mo6no6qqekPTfDjo182e4x+V+o3gpAP7UjRXqYVH7neN9zkVPnzee8es9+8WZwXWGc5whjP8sCGK49fxwbW5u+2976IEjmmhJxtjPfit2dlH98bV1UIulRnIu4+qYtrm0vJUfCV1f69Uqfeiw9CFC9mNemNOTkwlwy/q7Uu5fFgvGZ4NbPdPPjulwA1L1WWgZY3V4krocD765vmZp//tCRCO6rc/XX+4feA43vMv9q5dm31p9R4+KN5Yz2+4nXtPSpcX8kW90zJHf71RW56aXclau8Mq74IuKzczybmIpCgDxxta/ghQ0MJyynSjX9WHVcN41NtM5sIXWPpsr9ZQh7cvL3zzvKyr6u1bi48eFr7dLQPRtch0MlZq9b6sjLXhK5enPy8XdE191WsCpmsBljfeZQ9/w7w4H7o0dOUnvfE4VSkH7dlwuug52XC079sEp3Kv3tZCinNauLWiyhc/WNzod77YOxkX+A/C2mquoA7E2zKgSNLNG7N3G9+1XkmF9JisyYri4RfaxtOqOUkZUuVUPhbORvSYroQ1WZF8SZKQfcDzJMel1re+ftUWmve3YC4enU2EYyEFMGxvs9GbCLZ+KDgrsN4NLTEVXVhl4iOlhwEHBSg0O8BBdwi0RiYwcgQpKgFhVSEgUcKyD7RrRcA42ANGhV1gsFMEjJYFyAqA1eoSqKMEWybsvy/OrACGLdY/JLApF/RD17AAPzcF6NPzBO5coUoJMOsdwOiYwLADYJtDwDW2CHoAhfO7020C0dWrwOrSeWDgArQGI2BgOUDPtABj4E4+aRkWUBlYQKHnAOWeBzT7AGJeXlMAphMm0LVcAo7qk9WLQEJ0jmj65PiI8EE1MQ7HEF14ojtPR+iNVGAuJUy8/MkKZ5MSsJjQgFwsTCBxE6dPqLjGq00kCdgdobuKrlwGYisXAFsLA23DAjRFA9ILqwQcGEcmXAJlmM9EdzWVA0KZPCBHE0C11QXaI3OyZEKkH6oKQfbfcP8VYJR3ALtVBTyRvSWrTJzfMzPAuZw4xXOAnp4BPFkFRpYN2O5hPGVnZBCwXCK2UriIidZOYbQmxqMpChDXVQJ6Mh07Y7B+GAhn1Gur+SfbhxXGfDYRn9M+a33X5+W1ZP7BTgVQJGlQHPMNazOZ7qPmrnHYvV/ea7PXfv/m/Lbbb/VG6tZgYSlZbHQvx7J9ufqi3rmWm5PC5ZF7SsCOmDACXNUF9tudmbje7ZuWdsSsLigpjKH57L8/OXdltjMVqtV7W08OFlcy1ZjycrO6tJiuxZSNYiM/FU/Phrd6rb12v9ZTfrR27mlv59S9k5Du5NIL8UHN3LE8s3LKY7oMrE8pf6Bf/Lou7w0GfTb+5NLa3242P+/tfXJj+cHjg7u1ws1bM8PiqFzpDk17t3Zo6Lo4n/yqUgLWF9L37RJgehZQGbl6wG4/6TWO5MigSMrXNQuYUlPQyOqxPm0CQ77eyPzw+uzL+ydLqPX35quyNWGttJCydn5aTigNY1ju9YGQIudisYweUUwqpU61fkoREwlr69dnvjwoetb4yOuasn4l8/l3qK7ez8ypI2Wn3O4OTOOIfkpGno5GUrFwIh7Sw6qsSabr1DtGadQe2v+AqkiTldvz6XjULZv1hlUqIWaVAeI55VZssdTgZaPztlV8n3BWYJ3hDGc4ww8bXcv4xiquXE7Pawl8Wr6x0a07rX9AJ78X6MSv5fOv7lcAVZG9/ZFpnFIqbT4szS6m7aje7RkztVA0rj3fa9y5uvRZZ/dJvfvRwvI+W68nHhre+FF5YPYBz/eXzmWfPC7tNbuKKgs5tqQco+KKzw4S2djSlZn9Uutgt5lfmJJSkf1CK5eNq9OxSrsfGalX1/NP29WR6/7ty9bPLp1/1N06sV0J6ecr/oFxv3hynuokXN8tGs+WEtr19M3/Umg86r760fmF+zvm3ebezWuzxc3ew0pFDckffLTYKQ/2Cy1AkeWrN+cet2vC3EtLKjQADNcGXnZ7H+YjpnvKhmf0q58Ne8BgJANJdey5P7GDqmAtnM8WtxqAJLF2c34Q8e+XxhqsaDR04XL+Wa9xr3fAEc36yKZjmGNnUp25K4nFWFL1JMdwkCRFkZ0Qz5q1z8uH6rpULJxbjdxvvKMjT5akDyOLD47kXiuyvJRKZvWIJikS+OBKnjl0W+1Rpd8fBZ2bC6lUPhOLxLShZL/s1d9Sb6XD+sKssWNucpqFqu25z3q7qq789Nzar3bezVZ+H3BWYL0bhu14WoSg7WXouEB3NABaQ4MgPdByfQ65KxlIhDQgFdUBq90E7HYdsFsi6K0FDGsm0G8ftnF5Th9QoyVAy2wTiIGm8gvAbDJK0KUoKApBQgj+rNzuAXMLq4DZOADsZhWwOx3A7lcAy/QAoy8BnitMyYscGp07BCZPwvg7urwOEIsAljsAuoYLtEYWUB9aQGVoEzS4lbseUO0CNPsSIKb4hTNc3xBUkwNE1C4QC6nAnQvXmXQjxhKA0+swoYtAjU8R+KRHFRWYienAuZRYlUvw/bmYApxLRYDpeBRwOhUmiYFHGCxBmAkeKLy4RsBdtV0ZKDaak5MrDMnyCRNYnp6frE3A1iMwbswUGizhoRXO5oGD7gCo9g7VrKpw3hJeXMKTvd8FjINdYLDxEBjuvgKMWhNwDRtQRFtlWpilzQPhhXNAeOE8EJ47B4RnFoFkZpoJ6WhaQHtkEWi2hPpKmLTZgtWTJCCsyMDI1ggsed4SW3aG7xt82Om1dnh3DM7rUCRppzzmY6LO+KFwY3Hm1a/fSGkcFFrr12cfWlal1n1vYfFurfDNs/LVq/mn7epXxcafXFh/1D+ZcFwymqqccDxvr9++kM/tVTt91QYavcFH7y28uLcP1EYnn769xoDn1fxqptroVYvtpei0qTv1Rn8ulDJj4fbIqG4Nz6+kt3otH+k3r7o3V/In5gp/kk8fGPdP3YsZPb4YjsQUGra3O+r1HQtwfLth3/uL5Vv/aa+z0S++f27+wa70sHWwcm4qXtEPWr0vSgVg7nICCcNxPq+NeSZdU592x5sWIqSh42a0i2X3wYntxpTk35RNIKGF75cagOaO50knJeZ+vS3L0q1PV1zfK3V791s1cW4lmavX5jeM1meVcZGkqcp0KpqM6Z7vG5ZTqvWc4C+33O2Vu28zfF+eSQ1S1tPWu+uVO5mlbx6OmbNkWL+azO1vNWr77Rrt1xdWJel8NpHNx5WoUreGz7ZrotwOKcrtpXkn4T48Lef0w+XEw9477Ccc392wNm/Nnvv24N2BBL9z/DDsUM9whjOc4Qz/k7CWzAqFNVCvBM/j1jGd9Qfrc3ND9/barB4aV2Bbjw9uL88Bjx8Uz2fSnu+bVVcU67/YqF6OL5/Yiunal3PjGf/cbBR4VqstL2WAA99QVQXYKzXXPlo98cVevR/vmMLQZH+jdjWRAcrlzrIXVySpNzKNkjcVCgOG41SbuiYfizicjpxCwgH/Ipd9P3J3WvpF1PvFkvI3f5h4/NPM9OR/D8xv/2I5BWz2S++tqJqs7PbajanBjbVx20251yt3e63hITt15XzuiMXAuE66V3d05dhUe1xNNY3zbcsCzoUXLccDep3xF4+G63mef3+39GDvoNYeE4xTqei5WzNfNktiu1fO5W/cmPEXve1w84FbfuQdbKh1d9E9fy39wbW5xVzy1B2fjO/2lbl9vV0avKMNU2BvZzwxlwzr6bb26Jtiu2NIEjeXZu7Mzd2IpC9JiTU7ciOc/iCT/2hxPh+J7Ww1Hn1dKD9szvcjn+QX8/G45bpPdmovHjXfD83HXwvK3Bi920kE8HwvFPut1PH/y3DGYL0bjueN7HGCN0ELmPirEE6ygtQVju0iHzCmqQTqq2QkDFjNEuAZQwJD7TFX5AF43mHfsm16gDMYAU63TcB7We06kEnlgWT3kA4Z2h5B92Kh0weSs1kgtnoVcPsdwB0NAM+0AM9tAsOWDziWBIxaDqCEG4Ac3gXkSIQgLE802SWX1wkEPeLeIZgzwecNbI+gW1D0GtsugCN+OhIgzG6EDbLwo9/rOMBMtA+kIw1g/fxlQFJVwGrVYUwLEdBaguWL6SFgJh4BDMcF0uHDEzQdDQErUwkgE48AndIRWZuqAUTjBOK2UG4eCM8sASM5BGxXG8BeZ0jA94iTOzhiV3hudolAvSSkcmL9457ETB4Y2C5Q6w+B2tAkiKcUfFhEUwnUUTg24PTagHFQBDovC0Btxwc6QwUQqfWJ8AGQnSkBqfUtIL62D9hrNcA1BgRXUjSZBZoDAxjaNoGerGM4kxPn+gCaLAG2JhNobMOaAkTss/vD7wUyanSXDiBBozl+lg/ah6VDLhN78bcvXMttH3Sv/dnV+xtjJqO305EkPN+f9iNbtAq17o3L0w96VR9pt4oWV+zjmTlzKeVxFeB+uzQ9Fa+1B15Gkors19t3frT0/Dc7wNZwOHdhprxxjMkov6xc/7OrDzfKwMv7hff+YOnB3sGrrfqHHy5+US40usNbs7NfWPvATqv3p9OrDye+DNC1Q6fudViqj47MY7q+EePvrid++rg37rw7MB+8n731TaO12S//dH31ly+bfcu8R+FHN5ZfvKwPzGN12+J08pl5yANF1ZAwPd8fDGYilxei7QNzOyTrOX35bkU9GLWBsKJ9WxwASU1/FVir+29201hfmy4og8eVCrCcn9Kn5W/bxdetOA3XeSZs63XOXU7Pa4lWw9wttyY+HYokXVuf6Wiju52TDGUuql+bSQ0s90G5ffTcTUdijeI4/u9qLPfoVRE4l0tFmv7O3x/38igflmvhkHLpUt5LqY8L1YffFFRV/uS9xa9rZdt1n27XLi5lN5S6caS/NSqHRnwnE6ziqKEqSUG0f59xxmCd4QxnOMPvNaSgVNBV1bLHj1XvSApVJhVzg/CW7pGUlfJee2U6DTx/fpDQdaBXHa9rp9O9Ej3JRRXtaiykAabrzC7HgBf1xo2bi8D9Ynnl8gwwHFndlDZ3YebkKDuHGTW9V11B9Lx8eJCJRoBvXx7cSI+/8vVeL6VFJwt/2xjE1dTre93zphXpGLfk+875yOED3sdf+P/Ye88mObLzavCkzyzvXXu0ARpuYIbjaURSr7QbIUVo9yfs/5O0EVLsvu9SGlKiMBgMzKCBhmlvynuX3u2Hm1mm0Q2AI1HEMOp8aBSqKs3NrKp88txzzhP0NE/PB4e/XMsCcIFv2ifunHvrcl7kPQV7KiwpMaM/kZAZnGCtHjY7//eJezq4+k218A9HZlX1Ktc1abkpqwAuR9KOP6lnO+cXDTdvzz/Xmy1ZAXB7M38stp93awB4lv5iMf2X66m/2Ij98nL81+vpT+ZTJKgFwNGgc6998pKq0cvU3Gb48vXkwmYES/hOOd3pTSU4SBz7q40kH2u80nZOnf1L81pYGBemaSFIHsxHI8+flwBkY6Hhdrd01AIQiwZuLWQWHTpaGcZr8rzuXk/Gbm3kJZ7df1Y5/P3posJvzmUsy9l6VFxzIhFBALBz2vpIzE/uQ4wPnTv2N0FTlMj8CG7/fgS7+CcHQ1M8y8AnSOiJ3n9EpOLNLrM0fBaK6IpIPDehK3Si7CNrIDKgUBCAFFMAwCX9pwBACFIAaG58agjjRdKqwtkFAORHiqx5YNgAeroNgOmr8DPfrxbyAEKXb8OP5yb3RhSzC4AttQHoAxsA6dTnGBYAS5bhM2dWrw3A7HcAmPIQQJDnAYicBp/UkVgGQIhzAERFFz5rRY4Kx7gAZJ3ErAMA+UUipnLS/qGpmgAqfQV+3n08vwSfFrI177aJdNMj5BlhsDIhCb5/MDkROp8IiADm4mEAWrsB3yBJKEPi1SRh9ySlnbgICedUavcBlAYqgNOBBqCvOwAEhgKgWw78YH2RZQFkMnPwWTEiXCNr5iNxANVWF77+iUjWiH1S8DKrDPgaqTBhy0kfQMMAoPcI+8UBKLsOAJWyAQQUBkD+iAOwqLQBONYr+NnrZOtErxaJp+Arvchn1CRxaLYDXzJIProk1JoGNRodid3/sXRUneE/CV33vXuWlQ7wimIASCxG6mVPXrNzWL/z66sv/+c2gPBSHDvj7KWYKAKwLGc9Fv++Vi21h5c2Ewf9NoCHxUE0JajWuOxo6f3Pl9d+s9ME8LBV+mR94elu9WG7cnk5dXjUPHDk5bXU6V6z2Za7LH3zr67tfP3K9n2FXFRC3avtmpXeyk+yB7W2YVgfRXP3lCIAt+NNrnU0/QYz1zN3/Y1qVWUpKe7ozlQbwd+0mmH2+u1INMm0AJkCVTbnv61PJXk29dJ8YLOoKABeKnvrifnddh9AR1e/1U+kPLceSnRNraL0bWWqMApQAUyjrCiT/70SXvh61ytxtM6YK9LOcxXcvDv/TdUjiu5eL9zrHANgafrnl1KnRnHf3MX0QskM+3losdp2tn2r49DQh8aF5NByLJxKqs8H+6Nnuqb8ycLcqJPjqOtfRgp1nD6ApWD4ld4BsLGSaT88ed0bGx412WiVugDEIH/389XXtU61S0LSAAAgAElEQVSrPqCbQ5IZe1LsbKxntuim7Tjf71QvX0u97nrHIYAwsXO+E2vB+a9L52i/PjTMfkBnmGGGGX70WAhFv4gv3eYL15D9LLz4cXLujBTpLbCt8QW+kPPInrZrMBMV9uPdcvqnq9mfrr08nmI+WF8zJPm36xna4yE6qr4uLZzZ1vZw/+NCkjx+adYX0lHTtkucXMhFZU0vcvrSRgaAZTmPd8viR4Urf33tyi8ub/7VtWJnSnaTlDyKqLjvVV27pdaIxPr9UXMjND/eaKff06+k+bkzOzOw9H9r1/+hYf9DQ/z7hnC/2zhDH7lwE37Qgu060bhKTcwqqpb5vFsryr03U/JP2iZDXXh5LUjJJ8c6qVouRRI7p94h5RhGls/K/G9+PFFdXfOqq2xI+vgS91ze6ZkK3oDhWM/7B0326It16UYmftFuEFxOxZhI41Q5G0l6ahR5/wOg+TmuvD+oxqFX33S/L8q98/2Zmmy8+M3LUF3OZ2MkM/bT5TkAO7v1TzIF8h5JHvNkJ+33mh/kabb6Q7wcfwLMGKx3Q+J5AePGcxzDAghFQwCCAgcgpBkAiE6LfGd4hoEf0u0YOgCKECeBMPx4JBLORIgHITEA4Fg2AEbkAQiJBHzhEUWzAByLGNAAICxw8JPiu5oJYGg5AOoqSVcfwvckXi1cAhChaYya0AkiADZ0CEBvtjA2qXEYSZRcF4BjGfCjmIi4JxhNAYiKAnwtGiGNQhwDICVZAHqhMaPW1Vz4jfM0cxxVJbAAEOTHcs6hacEXDIWkKPwuh5YvwHQnHG00HPgpTQxNA9AsklpOst1FABLtAlD6ndHOE40URdEAKI4DQItjkZlLMwB6HttkAmgqNoCu7sK3QJIZf5FV4MvsBI4BEEtmAViaCoDheACyrsNPk1IsC4BqOfDFaoQ9IieOGFET0QT8roUsSecK0AA4Yix1XQCa6wCw4ALgXQ5AqMMCCNYGAMRMHQDfqQMQei34zkRCOpL9JMwZ+UsuCIRKDLAMgJjIAUhIPIBkUITffmCGDx/zfLS5q9WdKad9KhRYuhR/0D513tUkh+fHFwImweIAAPYqrU8+X3z170ejl05K5/i2arJ3gSc5BQAG3fFlstpzztzFO67b4UqLsdRJdzgwdSnKZcxQvTukwphnosVS7xVrfvLTlee/P3RdNFvDZusCObM/qFZHns9Hir0+AKpPj7by+Fj/aDG/L3uMyNN292mb+zh5ezGkNYxDY5rNugh5cfUfJ8LoT5XG3bnVh6XWOxd83ez9en31TSslgCuhxa2i1vczM2OaVPJjCeYi4YYzRcxc2cyNIhUuFRIP+qcAIgI/nzEP5SYACtSXmXhashz0afCAWJHZB62u4zoA9ocVMPjFxtJJwznonGMnXI6GEWgMzXOORs9UPi4U7p00AZSVPkOzjuOYfkQ7RbkAwiFhcDAudq7emBseV5TuMHt5oa26lWIbQK82SAlcKCoMZf3gQSm9Hmr0hnsvapGC0Nf0V0eN+Y1oUe4B2Gn1PlnLHMtvszRSoBaY5XuNtyXUfziYMVgzzDDDDD9uVJpD541MjfZQe7JVuexk1qPJty/OSuMLwdNabXXVM9N9d1La/GpZELkLlsPCaqrkpz66vkjrqNIVfH3Mdr2TFM562YamlkoouaAEoK4O3YyTTQTbiloRtI31rGnZ/3FcXPhiPjd/IfVCUVRLG9cEWclTCL0+ad5MeCSWbJhPT6zr4UssNWbyHrY6f3+sPqjPufadFHenIF7LiUthNka/wTaF2OictPl962zWbjT0vsLq3x92NsNLo/x6AGkhuilt/Ntur+OnUXyUyE3Gw6b9gRAsLiS2ZI9UYyhqGNZI/sLtRbGoNgEsBAN/s+iY1OOytlXVjsraTlnbcpnHvyq0v8qMT/rLwbEqFX+xEU0HxMn1ryUiTLTRNS/olQ3wojf1aNj2YiYCoOPPM4aiAQA0TdN+Y3iOZ/f/v4eH3+3Udstb//Rt6evv5pe8fWietC9n4wB0zVwJhgEoqnk1ngbgAovcWCHHm7G3HFKaoq9IG/feaBz0wWLGYL0b5rCnlI/hM1iTYhc+EAKQjYQBWG4APq9DvlICx8JPk2ICQQB8ModRIrwUBCAQ8kPuwxfxkKgn8ioJBCduPnLHZmkKfG4sJvIYmcJMAz5BYjkGANsdwJfdbOYWAERvSRg1y4slAeiVU/jmNZc0pAsE4DNnvuwJ8Hk4iaYAJEMSAKJLS1kWfC0ayZQntjgSFE5Mcz3vrwVgOJE+T8xrEZ6Fz4TppE2eZgBIh0MA4Hq/2s6EiM02DAAhojdiaADWRD8+opfSWg34LR3JznsaNwrwCUWaYeETe6RDH9kBn21y4Qd3eUvBBhDiTQBRUQUQEjiMMtAJEwYXgKlo/hnzotHIR8LjomwXQN+wADRlDcByMgZALKwACCyuAojUqgDmejUAdpUD0HBpwAvDlkABYGhCrLqjMTqqAl+uZ8kDAOF0AUBE4AEoojUai9fBkKbgt8tMBAT4yWGZSBAA9HclM87wweOg3Kar9Bebi48G5Ys6Ej4b1sIBgSQ12I6za3cvr2V29+qui29PSun10GYoUnpV73emPg9rHxVOHdXpeQUHy3kXWstxVsLxV90GAMd181z2zX7MJbWdyUSkbuyw0y/KvUQ8sC4ld0utLar+6d3550/Kz09rDEvf+umSUhqSsM1JbH6xdP90LPqh6XF5pNZsVqBJISIb5r/stAvh7I1ccOj2T5SG7ToAdNt+0ByxcRQQY+h4nBcDDB3m2IFpabZd17Q3O+gBgEud8+R50Czrtzu9fDh/JRNyHVfWne+PW5ZbHyU4BDm+fTo1KcZMT5GxadaseYzR9bXsg+EpgE/nU6+GewBiPH8t3qzp5/A9fasL6tHfLd38pxOZcE6O674cHMdTgZv8/P2TjmyYHM3EE+qJ/DYm71SrURBcUACSaemo2j1st5dToXpzyKYEAL2+ev3u4v6DQwCmYd345a3v/+E/vOPkuIHA+ArSOfEOeHWvhQAAKG1v0+XqkBI9Tv3eSeOn6/OvBme7jAOIcsGQmfvtwdheKjDsp+Gzc9AfFGYF1gwzzDDDnzMcx3m0XVnMxnphta6eQ1cMDX1jNXmw01F1EkJrvnLbd+7Mv3heMQ270Rs2ekMmSq+s56KCwFBwXLQ17XFtSg/ucuPKI0GPiZ/vi4NQktPeaJ5T1/rRsHVbzD+ptNqaIjPG7SuFJ68q96rF1esJvu2eFDuPjssAVj7OpiUJmuPYNsOzA9qarK4A2O6YvTup9z65Nj/ZgbE8UMoDBYDIxBdjoVSIF1iKYRyHsnVHV2y1bQw122xq776dYClGUf+waZ/KQKkMzpFJAbgp5R4fTWm6W/XxfOjCfPxZbVw8dTmvHHGFPhQA+GWeLmlvm00ra1t/s7j598fjcfVMpWfuZLNiiBUlhnlTd3UGQ1NbiqdJX+ei0Sdx7bmlWL053Km3YvFAv6MoAZaTeFM1ABwW+7f/z582d04t3YzkEr0JbVa30kNaAtBtyqnrsWZfPjhuSQusalqV1mDDl7o7rvv42Li6kD2Sx4UUTVFXQssvS9qOPC61F4LRYJ//7kUJf/f2QfwpMSuw3g2z11ZPdgG4jgWAYsbyHRKkRNrkcaEIACEQAsDwAvy+6C7HAeCjCfjR4Vw0AcDKLQCwhn0AtjqEr3Yijj/Pb8gJGEVAAQAsRQaQTGQADDQDgGJa8KkXXbEADAzSeM4AoFl9+O3nLmfiANJ3fgaAi6cBaJkDAEarCj+jy9OKBSMAGNL+j+Phs25k6yEpgJHCzLbh0ye2ocMnVChaAMCIcQC0IAFoDxUALVmF35KP7Dk8VRYDn8eyyFhMCwAnTPuoSdy8bQGwDQ2AwBFjIzvaGWJ4JPZDx9slGxgRSh6FNX4MYMwzTaT8uQBAPExk9oOlXQBtzQbQVk0ASVUHEBEF+F0FCYtG1GASzwIIC+O/mu0AUC0XgGa5AFqKDuCk3QOwunoVgDXswreOUtxTANJeGUC+6gLQNAoAYeVDEQeAEBMB0ALxIQK+eI4oz8idIbFnktt60iKTyHIFIhYUefiKq5jEA9CaVQBG+8fRj2IGlqZv5XISxbqWS9GUSTuH/W5Lnrqun9R6eSucjVM19RxV0+N2eWE5OjeM7JXaADTLulcrpleCV4Pxw91mf6DZjrNXvVB7xLHM8XCsVZJ7Y6V2S9VuB5aeTQRTjdAzlT4OfrF26d/3W7pt3R+c3LlZONnr77faNEXd/XiuftBttuXDevvw4rFLIveqNVUoPNqufLy6sG1VFWuqqtNse6fV2zlnEMGYwGeCYizAB3iGZRybsnRHUxxNsXTdMVmaCTFSmkuWOtY35caby/8A3E3OPd6aqq7mo5Hyi/ExTGSD8LXckaCw128CWIyGjpUigKuxaFnbGr15RYrdDFm2y7Rs4dtOw/GV+CXt5VeZu7+vT41ZtjSKQr8TTghLTKBT1d5mx5uLiKTAOhl271ya2z6oP2lWC6lwrTkorMUHD9WDk+bGlyvN+8fqUBv21a3nKsCCYus1dZICLFzJt1vehsivr2u72WDoqNsFkHSDgHcSB7qxfcJ9PL8BVnPhcq6439S/Lk/J2u8k5052e3W1O5nL+gFiVmDNMMMMM/y4wcvYfVSdfIZjmc82C6/VdkcdzwFVWoNVMVHD+bLx02GPQu/ujXmzZ78+abpAYyg3hjIfZzbXc5LDNGvDaq3nntV6geOZ9Y9y35XHrNJ+uZtYlNr+FPPzkiwlpvIaRnDhvpT3P1+f26+4lYHyuFVO5gM36dzWbvW7SokN0rcuzal19ejk/L4oFEOtX89+Uzk7o7S1X40GxWuFHCdSDuVN3NOgJ3u0U4BNuaZrK7bZNpS9zsBpv6mv4gHe21P8l0l/slLoaOdsWbMYiHQwnkvdGYxLisVctKENAVxKBV4qAHA5irLm7e2vkynW/lo3XQBR4G8zn/xjfXzSY2LFH4KHnBhz5PizbgdAmOc+WdxoO62yen71LE5YkWRRp2lasyxxQeR7yk6t8/FXi/vfnO4c1FfuzKfb6snzs92pPTCUExNJl0aGpRXNm6oOCV6Ye7HSw4SjZmiYvz0Y3d1NafNpivosuvB4q/KhZ4wCmBVY7wOr11JPCYPlwPfZ0SQKnHBXHv+UAsCRe6ZwFAArBgBYLgXAYgQAbpiHH7wUYBgAlGsDsFQVgKUOAdiKDJ9+cAxttF2iRrKG4w59C4kIfFmP7emfVAA1xQLQM0gzLAe+8omEkq+lIgDWN+8AEFJ5AHq9BMAadOB7FckYieeRDRAnIwOfNCJ/HV0DYA5JYlYLgNlrwxcAubYJgGL50VEi7fkWMnMALq/MwW+W11d1+JIgYgn0k8YcAILvkXZIizSXWBFdAM6koISQhZONFCdeJVQiiJXS464wWg95J5GUCd5fkghFGkSSwwv4IfWy4QKQDRt+Rz+i3yK/Q2T+ICTy/k55J4j8sBPXXkez4AvR+roF4LQ7HG194aMvATBSCL5oL7C4AyBWLcFvK+mYFgCa5wBwEdL9MAWAEYOj8ZI8LUsZAogFx0LjkDA+MoT5I75LytAAyKcHAPRmGX4jyxk+fFjW2arHtOxnz8rZVDiY4YnDjmC/1F66EjsenE9auMDDdhFAfiO8IsTbDfWw2jVs+2mtCgA0IsvCfDQSZgTagWu5ACieqmjDyeqKbP1mMH9P94LCq7L6i+zSS2vnov3fHZSCMfHnqYV/O6y3NKUF5cb1nNG0j6rdh5USgLmrkcVAxBhazcawN1At20nGgplcuAb1zeqKoCdrW7vVc186F0FGKKTDsYhIC1TLVg8GLeuP04tTYNi0FtrVpgoalqaL++MiMhIWK/J4MlcQGWgAwDLeLlmu92aGYgLuljERHqEZDz6N/erbrse0tY06TS06E3Uxp6ce1n26yDBJ2NWNzEo6jt3hqeFMCfUoevzf173mF9cWHz2rvKg3rl/PnD5vPjwub/4kr+x2D4stABu/2ggY7unTU6U/rvCWPlrQY8KLfe9cXLqee9T29s30j3CtIy9n40eDd6QvBDn+Cp15tO0xfzRFfZKbf/sif1rMCqwZZphhhj9P1JqDqC4lclJ7omVeno8cn9egdxIVeVCRB2CQ3wgvCTFtYO8V26Zl93X9Rf295sj2DjqJ7JjE+t1B7av1uZ3hBQwHIFvaK2v3s7Vco8PvtfrPOlWape7cnGuVlHJrUOr1S6RMFAERFDDE8Lj7Bzeki4jCcjQmMizrUK4D13UpmnJoGK7d1tXTWu+o2vXfKa3MxZgg9XrQ6F0c0fkDcEsqfP/6bJzmzWz29en4yXQqVDHGNYrNePWT6XeSGdpegXUtFDecJ2fWNseVgVF8lxVimb4fonE1vPz1zjlU3LN6B3Wkgumb+bBODY+Vmtcqx5kqEr5pn3y6ufjkZeV5vb5+OWZUrJeleighXNtYOnhc3jlsAGBzwez1XDQo2q47kPVXtR4G3pkKhoUWO67YevrkxzL89lbl+WBYbHPPm542KyIKl6jo9qMi/q+3LPQnxqzAejesYU+vnmLceI6Hr1JyibWNyHdYHgBD4u/cCHxWpkt4GqKXMkwAuuXZOuBzNhJHpDABAIlcEoAEB4DeaQAwex0AjibDZ4kIs0WSolYzefj0CRHW6I4KQB2OM6iI2kkxZfiJU2R/VpIxAOlreQB6pwmfRSMtEimGhc+WkceuY8NP8DJ7TQBGowyAHB+9XgRgtJsAbFUFQNEUADYUBsCn8/CNctrCGgCpsAwgninAdw6SI+NNq3vMtPcPcfwRNSs10U3Ci6cnLBHGKiti9iS7TVKvyAnyhuaRS87oJNKUCyDAswCCpBMfBwDEGmVOiLg8spBE+ZOPBEXB58B0coJMAwDLCwAupeMAQgIPP+K/OlABtDUTfkvHmqwDsJwugIFuAFhZvwUgvbAKQCnuA9ArJwCMdg1+i0lCN5IxEtspG0kAoEhvRNcBYOsqAF4KAIiHJADBiYNMGCy93wGgN2sA9EYZgNEsATBahME625N1hg8QHMuEJF7RTN2cYiB6A/Xm+tw3yoWVzQhBnkuIguU6XUVXbc+85lVaQGCevx5Oszqzd9Im39a3oydr15x0l9I8BhfUy7KTToXaxtuqogO5ygrMrzdW7h/1hob5sFVkA/SduUK/YRxWxlffP3R6KBkMrEcS3apcOujuu7WL3paQuPn5uBDlD4ed2kB+vl8HwDPMTy4tqLxBWtP8J3E7Ufj+2Tlh5bwxpZ3neBYTx9j2R2zDZ7B8nklkzhEhuRNHKMLF+6anRZuTEt8dXRjKAKApq/+6pwII8onlaDAqcb/dm6KxXeB+/+Tzm4vfP6/tdrqBCHdraf7FVuXbYjm4KFzNzmk15WS3Uar2SuidWXl6LmrlhSM/jn95MbndH9N4jva2s3opktDLTrnnTRemQsHkkNst1WcarBlmmGGGGf6IyEvBeNXRlL4AbGxk6qJZm2B3Dl43MZEuZE2rqCi4P1vJDKhWRWsargsgEsKyEE7xUcGVWkPnWb1t2a5iGo/aZQBChr0WzSpNc7LiORfbR43Pri3c63oThU1ZXYxkaUpx3pRxTcBy7WeDvblcME0Xfn/UsBznQasIGpevpuJu4OV+UzPOaSbzFnyem3/5tPLMGs8kijy7kU2KNEuZrguXoimbQdfQD6rtnd06AJqibq9llaDzutEwbJtMNV7OpbkU/bzzw8usxXDscOf8g1avTiVZ0NNl07hg8v+l/XAvwzk3zjIMn+sKM3nAbzimx4fGu1NSAciGOWqz8ya+aZ2sXU4wbeqo1r9XK2bXQptibG+n/t1xCUB8MzyfiAbAwHBsy6EYiuFpGc52sebUx8YLMSNM9sXpD3VcUCxdj2dPd3qa3zQpKgqRDl2s/wha5cwKrHfD1hSjSz6UFABGFAGPJmFECX7SlZfYRDHw++h1NR0AaefZHKoAWl5DOgt+YzvyfZFYGn6IdiEsAViIRwDEYin4jJHVb8MPNzK7LgCLxJSrCoC1xVX430NCiqimA0CziPqKPE8EQ/po64TZmo+GAGTCEQCRZAa+LMnXfhGhkg0/hYv4HEmDP0KoaJVjAMrJIQCl3ASgd034jkI+xACQ8kUAgXYdgC33MG30kzIFAGJAAGBaDgCapjD5y0LkWTQDwKWc0enwktnpcZtIl4jkOAEALRCHnQSA1jUA3o87ue9xHfg8kK1p8Js8hon7j6cBBLixxI3kuTM0yaAC/HaQAZ4DYAx6APRGBb5UjkALhAFEUlkAibkMgEirB+C0OwBQG+qjj8TAUADUZR3AcWcIIB+WAMwtXAWQu/4JAKVeBmC0avADzIj5lIzFp1GDGJGOxHGpawBYUQIgcePnCXdldlsAjG4DgNmpAzDa48egP+ikmRkAtKv9cNhjPI536pF4MD0fbPQ8rmIo64EMrxjeG6rGWDUc5rmPlvlXg7OB42190Na9ty0UhBUp35eZ7ysdy3F023rcLlE07t6cq5/Ktc7bGJFH25Uvri2OaqzHldav1lefn5dvfgZdU+5i96v1uWqb2Wv1AbzuNQFIee5aNM3pzEm51x68O1jhs/z81sNxaRUPBdbD0aNn1aO9c5RbhXigsJGqWepxo7uzW6NofHK1sG94fsyjapeq4rMri8/12lv6+l0EhqJCA6Gmn3O4woJQr0zHrE+H7zN+DcXT3sRfiI1ptgLgpdydi4i2O55PpEA/U6RRgXU4EEiBdT2y8i+vveoqwPG3QvlOWy01+gAVDYq5dIiS3Of9umK+m54EsNdvUyxuXM9RferVSbM2GIpp9nqm4A6dw4Pms5O3qd9Ylt68Vbg/LZ5zHRfn9XZaDsVrh/KouqKAdT7xsv5eLQv/5Jgluc8wwwwz/Fmh35FXI1OJ2CSbA0A6Fiz61T8F9+6KtDt4x+yhYunbg6NTZ39zyfpqyQt5d4GHrVI7pq7PvSMm/tF25Yv40ui/X+81r4TfV5i8OywpQvHXGylyVwBAtczHrfK3w9NKpJ+9Erx9M7++cOEOpIPBF4/H7YPWcknhVHv17YmmTNUQ5F4OQL+jvPr2pPOocSeWiock18H28zJTtK9mMqNRP3lVibalS+F3NPh7E58kFvbP6zUEYD4SPkPq2faZAstXSrjecRAoL/1ct02W/WjqzdxXe7LH7mSEhSftDoAkH35y4rFHtxP5WFt69Lx8UO7opq2bVr073NqtPt2qSVXu89hSlL9QFXA1HVuNh0lDRhfY6lSf2pX85dCdqwVeYB6Wy4/6VTWP5duZj+7Or69lwqGp7PhwSLx6NZ+7Fr//hjUhHDpnowlBkk/NvjwuZz/OF16+HFdXd5YKF+3qh4AZg/VuuJbl6ON+gi5PLK8U/C6BNC9gnIwVAmA4LoCOrMGP6q4MNQB1xYAfpKSYLvywJYmlAKR0koruwqcZkvkU/Gx3oruy+i34mVUmxwOwlAF8Vmn90iZ8JRMxuGm2DoDIFck9QFcnEd4mAJpSATgO6RVoAYhpOnxKhoiKSEy5II0//Rbbx8iCN2FVMzp9AHLVANDr0AAMiwYg8i6AGMmIc1z4GfGEWGIECX7alpBIAxB5frRX42Aqwk4RJyAJUyZaK5oZHSKKdoER5WYBcIwAfI7Hz3N34OuTyEmcTNUKCiKAiMABiAkMgI44Jhq9zn0cBV+nRZLco0ERgHJ8Cp/MI8Seq2sAKF4AoMXT8CVoy0vr8D2DrtsFoFg2gJZiASgNLQB0VwcQaikAMoE+gLmwCGAhGgIwt3INQJhyAOjdFkaZ9aY5OhqEwwPp+OsQrs4CQDlj3o5YQYlOy9FI00kFvuCPkKOY6t4xw48Djjnu3xwJCRVf5L40Hy12vKvvLy5lX/TPOvsWg8HlkEhRlOG4JVk7lZURi1zX+nX0f3l55d7+gHT/HBp6MzAMS8JAfRuj8+h5+fNrS990jwE4rrt1Ys7nI3XtbLz7Wjhsu25d0+WJ/CrbdZ4N9q4sxC058aw2VaCcDLon6AK4tJlImoGtvbOTd+lA4NjxGCOaotiGoQy8/eRY5uqlzOCg1Sl2Dd3KLCdiC4m2bR2X2gD2tirJbDi6ED+qd2RFd152Ll9Ovm569E+zJ8cdabEQOxm+7yzVQii6/fJCc0CIPVtbGMZ05r7/P8P0OJGhNU41+F9t65eJX7jWf7B02KZv/HNjPAtZHKaADoCQnWurDQAfJ+e3nzfebKzkrVYzHm+Xo0Hxk9X0g9ZUDbQcD0djw6p2BBZrC9KcmNYV+nRgFvvy0bBzhA6XYK5fyrI6s3/c2q77yq0oAmkuIUkuYNpOXZarvXPIJ5ama8w54rzLocxjZarDptoYf9IkgWts/9fEkv2RMGOwZphhhhn+7DAh/s0XPDaLpqhTy6OvFqOhPf1gcomfZZP/27ySD23reKS5Dx3qUT60/ev57t8uJARmPHmz3T+8u8KPxMVVZbi+lnjn7jzeLn+RWCSPO5puDxM8ffb2/npCyQSff5atr0bCZ14qq50GffiXG0n2PJnOQb/9nVq8c7Nw5kVuYrfXcsny4bg+W6SYnf/3RWWnpim6Y9vV/car376u//v+zUycYWgArdpAe9XLx8MAVM3s7g0TgXHocWegmiU7Ib5vN/SoLJ0xH0yCtc+OSpnm2EiCNIBKz5sKfNwc8rRXlqm2+c+N9gP57j+3l/650RlxX3PiNUJfXYssPyj61dWzOqmurmUynyQKi2ow2xXyffFOMPtpYT7A8wB6svZ0q/Z5dGlytxISV9W80q1vqS+HJwfOkRks3b5E/Xo9vZaMmI79pF3+Tj6Vs8aVG6lbl3NBkQegGGax1y/1+vXh8Ny+4wLH3LiePbdaHXamjkM6FDw8HmvIruXSvfb5KfkfCGYM1vuA8v10HHzdFUmHYiMxAGw0Bd/TJ0STAIrtHk5qLvoAACAASURBVEbqK0UH0NJM+NxVVyPOvnE8ks4SiQ8FIC6YAGTDgt/ZkBAtJNqbiHuI+oqA5E555jiOA7CaXQKgEKWXTbZCtF8OfFceCWGSTRt+r0COoTFqlmfa8CkW8iNFQsmjgQAANhQBwARC8Hk7QpZQEz9nlk0B0C0aPhcl9F0AIgl86rUxUpUNuvC1ZawUhG8YZOjpCXlqrLgCRdyCNAC/1ejYeEhsj7RtYaS+EgIAGEHDKB/LsgBP1+WxO6YBQJLC8HmpmMACiIsk48qBz2DFRRpAXCT9+0QA9rAPQG+UAGjlQwB69QSANRzA55PYaBx+shRhm3KXbwEwEmEAfcMEUFdMAD3NATDQyYmzARwJFoBMXwew1FcBLA8UAEvxEIBCIgu/VQA5jJ670OOxePj9FsmBJcMgPJbH/03m2nsXzsnHM/z4YEw0aKbCNGQAuHYp89Dv8raSpV4NvMs2Q1N/uxCpaI9JWOUk+manj85fz6/8rsJ3fRXX3rD81fLGv/ldikvmWS7qXDx6VvnsxsL99imAF43uLy5deqlO8Wf/WqZ/kV+q6cebse7RkLWdqZ1x4W4N9r9cX9g6MTraOYTZN63jL24sPprw6J30uhSNCbbaQzIeLD86Pz1r9/7BR3+5+Xi/CkAZ6htMqoIBgKGsfxSev6eMl2oPtVtzuW/x7gv87WThxdbbiBa1f3Y4zabMzNG2zzM1ewrJ4dxr9y4vhTrGsKnrKf5KWXs6XsSY2pMUX/h/ShrI5OCxCmAjmtp52XRcNyaJG1Ji+8kUM9QfaABiYenm5fkH1ZLjuo9flD/zeUcAhx1ZiFHuGw7OstopowMeH6+mI4hv1wa1ofq0XQHAZ5grkXTQEer1YbF5zoeEpqibG9kju3O/dXLukeGFKQ4oKggKxiI29o+SU/ZfiRmDNcMMM8zwZ4VoIrBT8270Y9HAdrMBgAKGonch/2Q+9WpwOnr/3yxEy9rTN6+dI1S1w1/k7clnZGrMBp0MuvGw9MZC5+Dpdv1GPEse//agfi2yMvlq3zS/rvBp/o7rpOO8eN4K8GpwupDXYwJ/7qv3O6ebvkoMQEfVlhdT5HFP0Sj/hiESOn/l3iZ+83ou73F+u09KuYQX0vvyeZVnpu76nr6uLoSib1kVgCDH14/fVoQxNF2pni0+bMcphMc0Xr0jRzgBgAtqTvAEYf9eMwLs+fP3YTb2tBVTLZumKNHMdDQ9LkhyydRNOxGQUrKw/WxcXdE0FRC949kbqM8eFm+HsyLLAni8Xb6b8EROHVXPirE3tzXCqdLYVnboSO3nG6FbuQQAw7a3OtVvesf7Qitwibl8PXnnRv7u1cKdq4W71ws3bmakFebb4em5vZsIBPE83fsYH/od4IzBejdojiPKKmJJ42IJAFwyC4BPzwEQs/MAAtk5AOVOH0ClLwNoyBqAnmYCUEwHwGTeMvHhEjUR45nggFEHw4nIcu9TNBHa5KWlmwZ8aRFhjwifFA6EAVxKxQDo9ph6aaokeIk0oaMBiOw4OZ1sioQX6xZRg5F0dRuAQULSHRdAIp4a7QNhoQSS19VpAQj2FQCWaQJghy58HoTlSY9C0oYK8J2JhG5xLWP0mES0k4SwsyCHwqVwHr1CrhCeHouQjp6jkIevhaJJzjvxHpKfSzJ8m5B2LIAQzwGIihyAlGED4GgbfqvETIADkAmKANKRIAC9uA/AqJcAaJUTAGrxCIDR6cE3Y3LhIACr3x0NluzhpeufAOgoGoC6bACoyQ4AzXQBkImCAaE8jbEJ1JfAjq+IuWgIgBBLwPcMkhdplgXACCL81C5yEjkyu0HaAOgqfO8hQyhJURo9nuHHBYpC9EritOgJkgob8VK5BODGWva7bhFAgGMVtg6/Xvp5Nl3VHr5ztU3jlKHmbH+Kp6K1WSZq+R/EaFDoTHv6FmPRrBtgA8zBsFvzcyYdx6keyvm5MMnW+mavf2M5fayM2Z2Baf7T6flK8BFqWvf20vJvd3T3jeur47rHTCcZCbT6Xk3DJFkcAUCtO7xzs7D3tATg8LS1fjVffHG+E811HZFn/cdIBqVquw/AMKxcOHbSHc9kuUBeiJwOzwY+TeKjUO7R0dssbxvJ5MnpOfxWPhA67fVGG1oJx5+2qwCafe9nsKmpunGFY7dMZyq3IisuPmyEyooC4Fpw7Te7DQpYdhMvevWIIGQU8bTSAVBIRBbEUPFlfdBTKcq4sZ4Rs9L3pZpp2a9eVjfXM8+cpuU41RM5GOdl0wCQ5pKjWcIRErxgus7Aj9pyXOfVoAgKX64XhgPxadU7mx1d6+h/QLA+wZ7W4ljG9GZycNzthXh2JFBrGO+2kf5pMWOwZphhhhn+fHDli+XnfnW1tJh4XCkDEDi2RHs0yRfL8YbuPc6IIpjtt3BXI/A0H2DGN+S260T4MY00qkhGoCrWixeVrYdFumheTqVGz/dlPTaUCBWk2vZRjX07L3IuXgyOPp1Pn/tSR1dTi9JIIrZVra6ueu/scJYgePtppAKxXOTcNQRjwUnb2iSFQm69JsHab7uGxgVxe+cd/aZi1PmWPXo6LSHoem/bqrYWAt6I7jVaHWUzJXgkU4xPZYXb/7PIkepqIzT/270GgM8Tiy8O6xSwysZOSx0ANxfz5qv+y/vHg54KwHVxvFN//e/Hawimo0EAO7v1n6QLAJo95aNwjqx/MM3EXQ4G/vcFdSO+czWx+5dzvb9biuTEMZG5NyxXqYOv1oPzkR9uk6mr8o31zOi/pm0vL41No/u19uLG+R+DDwQzBuvdoAWRsFZEdcQlMgCE3CIAqbACIDi3AuC01QVQ6g3hRxl1NROAao2VTwGWAsDRAGATGgYAILIUgKjAAAjz46Z41ITwyAslf4N0IY5CQo2YrSoALZIAEF+9CuBSMgqApcj6dfjJWOQHiCTIk9gnEgFFtksYNSKBsCzCYNnws+nJXWyqsIQR/0RoIccCQDE0ADZYARDqqAAc2wXABXgAQjICP9ud0CSEZPKYLS+e6uKTMcHc+MZmZ7S4R28R4cKkTWaC0yJqJALvGY9Uc0cDJybKqMAD0AMOAImzAfA0BSAdFADko0EArKkBkJsVAEarCsBoVgFo1SYAtakCsE0XAB8koV+kRSMLvxkAF0sBWEpkAdSHGoCmasHXYJn2uBOiMdEJcWDY8PsYDjQDQFAwALBBCQAXCI3GSE6WrJvwjaKEmGQZGkBYFAHw0SR8ryUhJm2VUKQmALwt52iGDwhigF+8m//22Itd4DlGjbp22wVw7Ur6m/YJgPVE5KU81rZ/meXL2rtVRBQoxdgYWGNuKc6HXk06B6e5pLgkNkve56Y/1K0dZ3U9sd/yFj8od+5enf+mdwygPlRFJpSM2S1jOgjqXeC5CyubrU718+uLj59VALhAiZGT8WCrIx/W29fv5orflhzbPS62o7nQxlpm55t9TGQiBKJS8Ebu2M9TEERurz4edVM5S5m4zNtq081Q9pFRfssbJI493D1fntWdlm836gppfuOCovUo4C213etv93iJWUsK/ANFdf1uM8vBzJNj3XJxKZJ49qIO4NP8/LOHRQC3F/OH904d55w9Lx200vmIFhEGqv5yqzK/ESn2+nsHHSHJ6rb1rNZNZthRs8KFINMyvFK+b3X6Vmc9Lt6kr/2v0liHvjssBaPil/GF/zj+gXa/p0olFQ02/VA3e9r/UBP+sNTZ/2bMGKwZZphhhh83UvOxza+WmfXQw+Px5XzjVv6w3QGwko+TyUGWQjJhWK434bIYDNb0F+9ceYSLB5k79xtTM3dzYmbyv2dc/yI3xfQoqknXbWZiUv/Ji/JtX9xz0ht225GlwNQK37FLrNQYvi0P83775NaGx7u0ZEVYECMhAcDzYm3li4VASADQ66tPy63YT5Y2/+rq5i+vXPnZ+uZfX2M3M8cTaVWX7hQU3buEZ9LhxvCsWkhx33aBL56+bfYQwM10bjA8P+GiUu0RIRTBSb2b82+cHhSb66Gp/CfVtorKOFBjTkrulqihYQY43m3AsO2leOz10wqApXTs9EH53OqKoFHpb0YSAEzLLtAhAD1ZuxnLAVBM61IwN3onS9tnljUcrWc9+j+WQpNPypa2Z+z+xUaMPa+rzzuhWObcxAqf1WrLi2PX6ihN98PEjMF6NxgxQFgrNhQFwKcK8PvoBedXABw1OwBOOgMA1aEGn1owJj7EhJfiSG8+Lwqcgi/r4SY6EsZEDr6RjfBMRDzEBMIAmFAMAEuy3cmqiVqLdAn0+hU2AaiNMoDC3Ap8h2BcVgGoE25hQtSThnST3BXx7xhenhZxI9oASPgN+WuYFoDC0jrGSWBBAGw4DoBPH8NXZZGwJUIdsZEoACGVA8DF0gCYUAS+0c9jsyaNgWNM9B/0IuYxGviIvcI410qH7w30nIPuhAhsgs0iYWYeKeg4owMSEXn4tsqI7cBPa8yEJACFWASAWtwHYHotI4kpcgjAHBoA9KELwDYBwLFtAKw0BGC0GvA1W8RvSBoyLsfDALo6kcppAHiGxPG7AASWAhDi6dFj1lftjfbTtO3RsSDclWqYAGSdtMK0Ru8hEjfNsOAryYgN1lZlAI6uwKdIIb9XsvMMf0KUBgP7ZCov9Pr1wrflIgCBY7SoaQ0cAD+9lHkhj417H6dQ0i7MDqBA5cRLHT32daltuVP9VVJCZOt0il9R9an1VPqDjXysVBnLlcrV3kd384+rnhrJBY52uoXFSFnpAygP5I7CfLm69ko+9HoMXwCGojdDy9sltSq/LYPKBb5Tip9cWXjyqgJgt9VaWIxm63ytOXhyXEmvBNfZ1N73JddFpd6r1M8vgy7/ZOG70lg+FV8KHU7nrc+lIs86F+qK5oPRWultl/+4JB5fHI5lWc5qIjUOlAJWpGRV8Sq8/SoyyWhdP2fPNyOLjw7VgaEDuMFnv29WaYqKyGzTtGmaCvXR8TVM2Uwk3DNKLyvhZDB2a37Ht4XuPSnFLwc7A3Vnpy7NcaphOkP/59cc6zIrKi2e5xao6C8K0pWyOvUJeTE4+vnqpa93O+cmNbwd37WKt1bmXhzWAbiAEaOoEuXaf/B6/vsxY7BmmGGGGf6ssHYp/XTgXSyvbWaOBh0A85HgoX40es9CMFDRX765LE0xOWElxd0pDjb/8dj+XbVlTV8RV4JZuRdtKNrkk/IbQaOxubPKG0aZWo+im5GBIPi6LtW2f7PTpIf5m+HVtHDWmiexwmowfyO0zqtz/7LTrsrvVjc7rvvt4OTu9QK5iT3t9ZpR49qNAkWj0ZMfteqJj7NXPl2MJc9RCOUXY+s/XXpYr46qgatX808qU1p1hqKieeEt5UJODF30EsHlQPIi+oogykyZJTsTjfwqA6XZCs5JUyn2KSGyKW387nVvYJgAPksufr9TBfBxrnBw2ARwZzF/6s9I5rMxc7tWelkBMGjJtf/Yj0U8BZVl2auJBADTsC7HkwB2jlsSywHYrvU4P0BnqyfnxCkfKIHjOpej57hKnw8Ofr7+DtPluXCBMtML+lbH3Vbrxu25H7Ce/37MGKx3gxYkLpoCwEYTAIRMAYCUWwBQbPcBHLcHAE76CoC2ZsF36vEMBSDKMwDiEgcgIfIAwiIPnw5hiTyIGrsIyTNEBkSeZ6UAfLEOyXMnqixi+/JchCwLgKIY+IwRIVQ0XgSQSqQBxAIixtlagC/E4Qh3RdEYdTM0bQBDXQcAFQAMlaTP2wAGuglgoJkA+roBIB/NAIjfSgIQ0gUAWvUE07FPhEAiTkzCcnHxNHweiw2G4WeMkbgmmzTXG/WIIAwTyJrGTNWk4spLbyeGR+NsRrkvFJvQbDHM+NDRNPyEdxJhHxZ4+JQe2XBA4ABkPD9gG35iuzXowNcwEUaNYigALA94cV1geWr0vEukbCSOv98GoDWrABYSeQBDw4RPbcZFA4BiOfCFdBGBAZAJ8AASkgCf7CQEJDlKhLsiwYZEfdVT9dGJIyI8sn6iyiJTN/lYEn6SFlFiEYEdyj+8u+0M//1YWU7tuj1CM28upUnCEAV3JYudiWm1azGpY01N7KWFecPKPWoNv9E14KyVL8GH5sRstevc3+uM+twRhHjhzbaADyqlL+7Ob31fGjENDHfWcn9Y7V5fzW651RFrddIbnvSGAJUPFRISL3C0Zrl93TjuDY+gej9G7w0XuNc5vnotMyia9e6wr+kPtPLlG6mAwuzs1g5r7UMAQcwtJONBSaAZFzAdu9QdvB7IOPbIJ4rGjdvzD2qlM5XU9RvZB63TN7Y5BvNW/uJKOr299TZ5FgC5M3WcD6vd1c3kft9jEysDpaXSNzOrsSDlupSi41GxtW3VCYV9M5F/+rwGICIIp69bACgK/YNxHkQ+Kr0cjKtkQ7MoY3xpGDXnkWgOgGHbq6HEi26tqeh/Mb/wYnAEwIX7uwr/ZS7f1KdKzzif/rp8Pr/4cnC8El847EzFUqSC0s1ceIhuRWsbjrUQSMWo+Lcn3cFEV++aOvxsfeHJM48vvF8pfnw1/+ICH+iHg1mBNcMMM8zwZ4IrV3Kv9Q7p6xwJCGWu71oA8OVyZme6xbLEWh0LABiKzQrrp7L4TycdoDn5niArLkoZ2hGLXf1VpfsSUxOFIywHYrtvFGQA7lWLl2+kIzrTask0Qw/Zc+RKz/frH63mnxqVMzODlaFSGU7OMf3wxKMXnXogyt2dL7zeaw4143WzCeDSjXiWDZaPO822XGr3S+3zs1JXL6UQY76pTqWS0jR9+1r23gXZmO8DmqKopvUWIRTB8WmbyzFkTp8gQwX3J86CYTkPy+eclEuRRHGn5yW2h1JbByUAG/l05f64pKOsqa0v3Zx/NRxPaLqU/6q/k1HGmw7s9OnR2egaxnf16BfZrGwfy1ZfYMQ4u/Rdk9LtC+dGMyH+cCLq4WfLmSPrcFsZl0qnSvMUzdX5eLcVPuqN52QfdIpX57K7pRYAF9hWWxtrmf39D7pVzqzAejcojmfCUQBcJAFfqqI6FIBqXwZQHqoAarIJYGiSTn+kXR0NICHxAJZiQQBzsTCAVDgIwCRZVrYFP1CbEQQAFMsDsLwvlQuAm8iyo3kRABOMwu9LaE+uZ8IWN8ljeclSYgAAz7DwqRrXsgDohKggEiWGGb0zGY7C55AI70Xy5QmP1fWy6Q0ALVmDL07Kz60BSC6sAtDadQDWoIcR00bC1gURvqqMJWa6YAgAGA4+9UK4tJHdmtBsnoLKmuw2aMDXWpGwe7IhMnzCY5FnPCUWAcnHIjnmnj2TfBco+OH1QYEDIHLjOPuwJABw1SF8zsk7vLo6WpaRJABCIgSAEcd5VIzAAeBiYQBcLA4/ZZ5wb9awDyCYzAJYSUbhM1KZoAZAJcZPjI2fUZEHEA+I8IlJwq4RZZVFGDLHhR9pRk5cTzPgN6kk5KjpjBm7iCRiRCUGIwAYb1wzButHgIDErV7Lflspji6bS2vRh60SgADHtnBWKvS841yOzjlu7kFjeE+fIodEhlsPLrT6eFbuHNh9gBQfF5Y4onY2vGCE140GAGJ/u+hz9Gy/tj6XksP68eB9W/v9oVAs817nOJjjb0fy9bJcavYP2p0DdCBh7mokHwhxDm3rjmlYcEFzNMszLoeKMtzqNc/sdj4ZFrPMvfa7qyvFuVD/fidXePnwHT22AZiGvRgbuy8BvN5vBvNeKtVF2IimOscaoa7XksnnfqZonOUnCZ+demfzf1wtPjwKxkPxtdSzo7HYixPY3aa3UXdEw/kp/99X21+s5fZl7xNV17R/PNaAKECuUxeaUilQV6T13x5M5VbY3FDXzzlQFbUTiWiLVPKk64eoua4SMegKTQpHxTCeUY1P77xv4/A/CWYF1gwzzDDDjxuxXLCbdu5XxkTLzfXcd/4E1udLiecT2naC3f5gt89hmpQKsuKKsPDdae83xfFFPcQLBSkcYHiBOjvHR7tUt6U92//PluD7pTbPMF9cWXylNdvvERvxwyCbxv3WCQSsbSYzTKjRkE9qvVKvX+pN01cXzEOGA8LGpeSTQVntvVc0QF27MKBcrr7vGJO8tD+5oG7eDudIu6FzcS2WqewNZb9kkQYYqcTkxtRGB0P98V6FSUp12zzcnZprW//J/H3fM9GzvWlKY2IC0VD/4GirJB9O0fkz1RUAxb5w2rdvqcspo9ijRkM46Le/2Fx8tO3tre2692vntzz6QDArsN4NiuUY0sxOCsJnXFqqBqCjGQA6mgW/059J+u4R9ZXAAiiEJQBrmTgAetAB0DneBmD12vBpFUJmeBovkrMVTwOwKBqAapoAaD4IILgYAyAkswAMz7bWAWApA/gyIx8kpFvByGOojL/w5BkSdOSSLCuieSJ9AKUgfAFTIpWDT4oQRyGZGic8lq6ZAFqKAaAuawBKfRlAOigBSAUTAGKpAnxrnkO2SNgprzUeDd+TaOgG/KAmcr88ynMn3zBhUi/luPC5K+J9I+lNng9OUwE4pgafqPO6GbJjpsfLx2LHDBbhdRgaACSevJMa7bzR7wLQ23UARqeBkbyMRN5LAQB8KgOADUfJUR6tmYR+EX6IDcfgi+oIV0TGZw568IPyiQhvqBvwfX/kkBC2ibxKWCvvkBLGjqYBcKQD45S7kAT0OwAUa+w0JL5p4i7UDBNAlCxLbKEXtCuZ4UNDXZaTExNJYUk4dr0KKcRzR8Z7TWZdi6w8OVEO1AYAlqZvxLKiyZVrw2ppcIx3xA3852HY9qPtisCxn64suCKaptzV1TbpMUBRQZYPcjzHMDzFmK6tWmZd/eH+/L1+aw8tsMisBRekqOBwqmI2O2qzrzhnAieAZCQwl41QEp71qvc6x++/lZo6XEkmyq2z+V6pUPB092we+kVg3iAOq2VZCLK6fY7987Pk4rPnNcsfwq1cfvfRuHIyjXMWse2p8QoCu/LJ/H0/Sm1jLfPEtzESwS7Bw1LrV6trz5W99xlCSoik6fz9k9YL65zMVU5PARcejSO5/tPljd8djhfcUmqTSf0fOGYF1gwzzDDDnxWW173JQQA/WYi/UN6hUxEYbpFZ/tfXDQA8w9yNzZ2e9F+cNt++1B8DumkR45u3Y97kInQ4OqZ8iwkhsJCNSFHu1bDRNaZeOgOJY79cicGl4GJouLWBcdrtEwFSXZXHhVoQTIhKigGR4XiaAWC6dl2Vy1avrPTeo6fzOchnw28WWAuhyI7z3tXhG5kVldbgbr5wrzNVNMcFcZVKPdkal1MSx7UPppi5QORt90uCwC5fz1cc9YFfXeXz0TI7HjbDU5OZw/+63/jZ8uIr/cLanaaoS8E8bQa/Lba2rQs5zgelxq83Vp8N9i96Q92tTMbpDw39+lKm9WxWYP25gKIoj+Tgxo3t9L4GQCcp57YLXwtIrF4krIhYvZYSEQB0rwVgsPM9APV0F4DZaQKAYwNgQlEAQmYePgtFVEq2FAbQllX4NANNU/CNY4lUAUAomQGgd1sArGEPI/LGNuGb5oggCYY2eoaQOkS0NJXDTtEAbEEaLUXCkDLZeQCGTZKxiB7Lhh8pTkiRlmYBqCsGgMpAA5CQhgDikgA/Vor0mhA4FgBDkzuqce9FZ6IDo++s9PPayZMAAG4i/N0boKHBp/HsQQ8+m0WeJwyTxyRJQfgMjReR7/UrJOtkAFAu6Us4DgYz+h0AeqcJP/XKcw4SUyfLwicguVgSAMUJABjCBpEef2S7pNOfxxKJAGiOcEU8fCqREJMsxwNIkL0S+NFh8ZRnqgpA60+kfIEajYuAHGQSsUZGMdm9kXxc/b8ufO+hdwToCcXbDD8qXFlOjaorACr1DvIpxImSnvt9sQHgcixl1d3HJxUAEUG4nEjSJqUNDN2wKIoKhXkmwB4MuvU38jYB5BKhwvz/z96bBMlx5ufdv1xr36t6Ry9AYwdBgNuQHM2i4cgOy19o8xc+2Y7QRTpIZ4UOPshh++KrQiGHwyEvB10c8X0hxfgbS+JoRkMRXAECjb0B9N7VS+17VuX2Hd7MqupGdwPkcIbksJ9DR3d1ZVbmm1mZ/3ze5/88sV2jngpElJ6ytF6ut4/yIPgZ0eqaD9ZKQCSgvXlm5mY937YOmLnTZOXV2dDtxhDXEmRiUhsPpqJyzLaVSstaqjQbgjt33Z+FGHsaxYNiEORPo9eXDvoK3r6/Oz2fXGtWAQleSI+X1tq3a3uKmKuZ0Vsre6bPnvQa2dFYcWdPwZfMREZPpq2A9HCn9FHBK211TTl3afxWdafd8IY0EtTvt/fwTy7SP6zU59PTs1m95tTKvQagoqT0aFSJGF3lQaH5br59hCSrjx8tFt86e+p2/eAaq9xtTMQm843BSN6o5Scyia2nKtcvIY4LrGMc4xjH+CWBKsuVYAe/0hiNhlZaRyXspvSoWU/dqVSBN9PTN+9s266bi0ROhpIP7m7dWzrAR0DXlDdfmPpgd9MesoBSZbkYb62WKgCtKqBllBfnxyp5Y6N4cIPe54VW17x+Oz+RjUk5lur7mxm/czJ9e2/7JNC1zZXWLuwCSITTzAYSGT2pOHql7SwW683ec6msnonFWnE+l10v7Klx7U/jtHlg1GHPtvWy+ubojCM7pe3Ow9v7ucZ4ILB4dz9pVGsZ4bHY2TMzMpIjYdj2dqOxVm2t7QzOkFQyNH0y86RdfW93UJzpijJ/JvVh6QC10+Ny/bE35H16rLvPxeOZcJF+8qjynfm5O43lA9+QiwSGC6yebccnAscF1i8fBumB3t/Cp0oGP09QeF9lQxowEY8AqYACVO7dBZoPPwHay4tArzSQl+rpFH4zmqA6hJuUrUeASqcLFFoGvphGtJJlWwYwFo8AudFJwNB0wKxXAIw24FoD8yfBV3jqK8eibyVl9ei32gkbJ0ME5wkBk+gxdICpsWn89jQx098V2izLwe+grHddoGIITssEUu0ekArqQDKk4VtMhTQVX1SkMZnN1wAAIABJREFUSAOKZfj6I/msi/hQweLIQZ0+C6Uo/R10e1187soj80QfnFhKsDtD7xcaLEFJKnoAsBwbEO3TuqYAdqcNmM0GYNUrgNWoAo540nUcfBt6NRFir8WXaDgVSX+iTdIa8qBXFQVwrB5gCdJRpAF2O/h+VJ5PvRgRsY/e4RMH1PZX5ovnRGeiJAFBoeUK6EDY6AFhTQUsZ0AWCot/0fTqOY15o/8VcEk+xtN48dLYtdJAJzSXjCwfbngd1QJWI/Wk0gDeTE5fv70FvDo++eT2zp3uJhAPB06kE7qiuC5b9cZOtQn0TPvWjY3XXpp6b0hfPD2WuG/uYThMx/64tKmG5Fcvn1i4s209pW36fJEvNgI15bXzU/vqgLrxXGfybrfWd0WPZeXz4UxCTjQ73N2tC3LrMyM5FtxXYK3Wa5Lcj1J9BoqHSP7XC7V9qx3GhXTu9tIB9dBWpbFVOaAuSSbCJ+ZSdan3sFDcGDqssVDgzMnMk27pwOrqc4TlOD9arHxr5kzeXW+a+2Xv2839ryyUt67MTt5feUaQ9heO4wLrGMc4xjF+GXB+NvdeaY8KOxKUD8vqDil6oDN+r1wF3kzNXL+TlyXptczE7Y83gVNjmXhbXn2wvW4NZgMvnMrW4u5mqQ7cvrlx9oWs8JQCkokgBxFVluO8V1q9cH5k81Hd6D2lJ/pc0TXthYWdNy5PvzfkULWwXZ2aCDbMo0Ra++C4zlqrINKUYxn5cmSUXvQzZxXfqGyencgt5Qc67kq7c3km+2T52RK3VDK8UnleOfwwtpafy/AiHNJOnR6pK72HheKm32MoS9L0aCKTCTck40GteK36KXT9PyPeWd2diKVfGA8+6Wy0rS4gS/KF6MyPtg4YhHqoI8synz545xeJ4wLreeCTVkIn5Dj4j/5BRQYimoL/yC9+H48GgalUHGhvPAE6qw+B1pMHQGNxBWgXTUA0PkfGWvjSnMDYND6fJMgGYcBdaHWBlmkDQVUGepaDTzwIwU04HKVvKW6Z9KVL8v7HJVcdSI68FjXbHizVE4F0xuCnsJiyTGB6cg6fbRIiHi+70DEBIR81rEGIXtdy8ZVqluv0lxIQ268Imysx1JLbX2e/qUcYg4kGQ/GdSkSC+JZdgoXy8gTFjgg3LGPAYHkfN9R9I6IPFT2Ir8QyjMHTqnDeEhZiHrckehWNVn9AxCcqoSigZ0aB4PgsEJmcBdbLdWBrtw5UjGL/gAZENGRIB3LRMDCaiOL3NtrdLr7P+/ChFG2e3r7sZfkASdEAxN4J3ZimA8lwFL9JUwyp0GNZQ+mKwSEq0XXModV/dnfHY/yCMZaObqn1fdHD8lNffAFNVtLO1I1CGXglM3ljIQ98Izu5cHNDkeVXJscfvrdaeMoGc+NJMRoPzpxJre5WXIeUNBD8HX0nuVfdfePc9I2Fn7vvtgs3FrbevDTTb/czLGs2MH3b3ONSISH9s6m0rtRbVkGTg7ocddzYepOb5aq7l7u1Xedxcwt468zcPzypWp8+/85x3Va8p+8ovaE2z07MlSXpmal8J+bTG1ufmjoajUWLm4c6RAiMj8bTJ2K3i7vv+3K9SEA7NZNxg+6TZulht8DnZEmWCgRnI+mQo5pdp2NYiowe0NSgVLBaT+qlp/c/32jlG62QFptPTSTC6mat+6P8wSXmUr380qWJpQefpQD9heG4wDrGMY5xjK82JnKx3Viz09mvHDrwBi4hTasnr60WgLlY6tGDkgtvjE8tfLyhyPKVZPb+uyuALEvnT44GLFdS5appPlktAs26MVXxIvZ2N+r4JZbBARYAw/iwvD6ZTuyUP08J+WG4fif/xuWZPpl3faOWzgWbQyTWr0+liuZ19o6WrvFPTuQse/pHB3mj32ks/+rJ+b979Fk6K9ca1Tcu7qkvH5VKb740dev6UcVTKhm+XfostNloONLk0AJrJBtNzcZubm8/3vIox9NTGT2l3K3tfNRaP4zv/LQYD8fmAqlyyVhdrt5zD96L+ZFsZix8u779tG9qx7Ru7z67crpRyr94dvxz2NyfG44LrOeALEnyoE1UqJd0VQUiugokgxoQUmUgHtCA8XgEiMgOUN5aAYzNZaC9tgmUVy2g3lABVREdcx0gNCbEPQNndsd18APjRL9e07Tx3bYimsg9HMiGxPHcw254ZuU6/XY5VQOPmxAWSp5oqVEFrDqAJVRZnq3U8M8BszU5Pc/AaX3QhmY5JtDouUDXdgHZdABdsYGwqQCWPnC6Elyg37In47Nuwju+6ycnit0UfwpfKLGXyXiyv2FCd+VprYYP2RDr43UOio5CPYAfgNjumkC7Z/Z3SjA63hqGxGqe2ZjoTFR1fEt6PTMGRCbngLubu8Dd3SqwVDOAUmdA3cV1CZiK6cCplIkvNTuRjgNms95fvyePMwcyuP6B7f/w4Djs1c+akgzokgSMCIZMkYFQWwVEVp0Y8Iiu4bvVY/bYm9V4jC8/1rvVxEE9dI69n4OUJfl0YP6ny7uArih6VTV69ulM5u6NPPDy2OiD99eAUzPZ7qPi0t96adCKIr/0/fOfPM67LhtPihNXMvlyvVxvk/NWWzKf0Sxmu24uHfl5FFiKLNtPCbxuLORff+GEMOSsdLpXtOl7QySWrlgcpGKv9goSxV+buPp3+QOSfyznszfVvldae/PizPW7g6aBa9sbb7w0tXDj4BorFNRCM6GN4gGl3vRoIpeL2LKzcGf3adcuYF/oUB+SzAsvTt2s7CxveeXXVDYeGVcXytv9oCNVkU6nE4mgFlBxXalt2vcL9dZzS/4DivpCYsxuOg8eF6+7zyAs13Zra7u1aFB/8dTYZzaYvV05qofjC8dxG/YxjnGMY/xyotLec6+VkE7rXnUFvBKfWtmuqrLsFizbca5Oj4vq6tL82M67S6WNAYVg2879v7n7wrzHFkzEo4DZs4XxryrL2+1nt3TpT4U9/+x4IzsZ3nAnm+GX42MXR0aGy8mFOzuXU2Pi9/dWy7lAfOifh859u7gN+5Mr6eS+14OKtlz8dFHT+/BedfXq+T10y3s7G+deHk8mQvveGYsGR84nHx1UXV2cG9kKN65VVj8orV+9OHrgB5WNztPmDpFwYObFkfd2N4RtNfDypYnVUGWhvAPIkvT6idy3TkfHxxpldWXZevTAePSwu7juPMmOVN86k1afJRbQFeXN5HS8GLx9e+fecuGZs599NI3e9btb9jpvJmcywfBzLvVVwTGD9WxIiiYNNawJIkTQG+LRPxUU8iAVSIYCwHgiChiFDaBX2AK6xV2gU+gAtYYC1HsSEBSe7x0b35TcaxCTJAb9egN+SJy3oucuMGTqHQ3qgFUtMrCA6va3WVA1ajQBqOEoftOc+Cyr3QR61SLQFUmFlonv/C5+DjfQCftywWONnTwPuNlEfztNr0nNAjoiNBD6PwXhJUyBhfRHbHk0oPdf91zjewMNGX6mnmCwhKF8z/MgdoF4ZgS//86n2Trg9dkJ6ZjwnRKHUnTbefotPQA0a01APKup8oBUC6kq+HY0QzZd3rmhDozvtUQG2K42gCflBnC32AEel2yg0gb/up6KAJhOD4iKhtBIFxgVmYNCHqcIJyrhMu/2FxYMnG+PI5yx7MGemoPURbHX4hWxbaPJDBAJ6EBryDRf0LGeV5Y8OGHkX7rr3dcNn2yVv3166mFzA0hokag1+lO/8WoqkrjzcBd4aWz87kebuqZWFsvAWC6+9s4T+yBButr15gFlVwJ0XW1ZFnBiJP7AfvZkVqfzjGnETwtFkh4+2HFct1prV2tt4OJMphmzVypVwHbdzceNmdnkaqNqWFaS0YKvwy8ZR934XNyJsHJzL4c1q839Q+1n6llz4f362huXZ27d3uozzde3t4JJ9fz8uNaTTMOSFVmOyXeLxe3d/eMpwZXL4+8P6fffr6xfOTlx96nwmZ1G68rJ3KPHgzWMj8a7Gemu78kuwdXL4/1u09OZRCZlLLceHTivaNjmncbSt0+e+fsnh+5+WNNPu5l+gs1ngNEzr9/NBzT1jdMzi91C6ecWl/QLxjGDdYxjHOMYv7TIl+TLsflzgTPlUvzG0MxXphfpmpamKNuPq8CVydHybhPIyYrZOdiYoF31KBzxmJRKetRLKr2fg3kaqixv7H7OhljxULDb3VO0La+WKg/qb4x7AcBNo6eX1YCiAtdWizNhb0bzk3Jdkw8NqAZUaQ8BMxMeefdzcgR4r7Q6fymTjg5M1Q3L+mR768Ny/pP27vXG9kf5fLu3f/xVWX7x8thwdQU4rrutNhTpAHKpE3HGR+OApiovXJ7cihjrtYGnw9XL4/1Gy2/PjXSCG8utZ6RJLnVXNPlgAlKRpJNm+sHq5+D73zWtG/fy1jpvpmYiom/pK45jBuvZUAJBkT8ouvzEI76KhM8eCZ5JEAzpcBCIBVSgWi0CVr0MWK0mYHZcQMiKBP0i4wKiA0zYefsG3zq+65X4rmuyBER0GUgFVWA0EsRny+xGBTB2N/F5JkG3KJEofvidHk8CDeFWVWngs2KCh8tNn8ZvRvN6GBsVwDQ6gN2qA6ZgyJr1/nvEXk+dfRHfa75lCqpJ7N9AayXMlkQDnaddCwWAdCQE9Bo1wLRMQNJ0IBGNM6TSFZqhZtcEOpawkh9wWk48AiTHp+kzOkJxpWr4ZJtYrRpJ4CcAimTARqcLNIwe0DYtfPdzwWBFY6JLUQNQhpIQBcMk2CbBioXCQL1mAOVODyi0HUDITqot8FMOxVSJoPd6woneHVB9nv5JCOYCwf5PLy1xiFETeyrsyhzR2yh6D40WYLfr/QMnXLUE9RhM5oBoIgq0uz18AZ9HjgaC/ZH5krdAH+N5MGQFOcDF5MiDuwXghZHRh2t5oLZaA5Lx0PKHK4etKpQIUm8CddMEciOxpUoDqMvPNpa8nBq7u/7pJNunT2S0lNy2ei5klHC50FnZ3tPbVml35rLR3eIe4sWynIWPN964MvVBcdNx3bXd2ssXJ69VVx3XdToJYb7QMM2cfjpv3DvsozeGCJSwGtgtBSz307lhfe/UiCm3beywG1urdBdLg/pmobyVyAWuTo3ffLD1PF+waFAfPxX9wI/uHka+Vf/G6RPD4UICD4slWZMuvTS62Wy8P2TrD5ybzvYLtYsjqeXe0mGarWGYjm051oFTq1dTk7dvf7q074l4/EQkLrsg0XGt9Ua91BqMuNEzr9/JZxPhc9PZ6+UDrG6/QjgusI5xjGMc4+sFve3xN27VAqYyia1PisDMWHLx5qG3NDekAYGAulqsAnYQIBEJPqw9u3Kya/tribCuqZLcsSzT3n+Dl+Dy5bGPSuvukAxJ1eRXL0/de1A0hjTXI5OJfQWWwMLNjW9cnnyvtAncvLd15nxusVb4OF/85ulxYbuwWFVjQck9qM8yrqZ+tDuo5CblmX+sDuiriKafiWV1SZFcKk5nqV55ukDJhIIPOo9trytlC51vnp5wu5EPN0rCcLXW677fWzt7MRts6Q9Wjhq98UyMnHunemgFsyU3DnR8cFx3YWf/UqosF4IttwWgyYocKfWM55q3HQkmN5+ORYSgotZ2PoXHGPBacuLu3Xxtr23apZlMZCR4u7jb9g9usdYu3m6/Oj91u7dtHJRs/ZXAcYH1bCihqJ7M4LNK4qfUNYGgJ9vU8IU7KcHH1Gv4tIHH9DguIKsAQc3FT6SKhR0glNEAPZXBj7QTeimja+ETG8L7SjBAk/EQMJtJAIFuC2itPAS6uxv4JuOCVtGlcYCMBFjIQL5SA/L1Fn6GYFhVgMlWBzg7OYNPdZjlHfCa1zwKxOgCVnNgMu6ru5LARHYSKLY6QNWw8J2xxHc/oEhAWFOARDAAZOMRoLObB3qVIj4ZI9ZpJTJAYmRCHAXRSlnrdPGpMsOygVq3h6/KmkpGgdGZ0/3DJNRRQkYmRlwMrBZLAlokBhQqDUCEY4g160MSMdvL+Av2N0wwYfJQvuFwct/wlU7xBGfioANoKkAsCJAMyPgtqLGABgjJsGHb+Bos4bAlqM1hxZjoOrR7PcAS5KLoIhSyOXHiCRWaiHSslfHZLNvoAIHsGBBJpPF7J3teb6YMBBMZ+r7wx/jlwolo4sFiAQjp2tJyERiJhsXt7ggVenIsvrhWAuauTHy4tRWLBu8UdoH5ufQ13xw8pCivTAddxd2taMOczal45sH9wRRSQFVfzowv3NqwbfeFs6OfNHf2VQdXL0zsc0zF8yxdO3s6u/O41fFnBrvqoYboCwubr74y+dHWpu26esPbM6sTEb/crdV/Kzm/ZexP0QEUTjp+ZXcuNvMPi151ldAD5/TR+0uFe+agJEpFwrOnkh+XN4a/+CFNMfc6tT9u5oHz04mMPPruSknUZA+rReDMhWzaCS+ulFrGHpIsqCsXz47cqOWNxlHlxVqj+tr8iVuPnquZ7tL8yActjwl7eSK1bDw++v19BHop2D8JKMELgfGFtU/Rx3dlbOzu9QMq+OXVEqsk46HLZ0Y/3sn3ff8XHu+cmx15wG73q1ljHWuwjnGMYxzja4QpOSGqgflUSjSUaP6NwDmsvU6R0pcn20ZP19VNsw2cPJs1LCsS1B8Z3n1XVaQ3TyUWjc1HrXwuEhheOusMuiWSoeBML3rrxrpru8DDhzuvjU/ueXMicrN1KIv2sFqcmo9rvoXKYrmo6YeWhY8XdqaTSeDRekl0FH60WRoLeh2Cq43o04sktPSP/YnIjB5bWPfomYup0Wg5ePPhVtfcc6evtYxbC9vnnaxQegmYh+QC7XZr9zuLZ6et78zlVMUb6sVa8f3GWnPEmLuQfOmF8ZcvTbx8aeLCC1l70r1WXnse8mZXbj6PI7AE+SHeKBx5XmP9C7HZ9zf2V1dhVXs5NL7wfIVdH+38UXRXrd65/fHGaZLjsVj/xQcrhauRiU/1KV8eHDNYzwE9IBgs4TMuCG0/yk1hYJukArFgAGhXd+in+MkSoASDQDCpASnTxHc1CmcUIDo7BgQnZ4Hg2DSgxVNAfX0Hv9UrpCpAOqQDJ5IxIKE4QP3RXaC9fB/oFfL9zxW6K0G9CJMkYfW03WgDjyotoNSx8bmlstHDN0aaGTsBGNtr+ISNsGKyGg38eD5BsYhP6Y1sA6mpWSAuwu/UDqDLEmB7DJZwvVeBZDiIz1p18iv9LRcm6bIWALT0CH5DHJAZmwZKzQ5gOh2gbJj4TYvljolveS9YqJnJOUCNxvHDGcWqBCujJVLs9b4SHJhgxYQ0TXBmYj5CE+xRIATIeghftzTsFOVaFr4sLxXSgNGo2T9hOmEXCAkHrLgCnEuHgFPpODCZigPdWqk/CELuIHRdWjwJoInuP0EKukA4Egd0TcfnpcTroo3UrJXwXbskLYCvyhLbuSe7UFb7oyFONlXuAkH9+PrwywZFkp6sef4LYcXXEfvky+PNUjCiG609VIokyWd/7fwni3lg7vWpj1Y2pyYTHxe2gH4GcFTXLk0rdxpLYpHAkII8qgceLHuUT1BVT9jRpa09d+utJ1U1KvdJi5mp+Gb1KB/xO9WdN85P37i9BbR75vm5sQcPD77N93rWqBMUgiO1rQCO6+aU3DZV4JNy5f+anip0B05UElK7N9e1Pfoqao9WOkXgcnp0+V6tb8Ue0lRNVkzH6VsePM5XL50cveVuib0otIwTSc2wD7aPKnRrBWoXppNJd+Ta6q7lAvRs+8FzzLQeiJVm5aXZibtHTjUC52Zzw5Wr6TyXu9WF6NxPH+85HIokvZKeWluu3W7sOY6j6cjUZNyRkCzp8Wqp3tqvzJOgUHy2ncfaejkRC83MJFcr3ufeergzPh/ban0F0p334WvHYD158uT//J//s/PU5PQxjnGMY3wZ8HO9Rp1J5Gotj0Xo5+jYftNcs9Wd+9b88Ptz0+mp750W1dXZV098tLIZCKhWWunZ9uVTY/3q6uXZ4HJrUOUoyoDCuRAb6acQXo6NLD2VwVeqtC7kcoM/Geido7r2/fmR105p3zuT+PbcSP/1j6obE1mP5FDjR9lr3X+4fSKRAO4vF0ZDUeDudkvyibq1RkaRBk8RI4Er/7hb8jd79sONInAhObL60KuuroyNvRwd1dYce6mrrlqXg7lXxyfFuu4s7b4a9boXHdcdDex30tqHHaP6sLt4eU5+/UTu6Hc+D3rPQUepsX23+2co7EOKfiF85sePKrYfmiRL0tX0xLyVvbmwXW7scQW7cmZsI1y7Vl57v7T2Xm3VHLFeujCxj1cLalrP3LOdsiTNjaZfmZm8MjMeDw9Yz1qj42z00mFPouA4zpyWeuYOfgnxNXpC7Xa7//Jf/su//uu/DgaDhmH823/7b//9v//3z7Ngo9PdrTXxva8EX+UZp8sy/VxCTQUcYb0tSAJZBpRgBNBSKSA82QG0WAuQRAxcLgOET54FIqcvA5HZc8BaqQoUWh2gbdr4TW2JoA6MJ2NA+/EdoL3yAGgv3cN32xKip0B2BFDjKXwzJHGNKHV6wGpdsFkizRCgaTpAVKsBk6enAC2VxZcxeQIjQY/3TMBqNvEFQEKzJUgUXbB68sBqfLiLMDTEYDWfPAaM/DK+072wYhcNdMIYvc9gKeFof0Gl1gSaPRsoGeIbawKljgnUuybQ7PaA6XQcSE5nAEsQb0KJFYwAtUYL30/Liz50BzGIgucX/lvBYLB/KIUWSjCQggcSAy52PxVJAlPxCGDaLpAN9fonTCKgAifiIeBkJgFMJiNAe3sDv/1TmJOJ/RUu87asAtvlBlAzuvhMVTwYAKbScXyuy9uSdhMwK0XAbjXxew9Fj6FQjCnROKCnc4CjR/ojJn6KrdXVr90D2BeLz3yNmoqHZ0fTT8r1tvmMGaWkMjAI6N//Vms1SfK0kjcWt6a+eTIXC8lQ65qrm2VzeRc4//rMx9vbiixPX8re3N4+PZW5bW4BE7FILtt+0NjT42Yy4MAkf1JoPpu+t3Dw3F/EN02QYL3lTWNFde3kpHm7NXBg/97ZuQ+Wm62eaTlObiKcLzaAlcZRdJfrMBWKrddqjuvOhlM7neZWs/3qaHatXQAWKrVfn3qxZF4HRgMz/9+6typNVh7vWEAqEKyud42eHdb1S9HssH7Icd0nTwrAldMjq069bBg3H2yfPZ99WCsCcTUmOhYFrqSTszFR2AW3WurHpYrlusBmpwzlN+fHq/XgvecIhzkMd6o7FydHH28eYEAvkIgEF2p7fKp091CXO1mSLkRn7uV7P256+jNFkl5OTxbznXu3D+bJ6lp3WIVW7Rnv9VbfuLwnIMgwzdhe2/1XxscevL8mSlpZlr7x+vTNnV0xCVuuti9OTnzY9sq4SsU4cPpaelaZ+MXia3QB/Xf/7t/9+Mc/vnbtWqvV+ou/+Iv/+B//41/91V990Rt1jGMc4xgePvM1quKUd+WlsbHmr53JHn3LcYzBfx3/jlWotk5fHQihNrYqnyzmry/mH68WTMvWdfXct2Y/yOdlWZp/afTm9vb0SHJDqxq2NZ+JpzPNbWN/ZVCzBpE4uyXv95QVOMz3w+p4xEY6Hm77yXRvzCR2jD3F09368muzXllwo5IfTUWAnUZrcvwouqiy422A2/E+Pikn+v/94UY5q78s2S/9zaZq+dt3PjK3XmsC83K2VG+HdW3GjNy9nQdkSToznr00NXphakQIKhYf7UbLciIYcFxXqognS8zegLz4jRPpgHZzy3iUNxbzxoKr3PjORPnXpzKa5HFvT1pbZWXle2eTycBnN3/S00cxeSdPJXt7uzWXSt20vl+FpsvqxfhszDjxo8XqVrONPyE4a6RvLexsFg92Mjusk/S90trLFwfyKRfi8UF9/+rMhEgOEHAc9/611ZluMBX1iKu7d/OnMmnx+8p2bVjlJjAVj7x2KsiXGF8BBuvDDz/M5/P//J//c007yhruaNi2/d//+3///d///TfeeAP43d/93f/xP/7HX/zFX/zmb/7mM5dt9sxCs4Pf6iWYKqG+EubXqqIAAcFgdTv4j4ZCsqPG00BgZBK/BUw4tgsiRLwePnkRiJ9/Gdg1JeDBbgVYrwvJkQvkQhIQVBVAMrtAt7AJdPOrQHt9DTB2K4Ak5JOCxxqdwjeCEk8YTdMCSm0X2KmBT1c4rg2MRTrAdrUJjCRz+JZRvhWTgi/iEbouYSDum5sLxZWD7+BlDoXPizERPJwrGLXiNj6D1VpeBHrlMj5bFhjZ7a8fv/tv9MKrQKRYBcTVsNxxgFbPBXZbDlDt2v3dFA/0U4koIL63olNPWPmJZynh1Cc6B8UQeZ7mgM9mKXoQnyVSwhHYlwwIvo98JJkBZtJxIKpr+A5egthLR4LASDwCtPOrQHnlFmDVyvRVYuEYvp+7OGEKLQPYqjeBYrvrH1syYQuIBDQgLtRUHpfWBsxqGTBr1f6QCnGe4Mb0Zh1whbROdYBGtweUWgbQFdpn5Wv0APaz4Au/Rgm0LGOh8fj8yNwRXEhzSF9VsQaK41vV0uWrU48+2RONJ0nS6auT61brw9XNeDSQPp24sbV1eiqzplbqve7r09m8syqEj/uwbVTCWlp8+yrNDqApysrSAdkvAu2Gp9eJBL0BVGV5rXuAM/i9xupL4ydvbJUtx5maTOxUWkBmJLK5dSiPtbVdU8dly3EqdUPc8Tq9wYnt4v7v9T0bFlL0TzaawKXU6MKdHeBSOHf3bl6SeGV6sviovP2Bt2GTmcj4+dxH6/lSpX0mN3pL2l3eqrz4wsTNcj5fM/pJ2I60XyLWtGpNrv/a1OhKY+xetSY24259ZWYiFa9E16qHRjUfgU/K+VdPnzhQdf7KxYl3n+rKXK7UM0b0xROZolnTJDWpxsyednOr+veb3kiqsvxSamJ3s3174xmz1YloYNc9WCD1QW1tNpve8CuzZCpcqXpTwPW1AxbZ3qicvjJxHY+4GlHCTygDjuOMhqNrQ2whEcikAAAgAElEQVRlMqAn0o2V58ho+gLxFbiArq+v/87v/M74+Pgf/uEffvjhh59tJaurq1tbW2+99Vb/lbfeeuvatWuf0zYe4xjH+PriS3WNGo8f9dhcaQyKqqVyJRH32ALTsm9WCme+NXP25ROz58bOvDx17luz+qXEx8WdnWpzbibjTGl3d3cvnRpZUkoN03hrfmTVetK1TeBkLPqdsezruXR/zY7rnErFAFWWhaXCyXSqfYhBPFDxPeIDAW/jXxhNVs2Dk6HVsHdPLTheIXKEWQNgWc5oLAqU/Ft7qX2Ua+jp0HSxbQB22QW+MTF5925elqRXx8YfvrNS2h6wONVS6/4/rlxJZgOasri4842xSUBUGk8qjagWBMKqUjyoUgRKvZ1U8N6vTWT7r2wblUCsJAQGnwGPrMJ4Jjb8SiwUePnSxHu1tQPfX+oYf79YW1jm+pL1o8XKT1d2690eIMErmckT7eSthZ2t0qCCkSUpchDHdkQ3jO26qYkByRSJeotnYpGt1YMnNB/dzF+e9kIbN5YH70lpe8iqK1PJYvdzzgb43PEVYLD+xb/4FysrK3/5l3/5l3/5l3/2Z3927ty5f/Nv/s2/+lf/6sSJE8+/ku3tbWB0dJCOOTY2ViqVLMtS1WcMQse0xcO9MPgWHcIBWer/PqzNEqSIUBEJqkB0wwnuR0vl8OkENZYCAuMzQOzURWCtYQC3tgrAw3IbKHUcQLQh64oEiC4VZygrULTI9co1oFM0AFmRADUiLLzr+OSKUIwJ4skwXUD0eQjdYUgHKHZsoNw2gMlUEp86ErSNEgoCTq8HyIEAA4MoIVEKAe1eDWibDtC2XHw7KMGTCVJEpB+a1QLQ3d4AWivrQHPLwOeGoqU9Xx41mQVCU6eAVCiAL+rqmAClpvgIF2h2baBnD5ge8VP0BibEssrgwAkGSBBWQWvAoguqUhxWT7cUFAyWSI2V8PVS4nALYs9sVIF0NA5kYxHAFZResw50ixtA8d4a0N1ZB8xKAZ9ilIMhQM9O4NuhyYoK1I0WsNMygO1mDxAGiWKPctEukBSN8a4LOEYH366sVxkaRkkGtFQVv1dRmJmJXn3RfVk1THyDNFV+nu7vY3zx16hh1DqHThGqslwd0iabtj1xJlX72HvFdpyPV32NkS80DwW105dGP9rJ2w3n5Yvj79fWA7L8q2dTd+qLwEvp5IlYddu4Y7gg8xvT07cKkdVOBxiJa+xiOU5Y07umHXpqfmcYzWZXiuH6dDKQCKv5Q/LoVtuFM5mZxVJtqV5OBMMto7f5fP1lnZ4nUKsZJgdYNHh4VOgCF5IjT+5WQrq2+qAEvDoxfv+9VSAS1s9OZiXXBdaqzUKx8fhWfv5c5p5Vf3xvNzEeeLhSGDsd3W43JwO5h+Z6UFYPtDMVsFyz6Xzycuby9ZJHOtatzsWRyEb94OLyaFR7hhNzL02OBGwViZ5k32/sXqvs566OxsXUqFN2by946qtkKHgume3WzI2NcrtjSnLvpfnRTti+Xxg0K8iKzOEl7ifl/HQmlReFWsDjdIIB9YgmRrfgPQaUq+3caKTQbAEBaQ89rKpfAWesrwCDBUxPT//xH//xwsLCrVu3fuM3fuPP//zPZ2dnv//97//P//k/W63nOhGr1SoQG3LXiMVirutWKnu49D/5kz+R9uInP/nJ57orxzjGVwy1oRSzYxyGL8k1KqaE7u0eOlmW0gL2XhnU9a38mXNZ6aD7gKYpZ89l3Snlva0NXZVPnYlfq66lg9q5SedufSWiKL8+pmnazW1jpb/ITnftbNSbbmua3mZEAirg9PbcT2cziUtjmf6ftuMEVRUwfWsD29zTpLYPI2EA23VH0yFgp9GMRQNHvL9reuYm4nmpaRya7TOlpVeqDUBrSMC5SLLRMOayiQfvrwJnZ9Khjdr9v7l772/v3fvbe53rGxfGk5LE+oPSxdFMu907FYy7MEkEcAwhmdijfApJqi7vqTUd147rj4JDSX+G+dmJmbrZvV7avFZdvVZZ/bi80TKP4ur2IarqLyojj++Ul/IVIBMKXo1kWend/nhj8dFOu+O5Cz1c3FlfKJ5NDnRv5pGfYrtuIuvtcqnjkY72kd0Ya4u7Cb+pMO2HEtp7GdBW11vV2tral/Ya9dUosPo4derUq6+++vrrrwM//elPf//3f398fPzP//zPn7lgJpMBGo3Bg06tVpMkKZnco478kz/5E3cvvvvd737O+3CMY3ylkEgknv2mY/j4Aq9RqqSEzbEjGglz4di+V1z4pFGceXHkzJnRZCKkyHIqGT5zeuSFV6aUucCNRrHUMebGU9E5/W6rdCabGBk18mblbCL+rYlayT3ABr0m735zJAVs2ZWQogCj2QRgqXsk2JquhQN7ZnzEbICmeixFMHhUwRQMeTfsZMLTvI+Oxg97s6arlY4BREMBT2SpHKoHTwWygK4oazsNoFnsAfGu5rrMnshsvrvSqg7mWG3bWX53+eqpcaD8oBoPB7bWGrqitFsAhq0BTdtWpMHH/bOc+b34jd/KljPaICah7TRfTA++ZZHA4fTazw0joch4J/5grQJI8I3xKXfdWlwsmtYB3JTrYJecPt2oPyuY+X6nHAnqQL7dEp0BNaN3UEq1v36XXMIbhETQO8S6vueEiejeyTw9Pf2lvUZ9BaYIgWaz+YMf/OB//a//9cMf/tCyrLfeeuu//tf/+lu/9VuSJP2X//Jf/uAP/uD8+fNHV0JjY2P4JLzA9vZ2Lpd7HlGq7briaylOCD8JWKU/9yyUxaKKd8HPaRGTa2JexvvdcfDF73p6BAiOTgH38wXg5nYFWCh0gPWqA4iSXTybhVQLEHPkSiBF3+VSzAoJh0wTwLFdwOma+EE9bq+LPyOmiQlEmf4eebvpAPRsF99vUxWa7lAUP/1Xi0XxH0bVWBxQoglAjSUAw7TxXRLqPRt/olBMbg7rx8X8lHAl6BaLQH3dAHZ2VMB0JCBT7wGyviw2LzAyARgnLwC5ybNAVFMAF2EWSn+4RIqGIttAROsB8YABxIM6EAvoQCCgAOGABghVgeFlVFv0he2yhD9R6Nl+iiDkaBw//tkLlvbimVX8DoZutQy4Vg8wGzWgV9oGulurgLG1CvQKW4DZaOBH32ipdP/k8QKqZRlo9Uyg0jGBQsfyjzkBxez/V06E8KcOxefaHQMwm4OHdSXcpm9JavbwpzjFoRFNRiJIu2M5+Pnix3gefLHXKCCgaDPK3Dv53SPeE5UPvhHe3d0FiEKUOu2NdltMEcqSdPXi+Ie1davpvDaV3ZXWa93ur4xkJOVOpdcFToaT5yOyLjUMJ3az0dvqNoG4npelSNc2L46mPs4XwxEFKOyl8bYqDTWz5/Hes7/xLZeO7r638YrIvolVOH5oQTY5Fr9rl4F4JFCkCWiH+4+slgzgbDy3uFaaz6bzt8pzo+nlj7Z0XbWXSnbPBpKZSDYblyQePdgC7v/tvbPfPfVwrXz+8uwHa5uXzo7f3NpOnwwvlhrhtGQ7bkRN1M0yMBmMt3v/CBjWxneSif+nMCi8RodSqTq9/d+7c8lcWgl321anYxldS1NlTVHCYU0NyDWMh7WCdYh3/HMiqQcDRX2tWgOCqnoxmL3zsdfuoKnKpckR3ZFwaEjWvQ3vBNvarl98MbtQLML+g3VpNDUWVy1b6ocCdW3rysz4zYfb7Z55cSqzslbqdM2JiURh81DmKexPiyu+PYOzt9Qze0d1TX5J8BVgsH7wgx/kcrl//a//dbPZ/NM//dPt7e0f/vCHv/u7v5tKpZLJ5B/90R+dPHnyzp07R69kenp6bm7u7bff7r/y9ttvf/vb3/45b/sxjnGMX3584deokUDSquXeWT2qugLczqeomMfS0ZMXU9cqq5bjvDmT23SWO1b3u2MZW77Zc7pBRf/NXPKM/o5t/qTTu+5aP3kttiJYmbK583o2BaSiAE2pBxRarYmJAc3QNLr3N/dsrYhS6BdYpnPUvUn2UxNd/xnROlznnsh6FEg64VUxMe1gZiGjxx6V60BM0oGcFgZG9RBwfnakuF4BJk6ke4vLD//6nQd/9c75k6lQSAcaiwVZlnYXS5KEakiO656MpOrd3ngoCUQUn4OUBpWIYS0OM1v9fuuQot/MDyZ5L6dHzzkjy3er1xfydx7vPtksbxbrK9vVR5ulW4+2r9/JP75TzlWjJyI/E4VzPja667cuXk2M9p3xX5oZH68rT95Zu//u6v33VjeubV5JZAP+6Mm+SM4dOq0CqqJH67ebj+53Fr89P6AV25o3+RvPeUchN3uUucZQ3JC3drO7Z7L1g43yC7FTyoHT218afAUYrFQq9ad/+qe//du/LSj0p/H222/ncs8ww5Uk6fd+7/f+w3/4D7/927/9+uuv/7f/9t/efffd4WvZEVBlKaypQDSgA7FQAN9uwO4a0LcqGCziRSB7RqNhfKpA9N5rsQTQsgFurW8Dt3dqwM1dA1jcdfANFExLAlIRFwjrNrDVMICuI+EbQAj2SIuGAD0sFNDgG5kKiP5/8cWI6SoQD0pAPOQCos9aiKSDqkTfp0CW8Q0ahHeACMYRa9OSGUBLZgEtkQGq7Q59n0/TATqWi//9EFdO8Zwq6BMRSm3Wm0C9KgM7lgR0cAGjpgKhFe9LHJlZxU/vGTn/MpAKakBQNfq7LHZEHIi6AVDvOUDHdPC9JMQgKLZI/mn2D01A1YCwHsA3ZZCGZLlCqC60/HpcARw7NviwIQjZuGCJhOBdpAAJJ9XO+mOgsyE8NUqA1RaUpAqEbBvQMyP9IRKHoGsJ4wlBEA5uJC3T7v9XyOGlIem9YNfcocc+j28TzhfD+n/oLysO0LB1xTGeiS/8GrVcMhKNQzThPtLB8PLGc1lZBnXtwrncJ9XN1YoFfGduZLH72HGdXxlJd7npuHZWD/9KfMMw93g6dK38txPhvy5GbZzRcAfYNUvAYr0Y1FWjZ+fGYvn8wYyFrqsty0L0WygA9Y594DsFJLd/cfNO4HrvUFlVyfH+pYcUDIBoQDvQCGEsmL1HBeg0baDXsoDGbgvobteBYDjQfrTc8E0H7vzwo3Pfvfyo06vk62d/7fz9J9unvjG2ulySU5JqKkBaTeapSHiTWZWuIQVV17UAFzeqaDW/q6ZpeWXEfGRqpee1zr2ePrFwZ8c+zD3MR7nRGVUj0WSgedAgyJJ0OpOYTOqyYjmuLTmBfK13v7BHqFcteoq3CyO5hU82xe/fmJ68/87KvrUt3d668ubMBxt5YGen4e3Z0Bb+ymzmju8Ne6ex/P35028/LgD3qjtjiXix1t7peSfqltHu29s+jbqvk+u3CLS71jAjZFjW24ulk6nJp5f98uArUGB985vf/OY3v3nEG2ZnZ59nPX/0R3+0srLyne98R1EUWZb/7M/+7Hvf+97ns4nHOMYxvsb48l+jTsbTWkVZ6Rxleg6osnxpfmSD2nu+bdJrU1lRXU2Ewqr60LRtCb6dbLd7G08v3rEevxL5zgetSslcDigT20blZOrEUqXxwsz4wqPtFaMmy9JgEnAIoyPxilsGuqYtCqz7O9XcuNY9JM5vveK/7tclZePgFOFMJrJY8DwwDcmbWIzoCgeu2PamUHdKTaBSbANiGquwVABOncoufHJ3eImHP72de/NqqVAPWi6Q1oOPW6UTc8lSqY2GbWtA2fDus23HDKqXO+YNQFHfrFne4dDlwPViHVAl5eGWJ+V+MzVz/fYe4/uQpiqScmAVtVNpXT0x/n5pvx3DGydGTK283lmpDs3QSqr0q6fmf/xkYA0q95s3JW+m9exE9sG7KweNEcs3t8KTWrtr1uvdcEZv93p9rYkssWvvMc26234yl5partRt152ZThZvt5fK5UuzmeWV0mqh+srVqcUbB5xI49PJh34Xuek3KFabBk8J7URHwpcWX4EC6/OCLMv/+T//5//0n/7TkydPLly4EAgcJaIcRkRTR2JhIBePAJJpAN1mG5/LkSQhwdHo+0NqOr5kR5x8gmCwkYBKqwNsVhvA43IDeFTpAitlB9goSUCxJuNzDUbPAWIhF1ird4GNSh2YGJ8GAmPTQKi4Q19SY9mAFo/RT/MFfN1YKqQD41EF6HgUiAukwzIwGhaulTq+GQSyAsjBMD5bJiAsJ8RPPZEG6rUuvsNn1xaZM+A/Ywo9jyzJ9MkV28KP3+mZMtDCARqSDUiuCtQr3jNLplAEzNI2vjNFLhwAksEWENJsoKX0x9v7VPGrkJ1FdA2IaArQym8AZrWI7w0rdFSe34Sg6yJRQA0NImsUPQDYigo4to3vmiEewgTtF9I1wFIbgN1q9IdRpAmZtQrQLVaA9m4HsAwX0CPikLXpy+acwRO85QiN1OCn5xbtuPgmC0IB5v/UAEnYTAiTDzH4mgZIqg4g+DlpQFiKYJyIrgABdZDMfRzb+QvDZ75GHYaxcHQmlGqVzUf3DzX5FJjKxUfGo0vt0getQejN2WxylzXHdYDXRnpbRgv4XibX7v3osPXk9B1aetfuXE0l3i+W59LBpUrDDtlAvtb4xoWJO3cOSMtJJINUALo9iyBAx7ZPhifuNw6wGDgTm3pn0StNOm2vZiq3Owdaek/NpNZ8J/cNv74MaNKBBVapaQIRTS/X27IklSrNZCRorDWS8VB7qQI4zf0Noa7jTozHSoV6eaWIhN3oASPByPXtfHhGz1e76HxSrl/KqLZrAdfqwVdj39Kk6t9VBoxjTj/VNNvA+djM2/ky8Epm8oYfKzQej80GEsXtxna+7rhWXJanZ9KxTPBWaVcYJgs0K/tb+d46k7rTWOSpngcX91770ffPnH570auxwiFP52c0vJXEevLWIdyS0e6dGxu/sZoHcpHwaq/Xn/k8nUnsGnsOmeM6szlluQLwsF3QFaVn23pGZwVgw+kk0uFaeQ/5KkkEp2OseUPd5yarjU4wpRr2V8CdoY+v3RRAPB6/evXqz37lOsYxjnGMnwd+xmuUIkkXkqNvJmdOdjOVR92bC9uPNg6urrKJ8IunR6++MDZ+Lrqkl94rre50BlNnsiSlkp2O3QPGwqFt44l4PSEf4BXeh8OaqP5Hww7QkZvAnepOPBIAbreKE2MHqIVMf187Q24O22VJfqrTLKVHH2x6t9ioHnjim7DbjiPa04YRDmkPGt4bxjOx3Y53z1aUg2uH9VoLSAdCLoR0zbIczeuk8TZDOnDS3LGB6nYNaFY6gOZIjutORxJPyvWIGqyb5mjgpHjvTrf5g2Lt/y1ITcsrZSSku1UVCCn6wmYHOJPILt4vu6Apyhu5qdbD1sLNjfx2zU9KdZaXiwsfb2Qq6pWxsf5WbOzWhofruydH7jSWD9xNgduNR9+c8aat+7GEqu7NvXbqRzkvaH6RExEdGP7npkIHNGTcb6xcGEkCJaN96cwI8Mn21vzJHLBdrjfH1LkLA+83SeLMt2ZvrXnnWCIeWip7E6YuTP1sUrNfPL5GDNZnRiIUmEjGgG65AJjNGr5ERnQICpWSGooAaAMGS7BWpm3jd9iJB45KywDK7S5QMSyg2nWApgHQ6kqA3ZEAxQRoSDJQatjARsMCVioN4Mz5U4Axew6wWzVA1nXANgxAjcbww54FpSEa3DLhIDATDwKq3MUPtEmHVGAuGQYEY2e1muD5fgpqR/RCCprEY7ASWUALx4B2sQlYQxSLaEMLKANBj6oM8UuCNFIVQFVcQBXNeoN3YNq+iLXdxW88NGslIBtJASNhBUhFbHzHVAEhKYvrMpAM6kA2FgY6u3mgs7kE9HY3AbtdH2xRMITvAaulRgA9MwoEMqMAmg6Um22g1ukCzZ6JnwskeCDRpTgajwDB3Fh/a7vBEP3GTy/KyMX3ffVyd4b1CN41S+q/k/7fPoYNVD2iNBCi73Abi+O3fHpdiokEfhekMrQ9Qiwogn3ERVxcqUWy+D2O8RWALEln4tkU4eX1ypONQ0N/Bc5OZ7sx82G1uNmucYh267Wp7HLLM2K4mAg3/ak9yznYl1zAcds5PbLbayFVQFpu7aRCuUqne3ouc/1Ovt3rmdlwqKp1jEEhdepU7taOt06ja8mSJE7CB8XqW/PzDztLps/mngjnWvVIoeURURdiI7fsQbUny5K9V+l+8uLoB1veDNRYLrrS6N+qDxB4pfTog04XiKuBXdpBVTX8yGqzZ0mS7LqOcpB5hBAv9jqmqsrNqkECq2cDCSVou+5kMLvY3Kh29xtk9DERvPD+Th2YD8683SwEFdXadbumlQgGZogv3BzMoCl7k5LL1Xb1RufK1bGbO9tAp2tNhOMbrRowm4wt9ZaHFpRey6ZjqoTkrjZ6D+vetNqWs34inl2vNxfrHrekBr0CyzmyLbHb9EZGkxWGutFDunwgYRaPd+SC5LjuslUOaGrXtKphMxTUOoZZaXYaSvf0GxNxRXdkVqrVj1Y2+8vOnMzkC4MRyGjhxzyDi/1S4WvHYB3jGMc4xi8ZpoLJ8UZ8+V71xr18pXGURScwlYvfc3ceVotHvy0SGBTzld5wRPTFoxdsOybQsmqA4zrnsnHgXmtHRCasVKrKbPDyC5Oi/Wt+fuSRXenruF0ID5kq/ehxQW1NXIqeuRQ5M6fN31iy+ursuBbYXB3ob+LBgGntKZuymegnu4Na0NIHFYNzkAnEiO41tYmiwbJtoNo0JElqG73sTAp4vFzOTGWHl5IkabdiAMmxuGU5IkXD6jmA4siA7oaBa4VKVD2AfUnro3+X7wFjwdQ7K2XgpdjkZrEeVNUpM/rkSQFIx8LfmJw4K0Vja72RonRejb8yOyE8dxzXLS7Vo7pX9qV8p6j5bKgvX/vOaOatibojXa/ZH9es68nQ7V8/0b2USgAtyxjP9VSJutm9MJ8Dqn5DQCwT5nAIuwr84rJfYCnywdTgcmvnzekcsN1uXjyfA1Yr1czZeDisA5bt3N8sfLC2+dHKZmFILJbNRO819mRIW82fyY3iF49jBuvZCOA0VxbxqQjHaMMewkB1E4Ar4pCFYklRAcM0AfG198KPLQefcvBdtSQgpAr5jugWdIFWwMXXbImzVzzyldsufgj0cqECjJ+6ADg9A188JKQ/gs3S0qP4CiohBspGQsBcygSSQQ2/TUPQPFPJGJCNBoHm6gb9djYR/hOJ9fdadA5qsSQ+MyekQiJfJayJZjSAREABIvogJNtn/kKAFo8A8WQdyBkaoLsaCCUGQf+yKMh5EUcjknbSE+PAWEQHxmLiuWnw9RuJysB4VAfGYyEgLLtAbWsF6Kw9ArpbK4BZr4JvURYKA3oqCwREjKgEvg2YG4ri5whtVJvAblvwWIMrezygAlONNnBmNAVET8wDZr0M9Eq7gF4pA0HRP6iagBoSQrcAPv0pDXkhCm5MnCrCVExcxkSvn3jc75oWoEbi+ORiYKTSPw1EN6KWyuJzcoKlkzURHCTjhwgJpVpIV4FM9KiL7DG+PNjabfRqz+gi7CMxHrBKz75RSUNVyKNa49XRaMtqAh817G9Esj3n4PpMJSkmv1p2XSLl4kZCDlDtGW+enrl+Jw/sNBo7NMIzervXu9XZby0RUbQmAx33SrXxtJBZgnNa7lZtoA8cjUTz7FF/Z2bjq9uDGc+1dmVo8QN2XycETUCVhD7V0mVMy06Pxkrb9czJXGGl1Gl1T7xyvl78wDQ8CufCP3npwUoFyJzIbJWqgZAOpm07gN1zgEpbaFKdoHSqyY3hTwwpkfuVXMNsSkiKke5apXPJ3Cf3toDLsZG7d/LAazOTyx9t3je87kuj3dtcKrFUmhyLG6PqVqVRqbYvz029t7sBhHyfs7rr7eyvjmc6zg0RjNZHqbeVCBT/6eTlv9ksrbZ3f2Xu7E+WdspKG1gsFMcSoWqt4wSPIl9svzdZHpqQgD0+FPtQlbajeqDZMz8sr1+eG7+3XHhYLJ06lc5U3PWDmlsnx5PtlFOr7Tmmi6ul1y6euF3b7lhmRNPnY5mw8wyP0y8WxwzWMY5xjGN8XZBNRBYqR4mo+nh3tTIZ8vKbG5ZZbJ8KyEFgp9u81pwPaS8dtJC0bb0ofoupSfHk1vQjmR+0d4P6QKMzLNAeRkh5hrGqKsuvx6dvPdrTfZFVQ8N/Xr48eWN7oKafysb7AixAHjKg6mOn7puXugA9284ko/h2TcuVRiQZARbvb2Vfv3z5//72ld/5lZl/+vqDFa/06cU1ID0RAzRdBSzLAR4WG8Kr6X9vlEf0lyR/kn8kML3ePLnSbAIXYydvbJVUWbYLruO6r01MiurqjdmpB++sdI0DBPml7Xq07IYCGrC2VBLPWgqyGJ8towLMRiM2dw9MQrRcs2bdeGs8A6xbq9lI6FGtdH4mZ7vu9Kk0cG+7GD48fUgPetSMb8Ht7ZR7eCRhoVt/bS4C2K77wCmcm84CT8rlh25l/qWxFy5PnphMjeRiE2OJi5cmzr4yvqTWN2r7I4N6tn1rYTu0o///7L3nlyTped35C5/eZ5Z37f1MNzAzGFAkSICidLRnV/pLRe6uKGlJACQFYHz3tHfVpnxWem/C74c3IrOqunq6h9IRZnDyfqhTlSbMG1ERT9z33vssDzLOlv/0Qf3u4++asP6jY8ZgvRtWqzbcekLYODmgOoQmKZUjTLoKOC1VAyzHASyRru5N/WyC1xUyHWFAs1wPGDvid4tpXJMLdEcimgggokPoy2uOXWCv0wdKK3NA4tx1QobJ7U3DZsQraixJaEzLClpCApgXfkNZBlJRA4jKPjA82GFisrNMQkJFVhPTZSYzhHIfkfwu/skTugoUoh4hp5U2VCAb0QnzwwLpTyINGKU5ILPWBvBHwKAvEwpRM6VgR/RMCpB0A/AdmzCQbC4RAVZHNmAoTrhnzMdVYC0dBZazKWAkUtQPtoDx/itguLtF2CfbF+H18QjgFDuElsyAFCwuTl5pj0xguzsCXrUtoD70COGoIoAAACAASURBVKVscV0CVlIm0LVs4CNxgM5eA9xBlwkJ6gPYnR5haJmWShHSjVJwm/EBXVGAmCZPli9iCYWgTRCiA9MGooK7mluBQHsb9BcXvcZTOUCfWwH03BxhWL8vCQYrAhiaAmh4wLh6ioN6hh811lZT+813hDUIjGyn30mXkm7V7AD3W50Pc5fm4vttq1a3hn9b43Liry7GxpJXc/yGTERR8i9HpXv9gNlKqHMwAmpWR/DRTXP0s0ur395/xx1Rf3sfG2A+liiM4neeHFtITNf3Xk1lZytLmTudY+VXqZR42Tmi3fFO3vjWYqWvXgY8yqRcyOXj9Wa/6VuSRLszvPbx6uvfPPdct1puV8vHxnD1w6Vnr2uAHZEAzVAAx3GBgWVfjRa2h1Xg/91t/vncrZjK2OHvd1ue3wOKRvrLrS7wUXblzv2DQjz++mEN+Gh96dH/CHRUV8/NayOne9hNFBNSKnLv+QFQ2W1d/2T1q3K53RmdWy88q9clF2A5HR95TeBmXj4YjwEJ/kMxp7NlOWVdXe/5y//UaLq+O/bv38xf+7bR+mA5+ptnIyfpAlujrqRIQ9O6fmPxyWenN4pWDZUjrOJEJOq/ncECHnW3fnnuwm9fVEeOvanWb15auPu07MO9SljxCzaq9Y7GgoOxNRh/lwb/h4NZgTXDDDPM8KNHTNeWkqmoqtZHo4Pu6d2Co4Z6r/de9JXA80ZH7yj/Zv3CtrXTt8d3m22jk/zF/Koi7zWtypN+40kfiMFkKjmorjJa/p8PAjLDONKf54vGzsfnl0+QTydge6co0IGUZlxLzD/drG2axyT8siRdjeQet4P90nTFLShm/ZjWeiAfm2mq9ZxjbhGwhwkIFjtRaBlpDXhRbnzys7Unn28/fHF44S/PSbXBzv3pg0ckZmz8xdm7Lw6BhbXc/d0KMFIcQFYUIaZPKSkIZkJ/Vzmm0dZl1R9k+1Y7a0SfPa8DZ43Mw9F+MZ3Y/uYAkGXp5pn5x/8QWk02K8DNX166u13xfV7c3k+fj3UG44wWIWySljE0ocLrO7tifP7PQsy0/1m8OLKfqTz7vwrXf90yeo5ViG7F1cLj3taZ7NLDVuXSQul1ufXRxYXHj8ubnbauq5Z1SiyCEvaC9IOfwYjJJ4b1DTwebP7y7PnfvqwOHfuL3s6VayVjoD7dqnvvClP9kWJWYL0bdrsuAriFzknECGmpLCG9ESRFaQYE8UKjkUkok5RlGRC94kVD04wkAbl4FMjFokAuagCFWB+Yi4+BnYwLNAY+YXM9QwVIR6eqrO7YAg7aPWCjtAgo0Rjg9DqEiivh+FMiUzGNhg/MpxOEnJYjYsc7NaDfaQJOt0nI2AnvoSBUApNdIkPIP6mRKOA7AFFNBfJRHTCO+JmF+qoQjxDGRNki0T5TBKLLG4TJWHr2EHBEJrUsA3omcN9El1YALZ2b7FRE04BiPAKsmTaQ1Ozwe5RiBrCWTQFRHKBT3Qes2j5gVg6A0UENGNVMwjaOenxEGM2lRKOAXlgAvPEIkHyfMKr+oG8DLxsuIJ5mhyaAofnAQdoGuub0Ke/PzywB8fMfTE4kQXlajRoEhkAtnQGUaJyQcxJpW6KRgFB3iYh8kYalyxIhTdgdmUCuuEDYx1DoxkSmvEilF4dMFyxXtgD4IhPLdQkZQZHXNazuE+bmz/DDx4IeN/a8A7sBSDIfrBf31EFjcFKVdelM8Yvu9zumluP99kU1ZaQ+Wl2pO/XDcesf9huKHPtJ7tZy3Bq61Y5T9/zpxJCCWjTWH7WjTSs4+bNagiNOxcdObbGQPKifng+ZjBlt62Rk6JlUruQnnm81bo9PZmjJkvSz0tK9I2GV5z+Y//pg/+hnUjHjSeeYVvpRrXVmKd6xg0nDy8m1f34+Ldomu7PZbQqn271adeNMYf9V/fnrKrD2F2fTMUNBGjrOQbVz53kZSGXjVklzK14sqj9vNhAdDy2AStvlLazcmnrm9/tV4KJe/HZcXs2kHz0+ANa02PNhC7ixVJxWVyGe/vbpzb+5cudF2XHcC8XcN4MD3/QA1/WBiC5js5FIdJ0t4Fe5vGn/9sQSRvaDv86u/9dmvmu3frW4/v/stNZL6qsWiaJGma5uA83e8OObi0+/POWEccPdCazQoXvTP9I0R5Wk/7CcddiXWP6Hvbbtu4CP/2j4/K8vnP3sdWdoO49bVWDubGI9lpUtqT+whmPbCZcW0VVZloDdaveEg+HHglmBNcMMM8zw40ajMdDCkBLf48Wr2tWPlk8UWIamvrbfEd/wNnRN6zebNeBKcX0po1adxlf15ld1IBZTN1Zi8aSmSJLUtZ29/mDgOoQTSEktUm8d01T1LdNL+DcLC98+PTlXuFpKDzPW/iDQbEUU9UZmYdi0N5809jmlIMtGI+ty5mh1tbiY/uZ4dQWcW8993jlWJTiuz6BwPT/fdjsxL/f7F8cE+wM3mH5qDIYfX1t69M3+2HI2ld5P/mJ9+0552De3j6dgyLK0fKmwL5mtShPYuFr8qrwPKFFJFJYPqq1Pz82/GpzkDq8nz//6eRVYT2bvPzsEFtVEw+2U0okXdw+AhbnMs98/f3PHga3PXxlLSdNypIEHDHsm4aSk6I48HzNEnZKQ905tOzSyt/4qu/Hf64228zSlLT/v7+SihQftSjIaeVarn1tIl8udA2uoqrLjnFRW9UL9XNijzBNybumIqvtaNl2xhKi/8tfLc+XBwt1wbvpB7+X55UzSK36x23A8rzLqTwPYTtOsL2wkV6Xi3eenkK/R92uF/sfCrMB6N9xe26zuQ3A2BQqkeIqJty4aB7RECuiNxoSCGDGVHxMCGkMHrH4HsAc9whzznGYA84s54MJcDrjS7AI7nT5Q7k+zsgRRIZihbEQFRLDewLKBamcAZOJJIJ7OEzJY/pHGc+JpwxkPCUkOYcdz+h3A6beZioRGky1EUQDFiBFquYT6SoyASKuX3DEgbNhir3OezyTcXBAw0QihCs3VDEDPz0+2UJjaoitNwB0PJts84d5E00OjtAwo0Sn9lo1FgCXHAzIRm9DGmI9HgeVcCjAPXgN2uwY43TZgd3uA1bGAYVcCbFsCDOGvNoaAUegQMjqBSROJUHDWHHlAtQuwW5eBYV8GkH2g0ROqLBeIqH0gE6kBPzt3dTLIvm0Ttq0UQjdxIsmh13ryeiKiE4rYRkGTR4/QVygMqq3RGIj1VKC4chaIlBYnB1GcqKoRBQamBbQtG/CtESGt6DsWYDarhNyV6J84w48R0vjkTfHapeJnzXfTVxk9ciVe6nftTn8MRHU1lTSUiDzA3h20H9faj2sA6+mV9XxU1qyW3dnstd+c4jEUbS06t1uXXrwhqRna1hf2zvKF9JwR1yUNfBev5Yy2+y1rENQCn+RXXr9sTwIn38S1uVL39eD5ccF+ciHuH55cXc0/Gb8OPG90ngeTdSdtjDVzWph+Vd7/5PriwwcHjut9ubUfXdDOFJeSkuo7vuf4siG7qvSy3nrYbwOSzI2by5+V9wAJyta0KHTHiaOrkCXpghFUV0Deipf9fkzXXzyrAhuZ9BOvBcxHjbZ7+tzZqDc+u7Lx+OVhq9xDpd0eEce2PMIQu6RGxyGpGmN72mX8RvyDoWe9GD0RfyruZwX9Zt0a/pu51H/da3ywmP6nl9Vba7k7T8vFxWS53NlrdD75aOXJ5yeVWNVeUA8Jwsq0HQwA/0glV4iovfDPplWJ6rX/uHrj1weDgWMDh+P2Ie0ra5miUnrZGIlkx7ehPOyV6Ynpy6Ov64py9s3uOT8kzAqsGWaYYYY/NSjGMYf4mcXsl63dt314gvPp/PjAu/36OLd0pIbZyOdKhTgGh1bvX15Vxc1fk3NLqVg6ohmq7Dq2h9yz3a1Wf8c7taVygL1BR6RinoqDnX5ncHp7QVWWPyosPri75x+vIVeXs3crJ1mxa2fmbne/n1ejOR6eLxV2qsG2fdk8uH6rZFfs3f3WyLQf7Z0syBAF04W5Ucz77DBY1wcX5r/sTQf8q736X184+2ywbXnO2cSCNYz/y+tgOcvx9OPNKnAhl9t8LTQSAT80qn/XAEZkGWjWe9KC3O2OpThjy0EPY4CQgLSqT5x9OW1u2b8L1mLq4//RvQe4vvlBMv6bxlBXOoCnjABb94C6HaSpbY/6k+hXASOi1cKsNWGQ7A8tUWBZznSKUJeP5bl6vndo3v35fNZxzvzzYVPItirjdoU2ET7YyBa13NhUtlqDve4pBTGQy0dPFFg/KS48vHOSsPxBYVZgvRvueChUTUFoUEJkQUUIe/OJ2KS+5QD1/giwXJeQuUlGJMAe9oGxkAHVy4Sh5MIQFywtlQfWigvApXPLQN8BqPcHhIor60hWsabIhAnpY9sBWv0R0FctwnAjYckxNA1Q8AHXHBHm0QufoPgptscbDwjtcsIRKXRmYS/CDKEQSkumCekT4btJGPrkZ7B2VQF00SDP9wj1XiKcySguEGbNe8tnCXk1ofoKGjGG7S/E4Av6UAjgxNNT8ki2siV4HUUGMjHR0mxAyFoJ754Y8Dd7uIuLtetIgGt7hOxR8NO2CAk5QQSKBo7iFiC4q0xLtFAEaNkKsKs7QCHhAOvpPrCW7QOZ+VXCWDWxPULuFvQQVJTp66MBkIkmCYV6gj/rmg4hPy9OCdEYQFhWG4PR5NCHgfhjwHQ6hPbV4DHX0ICSOFgiY0wwfM0aYDWFGDnHDD82tN2prFtTFTvtut136IhXE5nK5sA80g9BgsV0Km0YuqzYnte3rUqnf9AIyIZ8LLFaSkUS2liyK2b/Qaf1v0qqnNSMavv02iJpGGt+8v63p9RMWkn3Ksc2QJbllj44Ho/1XijMxycFFvCgUgXmLydWEmnNk1zLEy2rFVWWVGmEu9Vu3u4fEm7ypfXiA/Mk9/br5w1VThVjkc/KQ+GvFFhR0jV/CERDb2OvGbw77p9eYgZwXMCx3JgRHYzNhGGMLAc9mOsQFYwuT8VflyMLODtAwv46qy61nBqQkutA096HufK4Afr+qAO8bDZLiUivPz5sdq9fLG0/nfoSssVELdxVVZKA3tDU8ortuYMjiYDSaY7Crt2C2/9+Zc51V35XaY/CxoKH49bhuAUQ54N8tqjl7x8Mqv1jkbkD6ZhzMBuLPnnwg85oYFZgzTDDDDP8iWFjLf+oOpV1X71S/LLxbvpqSU5VQt23rig/KS1UtruVx92jgQQKbBQSuWLCiKt9z96tdltbwV0woRmlbCJmKNG4rqiyJ/smzsixO864Ouy736f26tnmai5TaZ7CZFzQs0+fnjJvuLCQflA5aU68eXnus/a/xqjxeWP70xurdx8cHi0ZD7v9w+53UUqKJJ1fK2gp+XZj79S9dTyv3D8mjIup2rNXgQJMBJMCRiwQIuXWC5VXbw/cV4PiSbBGEVXtDsck6JsOKj3bQ+JwPLigS+I5q+yMgix5Se25gc9UklyQbc8E+s4Y9KY5Asnz/Ww21uuPgVj2WB9tzVDDHkJB8pYPxWj8YNCtDUziwVuu91ZHYdOqQOWTuVhWO/+sw+P2MSJTFFuZXHw1vfDN/nT3W9axemstldm0ym92q/xBYVZgvRu+4whGRxI80NGw7OIS4OhRYL/eAZqj6TNHLhohZHecYY+QuwpixKt7gNOfZmsJD6CazhOa14ziIlAsLABL2SKgp/KAJ6uEjVFFhLfI3BLM2Xg8pTdE2wehjsrGo4AkyYT57CLz3em2AKfXYuKUFB2m4knC6KkgIjydA/RMHnAkBRibIgTPJ5TyiJ9C6eUOBoDpTD8TsGJGFNCTGUJtmdh+yfMIn4oEB6aFoThH2SMBsSNRQyK0ZxKkQ8kQ2AJNISkThkpFJcxqV1NJwMgOANceAerIJ9CbBR1PxSAIaksomcTG6MGGia2anieyB6C4LqBZCjAyJaBv+kDbdIHO2ASKyfRkSO1oDJDt6VO2WJdnjgBn0APSuRKQi4+BkeMQEnCj4KB7QHNkETocxSknxsoWwyuipY8I45K6SphxL9i+mOQCrjkkVJ65wz6AMmOwfkyQZLys7If11Y3z8yeqKwlfkSTneAmgycqz14EoKaZrZ/z0/W+mLJGqyPlkLKbrY9vu9M1qfVribBQShbmkElVaznir2TadU1z9UdVYKaWzhcjjXuVNk+CpWCgk3yywbszNPb1zuiorv5x4cXDsPr1STN/unXQdvj8+b+xcvlLKyhHX9B3Hd92TmjZNk2VZkhVJUqShPbI09vqde/bB9+qVdyU192A7qAv9cMozlgpY+bbroEi8RYZlhnkWru8BuqqYAzemavWRKSUpD+25OEPPjqhLY2cPeDV6tpH8QKU/kAqOfzdcaRRMGcF2+7IkWa4TkQ3P86Jh52ZPPVbEyMr0z8lvGS16QLfc6y8kVctzAPtdzQJG7nDk3ksa/PvlkiYv/+6w3z6SPduxB11e3lrcuHMQWAoa5rHaNHpaWuwPDbMCa4YZZpjhTwfXry9/HvbHXS6mHtlTXmcllbi4oO+Pq4okz6nzn71ujNzgJr0UT5V3A3rmRrL04H4gbbm6XDIG/sv75ZFvCgJBhdV8PDefNDKRkeTttTqPHwUzNRFV3phPZwrxkextthpDK4ggtx331UGTAxbzyVhePxicHtN1FG7klPtzXDrdMrawkL59eGy2yNAUJ++avVOqvffHk/Ypcqsp/qeWHUD3po9oahgudeiOZFnyPP/VbuPmv73y9B8fv1ljpYvJ5zt1IJGOHpg2oRwqZ8T2+p3z2ehWv38+k+3arTHnITgfftN7Ckz+BDbHCTAL+jL485Fc2XdL0UTHM4FxmCB/giOyxkf2PGxSmVA0wPEpGZm9UR3o2r78fiVQy65C9VYxadnnf1+dOjR9/ExiOuc4tC0DbToQP4bchlmB9R6Q5cAnKPibwgIQWVgHInPLwJODGrDd7gM9ywEiigwYgQjGB9zRkFDtZB7uAMPtV8C41gDcociakgA1EQH0bAbQ8yXAKMwBWn6esJGcli0Beq4EZLJFwIvGgOZgRBiJJMQ6EsKBOBUnJYTvT2yboGcci1BsJKQ/kiZz3CMplFJGtggI029PcFSeD0Q0FYhHZMAWXF27QUjACEpGcFeBiiuRAtpDEzjs9IH6YDQZvaNbmwx7a2SiBpCNGkAqFiGk5cT1SSSPB7tjuoArdkdEken6ZNXi8AUNFiUZUGMNwBbz/T6AlowCSjw2GYRAlIYPpAwdyEdlIJtwgWTKA5quAiiOAngxH0hGRXNJgKg6Fcx5rsPE4Ol5k+0UbJkQorlHDJ7CfCr8kn3TBkzHA2zPA4a2B4xdwWb5gOn6hO0Bxq5PmDIvLpQiEb4U8whj94PgGcUn7PYYGEj/RNP//oSxtJC51w0qqmTUsHLOsG8BEv5fbJS2nZ0H3YArrZndn2+c/82LgOnKabEyfWA9m3n4MKiuPllYePLZKVNs7cag3ZjSS2cW0oWVlK1LzyqN3b3O7l4H0FXl0pk5UvLdw+lE20Gjl7djy/Pp75C3Czzu1qKGOjKPVTFvywmPLkScyrEFXrtUeh/L5P8MoppqhArRse2MvX9NH2LHmn6rag0lGd9ju9b+5GerIkX92+cHl//qYvfRYfNIdnwyF8t9uHT4sgLk55MHoxahfTujR/YGnflIrtvfTyorXbv1+3bvrzNLY+cUMXhMu/mw3QBMNweNvJaG5nw02cFUJKleDw6xdLy8G3RHBOmEWKHoSvWDYiqlJkTebGVkLhyzTr4DA6cnSd/+Hys3/353WmO9HB6oUlywrT4osuxMxtn7EVydZgXWDDPMMMOfAvLZeCdtD3s2IEvS0rnkvWYZUCX+8kL+QXfzxOfLTkWVZHH30qSgVliIJGpeG7i1tvDkd0GNoqry5Y05qWeZ/bFj2tFUVEsanq40euP9w1a93KmXO0BEV86ez/lp42m5Zjvus+cV4OpafpjyXjYD/1ejO7yaL+3xjgJraFsfnFu78+jYHF/bP0WvfunS/O3KsXnDCyu5L97DMvl9sZiMXSwlJNVq272m3R85040xYF7Rs3o8o6Zkz3hSGRz0TrfCnYCqTxmsl83mpx8sC/3+V/sHH/98TdRYT15VlISy9pfns4aGjydLm/uNxy+DMjpWirHdAoTuPiEbgOrFgTsNdzmp9x3r992VP0/pI+dY6kpU/8l/awBuyVj5b7tNWZJeV20gaqrApWJxK/RLtnaPHaxee6TnopbtAHZYAfvhlLNC8Ei8OxieywQNwt8TPr7n7x1pDIDlOa7vi2fDmKo5R6pYSflBq68EZgXWuyHrhp6btniLLJ8F4mvngc1KA3he7wC7PZOQQshGFCAT1QnPe8mxCTVPdrsBjCt1oLfXJ4xicl0JUDUTiMbbQCS3D0TySUAv5AGjOEeozTLmVwBrYR2ILW4A2WSG0FEo8rEE1XGME8qlACUiIpcMwpR2wWnhq4Ck6Uyyr+JpQt2VKSlArdsnpFKOaQx9AFckbPW7hInwgVMyEiP0S4p1dUYDwsSvV60hUBk6wNgRDfgkoBANHoyWkgawkooRaowEbSaLgTVHhMxQuDE+IXclevAFwjI9QmiNVAUl2agycRpaFiBrGqCls4BsRCHgloSnT0TSr6YMoJIfETJA9ZjIvpKAZMQHlnIAZ3PTrogiQN863Ca0bQr/oCty9sSDviRPXhGJWYIITJQWgcRwDPRMCxjYQk7nErJWfcsF+rYPDCwfGDk+QVR7oBgTJ0NSn6qygn4XR/VtovWkEYEfBxU/QzYTY1GthHrhm9fmBYUTVZSPz8QedF+9+ZWG2f1w8ew3+w1ADjO4x20L0FSlcj8gt1YWs+7Lxov/72SeuEAxH1+8smhG1KevDh3L3X5UA5ZKidLFwu3dA8/zX203dE356QeL35SDaunR6+rlq6V3TMDBC7Me0ZXxEWPas1p9tZCoHgkvyOfie8czSCO6UosMvOH/SnpjJZVYn+dFf//x2xc7cq3RyDqgBchJ6S8XVj971bPeiOg8gaF8jKL7un5w8/L84yeHvs+Xewcf/JuV1tNmuz5wXe/Vzilqd1VVXodHXPxfSw7A40pPT6tb/cGVzPWGd7tuDf97K/fT9Nmi0gDXk6Kbo9ijagOIKLHH7Yzj964lN35z0Moa0Sev60DSDeqktWLm8PaxHHzfJ5+IlVtdYGTaghi3QvOpbU0aP/tpdXHgnB6U+jYM3K4ix92QnUqq0XI4RZk1ovUj7kv3RyDBOpK7OsMMM8www48RqVRkXJJ2wnvtrUsLorrSZOnTs4mn/bfSOdn4yVtApz0ClnPpXie4mWU9qVV+K+HUawye/W5z6x+frKNdOzcvHrha1f6z321djWQz8Qhg2e7m3cOLhfzkWxk/8rYFTlAbDa5cLB19xfX9YYGNtWA5hVzcnVcqx7miqxfmDoffgzV5J/JRI18YPO/tvX8Ihef7T3rbP1spvPOTd5sHt64sTv50PO+b7uG1j5ZjMR24t3N4mHLP/fna6vnim9+NJ421ny1VO8HOioeuWm0IVPqji9EzwH/da8wbNyWkkWv/rln9zzX3P9f4u+roUa8BzBlrrzsbL7u95Wjhy60+cE4qmLazlE49eVwGJIns+JRCRrSEBwitgm7IYB1NaujaSb4ndOmae2Tuby0yHZzFyLFM0db7uSX+uJgxWO+GEosb86tAdPkskFi/BOx3R8DTaht41hoB1YFIhIKQEhjZLuAKh2BgRrMJaRJnbAHCGDEYyoDpTPsM6j0fiLYdIFprAtFsB4gUqkB0vgLYHZF7PvVWJDYuE4qThMLJdAS94RKyTXFdA1LpLKC2M4ATF/5B0YbPIsxPD2gekfWVzgJ7zR5Q64+AgSWMdTKgyjKhh1EW3alskzCTXQiehBYtyLhCAoaWAzSGFrDbs4G9jgeMLABNBegkjj0CCu9bwXEmQ+0GKxoSKqWC9ot6BJD1OCClsoCfKxGSf/bcCmC1qoDVOAQcEQbW7zIRjenGZBDEEbX7XWAhUwQuDMeET40pwwIaQx8CNWrKkIHVlApcLSaAGwsFQO41geH+K8Cq7gN2q06ouAo4NlkhdBEKU6dQZQkFmGhqaYiAMVkMvgQIvlykCwbB/UfGTYyVYLAENShaAhhCGabKgC9Ee7LMNOYtA3DUpj/DDxJtyfIHQZ1xcbXw9UCEift/fj77qPtdcfw9L9CbT5rI9YcWkIkawgyXSUVffrn1Pttw+LLKy+rZq/OtqNpoDoDtp5XiUlrLxWudgeN41oEVjasj2wH2DnoTP/934NvOQSmTPJqJVen1O+r4g4+WTM/d7XUbnWN6+UI6/u3/hHPwVFxZ1p73jwVA/PulfFTrdu0qYMiRiFx80vCf9E/OCVrKO6ZBBb7obH96Y+3ps5ro/+HDlwd72aXo9fjSs8cVy3LubB8AxevZtUxKcbAHlqQoalTZ7LS/3Qmk/YahNi0T2K11li6k9gfdP7xuXFrLHoxa//dO60b2gzOpbt3atT0bkJDmIqtDu/hfdpueP1iNF1+X1b41+ji/fO/+oQTzbvSp0wU+XFl4+ftTpGxKKD6bCOAnLsvWyCIsnr+udT8oGJb3XkFkEtJ85IO/254SdRFF26xOvyuNjs0Jvm61blya33zxDh70j4tZgTXDDDPM8OPGRJsyl43vaR1n7AG/PDf3sBtM0BiK/Iv5bFRtyOjfNrStsBqoWx2IAF6Y9y3a606q8+HY/l7N3vYfHS5fXexqim27QG2/c2FuucYAqNZ619YXvz44AKrtfjYXaZnvICHGrpNZNmrt/tGnhbHjfPlGw0GB1bXUfuPkA4GEP5+Inwigek/Ede3l4FjF9h9XM4fm7VY4s9enA5VCIrLqn90ZHKuxpJP2u9Phw2eN7cSicTO50Dgc7VTbQGs4+mK4n1mN3MjMV7a7lVq31unXOm9l5laWs81xMJG3Kmf2/RDVJQAAIABJREFU6Y5ct1KLnZuPvugf3G+177eQpZX1RMxyvaZlDh0X6pqsXE2c+8Pr9sgefZxffvigCnyysPzgmz0gl4zVH9VOXV07DNlPJAzRb1FTFRGO1bEcJSywurad0a5WzTvfPQKGHMnrF+42vC8q02OX0CKx8cKDdiDdO5PKPXh2rJayXfd277B09vsI6f+3Y1ZgvRtqPCW4q9jaRaAn68CzWg143hoB2x0X6I99wNAkIG1MTV6CWBYcj4hiEgonNaoDRswCoqKHlCkTuMoCysEWnQd6AK7gw8ZdwBPPOq5LKJcR7fm0dB5Izq0AqjIALM8j5LEE9SrIj2QxS5hB7w46hDyToEyE8EiJJQgpnLHtAe2RSRi5JBgsQYGIZY4sB0iKOHKYbKFgrYTSyw86JE5HxnQ9oG/5QG8MMDABdBUgEtpyh4GYzCek4lRZBHGNCYVfYq1KELUVATxVJ7RVikGQlSgQW1gHcusXgHGjApj1Q8Bu1Zj0ChSGSlXcX3xCfiuazACX5vKEdOBKakhogRRI6RqwmIoBZ0tZwGscAv1Xj4DR9jNgfLgL2J0WoXdPNgzCpK5jDj5psgnB/U+cTmLwY6pCaKmRJZeQo4ppHqEoUCzLUCRCgeBCwgDysQhhGr4nWrEKBisSBzQhIWh/V5uwGX44iOiKOi83u0Pg1mL+8fCFeD2laX+14ByatzsOwFJC0+TLm90u0LPHCT3Zt2wvrKkMXemF/yyAZTnrF+d2H38PWmjv0cH1f3f1zmbwlc1v9878dO5VpQmYTXvyscVo6p0FFvCgdfjp5dU7T96d2Z2MGfc6Jz92cyGnxHrlUeWX82d/+/3ZjvO5ZNmfFhl/s5g/NG+/+THLH98qjHeOc1hRJQLvO43Vt8wvGjtonLmUnVdTu3vdarvfHo0/H+1JOhc/LGYxdl43253Ty8Ro1iDc9bvPK2sXMtu99kFveNiXfnHmQttvHIwanu+9CnsI5vTEojG3WTF/vV+XJenTfJCqemth4dHtfUCWpTUp/vKNPpJALGlUwgI9EteCAksPCqyuaWaPfPgf9jr/YeXaofnYO97YSELKaMWYUmiZ0S9r7aFzjIlcjRdbreiDRlBdxTXd6KjeaT7N+uC9zAR/LMwKrBlmmGGGPwVcvlj8orkLZKPGSKt4lgckVPUXC6NDcxp95Pj2RkLfDO9oUVXpW7Yd3v9S6Wi9OdiqtxKGapoO0E1qmflU+/Dd4VUT2EceD3yfQiQqNPZ7ey25GDS2iyrHqLG5RLRQGCiSXNTyn7/uDO3p48rdYXm5mNqrvWMDzq/lPu8em8/SVXmkV1vDPvBkuHmxsPqs/tZpu3Op/IvuyZBQ1/M5okGKa07nvT0f3f6/5vb6qtd6RUuKc2GpkPPjr3dbrd7oaa0GyEnp7Hq+oEWHLXN3ryWOjixJZzYK39amPkrP86jI5xfym52G5/v/9LIKrGaWS/GIoUq26zcG5rPD/hO/Aawk0rlR9M79MvDThcXNu0GmxkfzC0++ONnjWWD1cunwMFjdUAkOk2Qg2uf4xwPcTc/92+3+euLyRiISUSTXZ+j4ddN+3RuYngtDmJaMuqyeiy91+srXL5oQ1OIriXSso786PNaF8MeCWYH1bijxdHTpDCBlCsDLvSqh622/5wCtgYgaAlDk6ZVFkYSmSiIU1shGDNDSGSBSKgCSLAHR3BhwTBfwHBFHBOC5PmFTvsCj5/iA3TcBq9UG1FQV0JtCldUA4kvrhCSHUICJPokiGElIduKGDizm5whNap5tE5rXRGaV8P0JKkhc74R+QvzeEwnyngzETRsYmhaQSUYBSRP+xOnFScQ+CVpIRKvrR3opaiIDTBFsH5OfeujFFdFiUU0BYkfD4scDJgH0gjyTZcKw+Fq7Bxz2BoT0myDMNFkG0hEdmEvGgMWLHwBWqw6YjQrTaHshApAAZ9ABxpU9IJYpANeXisC5I2H64qAnohHAateB0YsHwHj/JTDefw2YlT3AajUBzzQnAxUwWGLwjSghkyQkcb4kEzoWBYcXEfn1ESGtmzJ8gqoUzUnE5VIQosaRaLF8PAIspBOA6trAaDR9FhThZ4IWZXvGYP0IcO1s6ctmIGb/cCX2uBfIhv5mydgfvzjx4bg2ZZLEGeuEseDxhA6MTPv6zcWnX+wAh7VurBC7cm2p9rza2G977neVGJGEsXJj+cn2Ma5oEhtvmk4xkaj0+oDKMfX0lUXjca8MVMbtiyv5Viu51QpOvJFj+wVfbyrWd666q5zU+vx0MffSCvbd8/2VrP7sLY1nPs6vPH1SP3Mu96rbPPp6x7SPhAbgv33Wz/dTMC0CVmKF2y9rb4R0vi98eNauQ13NyFfX5/Sx+vhl1fG8zXpDhG0oRSkXi2cikXKvf888OZF32OppPeXnl1cf9SsdywR22v2dI1I2RZKuZObiY/3h80rVHyqy/HFhcZLd//Ha0pPfbb1t27phURWLaU/rwYBWrOBgaaelJ2z1B1tvaNQmyBnJeb1gm9q9w/Y/7U8r4KwRvRwrPnhSrbr/mundHwJmBdYMM8www48bqiLvSR1RxVwrZZ/0tsTrH+YyB+N7b37e8SZt7KS2aXOEc/KM4Ab5bbV69cbCq/tlYDg0b786REU7l81lYlFd148EOAmYttsbmJ3u6P5h88RbQ2U6uSOHNcfR+3AuajzrT8mng1GjmHbypiEcMMCrbvPTq6uCaDkVsiRt9U+SHLoqYx/5+y196+aiiRfPGqbt9HasM6vHaqydTv9mPiuSPIHPKuPruWTfPfnIkZGL/3gwJdg0Wel24v67sr5OQJW4WMgYmux67HcH9aEJOJ4nwsyKZ+LnI4Xnrxo90dbd92uDQe3tE2S2495+UNZU5Sery0ZMdmTP9T1FUlRfssf+9kH75V6wmxcLebnhTfpnf7y29Oz3W29b7IVbS9/sB9XzyrnsnUYVuLCSf9ALOK3lZOx9drtopOb0gmWqr1uDJ+XBkyO16UI8uRrJWD3v6Vb9tvdDb+f83ZgVWO+GGk/GFlaAzUoT2OuKxCYb6JpT7kr4KqKaaPSmAHFdJXS0CvpBqJpEmLjQYxlz80zis8U1zhO6JcEnDQGnPwCc/hBwjzSbE5yWoECEDS1oITceEfr7hKlNhH27vsh2B4jrA8J4dF1kwQs3omDdxE9FhSCW6SiE3EfQJCYeYVM84QoU9j1Bush6hAkJJBrkuQ5hbFUyogPZiAYUYyYwtHwgqgmtmATMhTbyubgGFGIRwqaKdrPCJCxeRG0FZKEMjG0baI3GQLk3BMo9E+hYUz5QHKa53hBoDEbAWj4NJJbjwLh2QEgKuqPBZJCFp8/utoBxJUJI1wkmwHMsoBUEntUBq1EGrNoBYNarhLorb2wCCE2VoTMJzU9nAS1TJAzrFyFkneGYkEQUp0pUU4GEMSUChRhO9EwUPRnFVsmyPDklDE0FFDzA7nWAcadFmMglNIAheSke3k+JUJrhB4VSPl4ZBfxEOm3WQlH4aqJVMU8JF+jawb9VVo8fiotPKHLfDfvY2I77eNC+9fP16stGvRKUFLbtVmrfj9HMz6eeHkwplvHRsLoQ1+bTz8bHnHo1s3NxceGr15ITxoh/0di5dW7p4Vt0VMVsbMc+KW8/kfXtvYX/2lBz35ploDswl4apE+/m5cJBePuvjscD+7yuPjrqjFuInP3dgTx0pqXc+cjZf9r/HnovWZJ+eSH3erRft7fwQUJJc7EQX4oUTVP7ardpe25tNKiNBvGSfiu18OJlszt4L2ue7bgPX53sgT3BuUIu6xhPHpT9UPj7ydLS47dzV/lScnMUnB6LC+n7rZAPTE/Ju7mU0Xn7pq3GiykyO03zYbn7kOZk91cTmTk9gUm51qvsD5qc0nEyHTEy0WhjMOpb77XvPwTMCqwZZphhhh83ms5QXMrXs8kXYepVRter5sn0diClZf8QKloWjcIT2oAmBfeCcrf30ZWFx4/LgGU7X+ztY5C9kkpGjbiunZjz0hVZRlJlWfbA9V3LHXZGjumIjs/xdCRaimzWW3Y/KG1KhcTrMKTKOxIkomvem3Lwl4PyL86c/81mUJz5sEvnzf45TN5+A9/sNs8sp2pmF9iIlz7fPkmtCeweSfl6sl376Y3lbxpTydofXjcvrGYPx8GIfVFrliIbV7PxtO5arrI/dP+u0j6axnstfuE3b1SBhWg8p0c3O/VTo7T+fK34oHsykLNtD9r2ADi3mlxQFz7bao4dZ2Bbnzd2cnPRG+r8/een971+J/Lx2NlU1mxZL+7VJgRRzNCvpnKPP9t627dS2Zi1bHTqHSAW00cZ3+l6wK0ri5+3ArWWrspd6ZRZ2IiinY+t7jSdr190IDigc9HERixn993tcqe81xedmgSimjqfTGb0SERSfMvvd8aVWm84NOuYsah2/eLy140D51/Vm+h/M2YF1ruhROON/pAw/6k1dggDssXFJqoDxDQJmEvIwGJCB0rxKBA3DKAv0rBiCcJEeD0/TygbCgQ3IuVcxCDZFmHYt908BKxaGbBE7PigDwEnJOKaxAXGt+3Jd4UGiyNOvZHjEV6I4gMTyPVHwHo+Bzi9zuS7ghDCnyZXRWNJQvFTTFMIWSuxtNAP6AIjywaUaIxJenvgFfIJfYWCmcvm5oD5ZBTomg6gySYh3xZRpyMJnMkmgOVsCvAHXUKFk+jWJ7ZDOiKbtV0PEO1m22ObkHSsj0Teug/ENBfomu7k8wJnhcUyUyCk30QqleCxfNskNEIehdg13xoTStnEkIq4MqfbAuy+4MBEJ0QJUCJRwjaXRnEBMObXgcjSBhBbWgfapgPU+yNCq6ZgMMXhEDRkLhEDvPGAkJcK+LagJ6Pob+8Ctj/tfihe94/0RpQkBZAjUUBNZZjhx4CBY6UBOFuIPgzvU2cSMf+NukNCGllnhk6g5h6Mgn+ZiDy9Fzw3mwtzqXJlOufV6o9a/WmIdiyqCzcrMBxaJxM4JYJ2KcMhW8femV9Kvw5z2B2m/0G2b526Xy9GWwuJ4iRhoTrq/+zCyrcPTiks+kNLiUvu8S0ZOk6jkbi+ULJ98/6eNbJPqczWE9ny/rH4g+0X7YWlZHkYKsBc1xtmNbVrhwxYdTyulk+xB2qyclY/e7S6UiTpw9xi82B0sN/rYV2YL2oF+WHrGKWkq3LZ23tjYVM0zV7T7J1bTiXduc93a0DTHDXN3Y9vLD96WPvuOkOCuVSiEI3FZE3xJWfs1qv96n7vEcdUTWfmctLe6Nnm2wNpSwlvObpXbwO6psxdyjysVIHzS/nb/enG/8V64cHgZKV4PXXmwf7o13uNySjdzC4MW87mi8a3lMUobeSyhUhMtaVx32o0Bo3WoErrVA5wOLLv3927cmvufuWtzNwPB7MCa4YZZpjhTwTjIzRA3bQX3siwyms3/z681a3H5756GfANhjOVnHfGph3zr320pHqS74GCiz/ynJ5ldkyzNRwNOFIPZUgZRi4WzRiRqKQO26NGbdjqjHgDCwvpV+Z0Fm/sTcsdj9OrhLFrX1+IlTen1cA37f35TKrWPqk9Gpj29ez83eZJyU65NxQKgbdhUUsd5U6A7tBcaafjcXMQpCLzoNK6tbA+0itN661JVGcTC/Wm/i9HZgavZecGh/bD+9NXtg7bkaa2vH6s13VS0zv26dTaUdTMbp3eL8+d+23Yn/urxt7H15bv3T+9zjhfyKfG2s5Oo7ff7/HWzQZ+ura49eW+ZZ3GCwJw5tr8ljto19tANKLNXc6K6mp9Pr2lt0S/Z1mSfnUuf79/srq6Fr/w6yP5VR/mFjsH43u7FUBXlGulOWXk72w1q3utKt/DJxiXv1c62x8NswLr3ZA1TQQpDWyH0KilyRKQikiElq58VAbWUwZwLpcEVnIpwGzXCVVHQpMkwsSVRBow8vOAkkwD9e6QkHQRUbm5RBSIOGNgsL0JDHeeAebhLiF5ExrQohBQaqIln6YYgCJLEFy9xkLNYLkIdwy0R2PAdEXeVRyQ+joTr58ISR/2gFg6R2g9E10OxWOrdcSUJ4RBwkwXjUQJlVhC3RUkYAUM1gAwPBdYySQJU5+EHkvwbVFVAUqJILRuNZcCEpIDjIIM9NpkUSERGJmsQjxfCxGG4KtEi0Mh8xK/i6kGkR0lfFXpyBjIDkbASi5NqLWyFfXExnvj0WSIgl0Tgxbkco0AdziYfN4djycbpBgiIz4KaJk8EJlfASIr54DY+iUguXYe2G10gMPeEOgFzR8BUoZOmMJVTMWBwf4WMC5vA2ZtH3COqMcERyXkdMKlKHRjgW9RjxKSjko8Bcgiqi32vTtdzPDHRcWc3qp3B8MP8svVMKAhpWVH1sbfh9JmVVIG3Zjnm4Aqy/vHUxiGlvXVG2Gehqaszmc21jOSKrl4Lp6EpCDLLtbYK7d6leYAIMHcQmIlmdIcedSzut2RrqvpTPTRoNHvTdUzPXv6uyK9tbHcq/FeVEtMyCfH81ZWTymwAHqSdPpU4VuhyvLO3ima7N1a50Z67lt3Og91p9zIReM3V0svB3sjd1pfypJ0Jr5g9rTPN9t+2CkvpRmXjbl7D8tvbszYshf7SVXpvXOGy1Bk0z32GR//0WDz314494/Pg7L4q8bez6+u3X50MqXs04Xl+9/svTO7LJuInY0kn//u9DgGwIhoGx8tfb2zL67PmXQsuh55VK0CF1cLm1JdzFfENPVnZxL3uyfNqtcT5369WQ13R70RWbj/4BCI6fqHudLrZ7VnO8E2zudSC8m4joztu5YDyIosabKrStutzpsJq87wx9EhdVZgzTDDDDP8iWB0RGrt4/+XHe3T4k9yEb8+5g+HnaEzkRXLa+rGZwfBffrj9Mrt3bfejjVVuXqmODacx+3qQ++QDroqLybjMVVRZHlo2Y2R2TYtopTOxRfVhGwqL/aalTDTEg18aJ3kJxrmlFhSPeNtax8448vFpTsH04Sqmn26de7JVu3T66uiCeN74qfZ5W93T/ep3X9RubE+/1SpD0Meqzkyf/PMjCrJq/PZmCZLkj8wvZ3u8A8HYkeCRmc/zS3vve7c7b/V/vbqoPnx9eXJdjZG4+tz6ap5rM6TJflvlmwf33bn/mG/eXSq937vxacr58VcIXB3UM4mo63eMcrwfeqPWESfH6vPH58+O6nqyvlbyy96na+2gzr77NnivjLYrzeBW1cWv+7tisiYD+ZzfrT5qLt1Ygm6rN7eC6ZZVVm+ForGLpeKw+3hvdd7wFIutRxP1l406ncbLzkZQiYgSXzyZ+tf7e4fnf517B+BAItZgfU+sF1P5BoLhiaiSkAuogBpQwYSmgLMJ3TgTDZJGN4t99uEZjRhdhO+PC1TAOLLZ4CXtTbwcPs18Kw5BCoDb7KuQkwBLuWiwM3FM8DKxkWgt/kAGB+8JpTaCG5MCogWBzCMGNOmddMuh7bnc9z3NzRtIK5PFWBiCSKtyhaB6UYEWJhbIeTwRJ6WyHMXei9dUQh7DgoKJNCW6VFCxgvfI6RVBLeXL8wTWtvmRiahP1FY5LKJqDgKXr8DDKt7gFUvEwrURAC9WJEXiQGuNQaMjEqYFBXVZCCqSoChAri+oB4hZLkEFTe2xbDYk90MdkHVCf2JQQy9bRKSc4FOS6idRCB+IGUTeimZUGslxUXsvohDywFGaQmILJ0FYusXASk7BzzYqwK7nQFhdH7Y5VAl5K5ihgaM6ofAcPs5MBRJ8XuvCB2LwoLqi/QsXQXUWBxQU2lAy2QnJyRSCVBiKSa+yMiRCKAZfoTw8T+rnbxvqZKyoZ39fRhVdTlT+vbxW+XSH16Y3/JaXw52GbCaSVwoRjt++2DYHPnN4JYewYhwzUgV9ZxtaXf3G33bSS8btxIL5YN+uXG65TCiKx17KmNqf2dBkIsdMzJv99uGqtnOKV+586D8yY2VLxtv1RIdRUI3tl9/V6PNR1u11bn0MG3tD6b03sh1v9k/PU3rQrqodeT7D96tDXr6vJ5bijbNYAjn9OKJAuuXC7mq+Q0Ae/9p7YO/3T72bkPaz0aSrbFQrFo31udaD44VWO/sS61r6poT2X91Sk2TTEdXrpU2250vD4KaW5Hlq7cWvzrcd33f0NRLl/OfN7YBVZJ/ca7wePDCG59S7pyNL/1zGGr1cWr59qMy8NPFxRffVmzHzSfjZ2LJzdt7T7zT66oJfJ8nv9/66U9Wvj4Spuq/d+PtPy5mBdYMM8www58IFqK53eHp/eME8kZSGuZ/fxBUVzdziy+ftk5tQgJ8eHH+y/4uoEr84mzp8fDFg76XNfRfLGRSmukz9rBkdJlI39Getms75qBQ0j6JrT4ujz5v7qgx+ebSYn1/ePBGmaXIx+YE75Qbt84UdodviQE9Hl9le24xlmh0T1FW+XD3/uGnV1bvDw8nCqpToUjSBT//qPddYwXsVDpGU/n5hdV7g7cuUJakc7FszIo+eXyKLFuCqK6JZ7YJBqZ901j4wgxIrBdVU4nJ7pFmMt/Uux+X8h27Abh++8QQdOzhreWl34RirLudci4RbfanBasWf8ed3bIddSV2LqEfvGri+4lMLF2MqwmtYY9fVZr7R+jM9dXcOM3n5T1gtZS2c+5XjT3gXDaZSg8eviG6mg6LG7CSC/HkvScV4GKx+Pz2oet5S/mUXrafPdoFFEW+vFHSxk5jpzloDYHCWj6+kH5+0OgfiaJ4dns3eyXdCu0OuqFyiszvB4dZgfVueGGaimCDhE5IOOlE+FA+agDL6QSwXswCg/3XwOBwh9BEJpgb0StQEAPCFCZC+X673Qfu7frAbk0GLEsG4nEPODffAz6uDYFfrWeBP7v+M0BNZgj1WIJQCRgs2wLiaZ1QrJPUx4Tt/AQ/JB4ARLdEoZoSAd8BSSMYLHME2GLSIcjHkoEVQbqoCtAdn+ScRNiSuB4EPJZuAL5rT8ZBBK8LY93Y94BIPAXEQ8UVoYzJOgyuuVa7BtjNKuB0m4Q0WGBO9H1AFtnuwwEgey6QjUWAYmwMDKzpI29PMMw+QFyXCU2LQk4XyMscB9CMCKGrTmi8ZM0APKFkElH1QaNJcc/QADkQxkUmQxcMRSQGaKksoOUXgMjiOhBfPQeIRm3Pdw6BV60+UB7YwMieUqcCYn9FHP9wtwKMD14Bg9dPgf6LV8DgYACMRSSSD6DHAKL5DhCZG4abhhKJTw6NpKqTQxYaVGf40SCjpHc5vWiQkK4m1+/sDlujNiDBz/Jrdx+U38Z2bCxk7wwPgKim/mRdf9h/Hle1v1lKVMxHfdftu5SMREEzLL9bMUc9x1xMSDcLa4fdyJetl5GM9qv5jX95Vf+6safG5J8uLj19Xj8ar+C4nirLEx2S56OaGTi9wJLeEFbFo1rj7Y1z7jwuz2eT55eNe81TVFCAoag344vfvkd/Q8C03duPyvGIfmV1zjf8pjNsjoeSJKV0o6QnVEfZ2e9s7/WClrEhNnLZeTV+uNuuNwbgfLBRVLPq7cPpGu89PTx/Ob/ZaQBb7d6vShsPey8n77Yta7u7dDmbrVvbqpTkDZV62amokiwS8seus7GRbT6YLny731Fk2f1OmdeD3UOAnPhrQHPAcal9OhlduZT7pnzgNn0Jbl5e+HZwMO45Ev5fnp17MX61f2peRojGIHh3Tcl+65UjqmrvjV3PW86n/VeDRmcEXD+/UL+3//Ifnhz94s79Pe7v5RYzqbXMQWVK3S1mk5MCSzFOpjP+MDErsGaYYYYZ/kTwomLqCdXyTt751mIlZ5j8zfNgOiam6VfV0p373yWDzhUiT5su8GdruQf954as/GrROhhvKpLyq3wpwQPTvS8+eV6To9r5trf8h9YuuvufVi98VpUfDp7/2dmVr7ZGI9v5orl7/my+u2O1Q5bFtJ0Ps4tH46a+2Kv/6tyFR4PNN6MlTPvk3VRX3yqKFzhs9Q5bvXOlQn4+tm92dvvBfTqlGRdShdre8Nud7xcRPhhbJ3KnhjiHnKIGW0mn54k9eVSuelPZ2YtXNeDnP1n+7DDYZc/3qUt6JOj/88VW9/LKMQ7vWbf7rIssrXj+KR7Ahtm9VNp4WAlWcb9fSUaN3iigfMq93qc3l+/f/q70h+9AKmFsXCzebVYPDvaBuWw8vRT5vLUDFGLG1WX9ce+txNUEO+0BoCvK5usGcK1YerJ9ABRs9ZWori4svPjHJ7in1/fNg/blG4tHC6zWYMpZ9aXvoid/OJgVWO+Gjy+isVOGBhiCnJAAkoYOlFIxIKMpQPfFI2C0/5IwvPv/Z+/NmttI8/TeX+7YVwIkQZCUKInaVSXVXjO9eKbHPnacE+Gr8zE9EfY4wsfununucVdVV5WkkkSJkkhJXAES+77ldi7eTICkSC3jme6qDjwXDBBEJhILkX8877N47X5HNVKOg+/F220PgeeHLvBqQwXyuy8Ad3AISFoM2MpeBSotGxjaNXxv4F9duAa0XBcwj4SGiJQpAxfIRIJAczDCFxWJNCzBvXm3F+Hdig6e0cyTGQ0HgDvoM7ahiettC0ilZ4FYKAAMTSE2koCArgHusI9P6kiaDkiWjs+uib1Z/c54b55GTSjARJb9cMA4XhzsTgNfd+UlPFkiTUoebyicfXavBYyaVWA2mQWEhE6wU1F9CLRGJw2hUV3F7zoUtxQSzoBIhApFATvcHT8ET0wmiwcYmDxFuJOjUlXGeqZgBJ901JJZIDC7gB+H9qJUAzYqTWCj3gd22xbQ7E8+fZIhYVZ1AJFCJCgtkTU/qhwAg2IRaO92gOqhAvRGEiBe7ejQBhTNBPSEiU9kStokjE050n6oTBmsnxq2mu1ret6Itgv9KhDRAsvBuVZH/e5F2fWzFZajCbWiPKy8RSo0wAaCirI12gH+02KkMHgwo4d+Fi/2zftD0KXgUmDZhabdrIye6Tz7D4mZ/eG1u93nH8wkt1r5p63d2+fm72/RN63Jz25kAAAgAElEQVSNZnUxF4/vB5pdb8ZqHgxDQe1oAPpvNks/W760bb8a2pMr41ro0cFJo596WuHd69gpNXdKTSAdCEdCOq50WG8/4j0y1t8LmXB4xYg/flKs2ae3xTy4u/flnfxXh3vjw/v4+sJXjR2gOzIPKuFEPNw4LuF33DNZqNmYtua/hp3R8NaFubtrk4n5u1Lh8lJ6a+ctCqeT+5yJZs/FH1ZLYhBUJOnDa/MPusWdegP4ND/TlItP294RzujGl7PhITt9uxtUIi+bcxstj8ZL6pGngyFwJZZ5tlMFOsUecD2fffnVPrCyNPPqfz09a7oSGFdYAol0eLfunQvCIePZa8rCHyd+GjzbFFNMMcUU74In5caDV86wlrVb89v7wX981vh+vzJuKf4wlWtvmXsV/1xl6J/P569Iyblm4KPo3LnkJFpWFE/Nx8NtcyAhNa2XwBdxtW9uAx+Gb/9tSFnlwWUefKps/130wrnA6sipZLX//Xki0zLrF2KHEVV90Sl+uZwUO9ztNleWkuP975QauV58KXoszPaft0v9WvpmeHUukAwq+nIo26knhZr7KFTtLQzWCXQGo4Na56De/jeSRquy/GVukd3R2qOC+8ah4cG9vTtz8+Nf7z0u3knnxOW9ZnfYTC0EU+94pz332CrpD+3CXHKSq2I5zrbSuXZt/rXtToFhqNdv5i7cmd0KdL4p7vVGI+DKUnruSuSrxnbXHAUV5VerMzv2i/H897fz2evp3cPRvcaoMrT7jVH5cnySTZXRRfAtEVcH5qPR3f0GEPbJyISs2PabVjA1Qyseoaxmrs2Ml7JXrmXeXPv948GUwXo7JAjqKj5vJD6oApoKJEJBQBp2gc7WJtDf2wQGxS3ArB7idwWKlCnBYwlWRkvF8EkU4bGdrXUAq7EGDDo7gCSrQHRQBuryL4F7ERtYirWAxUQDyCYz+JlYQpZktuvAoFIE8nOL+BSOOPKmF6ck4edXic4KL0pKO6LEEkzSaMA4292ZxH8LhkmPp4BwKAJIqsLERmf6Tx6yqgKuquPLm7zocNG3aFmAfSS3Sqi1vECpgff/7PQnmVJCcCboNFfk1YtDGk1Ir1G9DMiKBpzPpoGIoQOZXh9oDUbAwLLHhySMkCFNHV8WL42iBwE1EsP3BnrvClW0B/bwuTRBB0nyhLTzOKFQFFCjcfx0+EAqAxw0O8DOdhF41egCLxoDYK9lA9Wu0IGB73wMG/4T6tOolnhOuq3xG8Bsd4FBVwKGpgRYrgQouICqAmhhBdBiUUBLpPB7D8VPNZ4C1HAU/H7NKX5qcFy3MRxxfCyR4Ivk8v21iejq1uxsY6vz6KVHqDx9erAwnwjo6kCoDyUZiOpqF1Zika71KqLqjvU98GH4ds755si+Xc16ck1SZiKffN+5n5R+dzP6s0ft0t8tzP/9dnNzsJUJpcu9ATDSjq1d7pabkbZ+51LuXm1CvZR7g19vCpYrtMUITlkM0t9zwPq3gwSfzC8cvKw/+O6drIvAzuPK0oX4TqMJuLC5Xr9yKfO0WQa2mu3qQL+zvPi0/fa97fTKET3V8eXzPcuM57XD+mSFtTMafjcqfvLJQnWrfVg+RbOWSoRy+YQZcNcr5W+PvATn5hLBjPZDrUAL4FomEYi2HrW9mKukof9yjsLg2xN705XJKxUgCF2gXh8Ai5HYY9pAYdPTeTV23xIreunfrd597h3SpQ9zd7e9y7lc/G5psrybigbfvJ8/L6YD1hRTTDHFXzg0WbkTyh1dQvp8If/4+33neB/yfrFx+07+68M9wBm4QLNvEvJMFSFZs90BkFIGp0Wv21n72zll5cDevRhoPGrTtF7IUnZgmxdSETFg6a+dcTqD0eNH5Y9WFnblZqn/psDxY9Df+ZH/W2IpkUiPjMffn0xkfTP6AzNVk4KG1jdNYGhapRfdaxezTxoloD0c/e756OfLVyvSXnX4pl5ty7VvzMW/2ZnIth7WDr+8sXz0VQa+K+yjc+FmKmkENFcGXIm+a5W63d12e7d+zIy5NBuPzxr3agWn5uK7R5/2XlT7HmOUC4U+TNcKg1NyPQaWMRbjiyT/oKrt7DYBxZYATVVade8Lcyh1ZgRMIBJY/OuV8XR1+ePFBzXPt5Gbi9cjltmd0FfL5+JveIr+7JgOWG+HJEmC/JAMAE1V8BmsYbMGDMpFYCgimsoFfEHMqFrGj0dS+2FADoaBUfUQmFm+DMwENSASMIFDVQc0XMAye4DrWICi7gKpegEo1OeA/bYJ1LoDYD4dAo/OEWSGyF73QpiQgJW5PH5ylWhUFBnBwhfpCXEUBV+CI8xugoZhNGBMDrVdwHVc/JQs4TQU8d+KERzvx6vqE8Y0RcW30QmJkiNJjEVLR0vxLJG/NRrfo+P1GPoUGhOWyONXxOUjOxQuQlOp4GevC7FXKpYCZuczQLs/ADrDESBCoq0jfLWI0bdsG+gNR0DwSCufSEK3AuHxwxdU31G3oKdhCscAXSyCGEGg2u4CG3slQDR47LcHwF7bBIodG6h1XaB/5Hu7UFCJHK+IrgBhQwOsIylcXn69LAOa4QLhoAOEhFMy4gDReQ2InJsDQucuAKHlVSCwsAIY2TxgJDOAFoniE59T/NSRDYbTvcgPzyYnxc9yC2vf750q73n0YH/pSnyn0dw7bEkR9trdXFQr94fZkGS63vtBc06P+gTnohY8sBlYj2Lq7ZbVuZa4sFZvhgMeFeoOT18+W3tZigT0z1YXv63uvssqXsM+pQrwT4nZaOS8Hn+yVqz+iyqH94uNWzdyf6x7M0R3aO49b398deH7qjer/X67GDWCny3NPeu9et2yMEYoePI/9Ov69ufXlu89OWlfeFF7SxvP1XMZN+o8rB24vrrpeiYRjnXXjnQLXo/H5iLb1dEpCjMJ6XnT+8zSZfVxqQmcj6ReODVg0DHxT5oCWvK0AUuRLtw5V5bth8+LgKrKFz9f+s6PGL24ktmW243u5KXPpaP3m+9nVvgTY7oEMMUUU0zxF4t8OB5uGC8Lk/NrLhZ79uDgLPG0a7sLagSoNHvXkrOW41wILbQtc9Y4VzcHIe0S0JTSZ92dxhBwXSuqGkBAkfGzfCXY3j8z2LMzGP3w8OCmMr8Yfjsn8bRRys/E3nqzfzvkpcijh/tvzkF4M9bWCp/P58e/Dk1r7WHpy+Sy6q/Lt4ejX2+U3c7steh5idNF/S97hZB2jCVx4evm9kc35xXpnXwAhqbcvjKfvxr7wSw8qB2I6Taia7+6lKlrO9tHMtWShp6L7nWs0/X7Ke3OZtvj2y6Hl4WFKyF5Lpl+bwS0+8N01lOJPdgonv+7Kxc+OTezlMospS99dv7q/3UtfCe/Vm0cltvApQ8XgjeS3+7suy7JROjaJwuPRhXR7SZwY2W2lRgM7TdFRfzZMWWw3g5FliMBA5BwAHs4AAbtOuOiuladMXskSIXhhH2x+0LDZANKrYzPdUWaFeByOgpczPaBp3kNWKhfBgJmB7BGLUBWxbAv4xFViBSno3om4VU0G2V81ZfVrjPmgWwLOJ9fAQytBTR6w/EexDKByHPXYwnA6qbH2wqGSTyuo/flBVDZFqCKexHslzHxS3oQsiQRreRFRqn4HJhrHin3OEIFHTXiAWDg50tx7HNNwmduvJ14IVvCCNnHdyCajQqghmOAFk0As7EEYCIDncEQ6I8sfFulx98MRoDjakBExJjpokkwzJg9ciZEnUhs18JRwHQloNztA7VaBaj0BkClNwQqPROo9C2gMXDwWiI9vkoornQFfP/gfFgFsiEDP9/LqTfG9y7kfVo8CkRzJhBKWoBsKEAgHQOCC3kguHwRCC5dBoL5FSCQXcBn2oS+dTAY4Vtlp/jp4uNU/uXzWnd4bBloQQo/GZ2dIgXr6wfpc6Fqtxca6kC7qwBdKw2v6s6Swcaz/t4XuoF7UnsOOHjqKJG24NWfWi6wHE0W970lJAluzGYDsua4zka91hp6u3q2UzE09YurS99Ud95AZbmQzgXHUv0/MfLx2PP1t8e1vxWP7+5/9FHubtFjm1y4u1a4ks+Wg51Df7V0r9nda3avZpZnktbz9snYhb41/Di//PtXJ32RX9V2Vq9mnLK7Wz59HgJWcsl42njSLn3TnpQLSbg/Oz9bdgqPOsfS1GRJ/uvZXml4Cg0mIc3ot/9h1yO+Aor2uOiJ0+s172Xt+YR8diVVLbUBx3WfvDgEMYO4O+UG5QYgSdKFm/OtgHP3oASEQvqlq9kfaod7fjOmBJcWZ9yYc7exhy8m/tFiymBNMcUUU/ylIazpX8SXH6+VukPzxJ8KZ9NIAubIvmAkgEcbB6vxme/3q5ciC/9YrGWN/O/r1ZB2rW6V151V5FM4pF1bBQwlezDoyJKyKZwc9T6QU73bhw3949jcy3ulJ9/vP71bZMv8JD6/GPeIq6Fp3XtY/CiQD2tvUlp9W927feWdLHL/6thrtnIfpHNz/6fqH8d1N384+HB27uiVG3tV6VC+npw9euV6ufG/n7evBi/r8klOpOQUksFT4lSeN8tbgdr1m9mr5zJR/wZhQ7uyNPPRzfnZK+F1qfRNbbd1pHL7fDL25aXws8Hz2uikGE5BGreGj6FJxkLgZqV34x92vcFLQsrL54X4YTEcf+XzprbvrHxYLS9fzr5+tJLE4oWZKz87p9+M32uUNw+quVz8xicL3Vm+OtjrjUwJVnKpO7dyyUuBR05xrfGvMOD+CTBlsN4ORZY9IqTfA+xRnwlH1QfPW4fIx9ID+DSGbBiAMxK1dCZgtZvA6HAXP3T7zod/DWw1OkC50wX+YF4Bll4mgEC/CKBGgHJ6DpiP2EAyoADRgA6YnRbHw5CsTgs/htvudgBX2NwcB8gtXcA3yokcdpGnLELq0tEwYGQnn1zCySgJPsyTHIk09iGA1B4/A4KRUqwJjyUESYLakWQDQNXxmSpZqLhEMpZIohfx6OoQ33Uo+wywR26JhQ13EkbvXSMchZ7J0QbcwcR1aCmNyUsjPH2x5PgFNVIZIBow8CPpu0MbEGVnwg9sCi2X7QDhQBAwjABgjyb+QWHAdBUVaPYG+CK5arcPVPtDoN43gebQwk+TF9WQugqQlCQgEZAAYZOKaDKQCanAYiwALCWjQDIcBFrFHr7oTYsl8DkqPZEAT6MmrvcaD/MXgNDSKhBaXAHaIwfY7/WBUaeCb5UN6dr4DTbFTwuqLH+UXNjbbt/bOiVHVJGkdvsU5ukEnjwuXL4186xcMdqqLEmFiqyG5CeN5EK48k8N/Rfx/KvB866W/9CYU+0NryhA0sryRy/79wFbvuzQnNXzbcucDSQeFjsSFIptQFeUxWHoycuJIMx2nCdPioosf/Fh/rtyQXwcPXpxuDQbb0UHh2cr37/r7H50aeHBxp/hXPusXNF05eOP84VXjUr1nbX5r8GynJc/lD75KPddYfJi1dv95pPhFzeWvq5OuCUX6bcvD1dTuWS8dTiYjMj1Uef20sw/PjvlNbUc515tHyBFRDdsx6lZvZrd4zUeKqprn5+LP+m82uycLrs0XTtj5E13AFJADstESz3t+2pz4Exk+JqsXDQu/val93LkpFgJP3jdJ8P7Q/OF0b3+83NO27RHtqwqWlgdye52vfm43WS7qenK9eu5jmaul8tuoSlL0uriTDipverV1vuHZ/RB/3gxHbCmmGKKKf5CsBqfcav88PDM8mbbda/fzD188Bbjm+swKoyCYe35bvXzG0tf1be/iJ571X6R1K66+pPfNXO/TKRL5oP/aZJUF+b0uZFrVkaVpnUfCKjL/1QfAh0zA5WMkoXSzdTss0c14KPs/MPvT0kYtx3n4b2960LI3B8AO4fNJTfRCY3OKgG0Xfe73t7nt5YePSmd2v38bwrTtr8u7hEgfy2WVvWAq9fK3YPD1luLlk/Adpz1u4XP7+S/KU6eFsdx7j0sfnlz6avaztEbP6+1zruxaHTQPlKV/bi19eXSxa92zmhyBKAzOnOqvjGblEP1h34Kw1n4hx0VIv5vJ+2Nq5F8sSb/dt+brj5N54++CZOpUNX3D/aGo++2jrz96gC6ply5PCdFlfVa+dtGQZGky+cywZjyvFt9NCj+5OaqMaYD1tvhWKZQWYnYIcFFuUdkQF7BXHxmso2Y16WJ3khY2wTrM6weAr1XT/Cjvf/D5VXAcXeBiNEFHs5kgcPahD2eTTnAxVmAc3EDyEbDgPnqJWDWy4zdi/U6vizJ7k4YJs/Np+tAKpvHbyEUZjrxoWY6NpAOR4BQ/jw+GzeqhwCr1cDPphKOP8/353n9RE6YBL6OSqivvIQtfXyNgEc4iT146VmC7ZukvU+e59c/tgRrJRKwzCHjJPdBF3CEdsrTSImHP0l7F1uJg1ECASCQDo93bNoOvrtQ3KtpOYxFb0x6APVA6MhWNtDtDfElbvXeAKj3R0BzYAJd08ZP2NJlCTACCr7B01AkIKgqQFiblAekQgaQjYSAuUQU6FcO8esaPfXVzDygROLjl15c1mdyQHDhPBCcXwJeluvA3qtDoNYfjo9HlEumgzowFwsB8dCkGnKKHzkk+CK9/GDtwHqb8vppr5aIBxvNt5TllkqtWzdz39YK99YKH93Mfb1T+OXKpXu1javxK4Hw9t+XB3+d+FVaeVy3inVrotfRpKXfN2ab1iBr5P/7bk2TlcfFNqB1NSAdDm0+nhBOkkQyEqq1JxKxzZfl3HxCClMXM1apceNi9q555jjowtfVnUurabvE/jtIsoKa9mFqtjDqbNffsk767thrtrzJSCF0TluMxxOaIY3otYflcqfVfrvh0XV49P3eFx/nvy4eGz3vPip+fmvpm+qxGetVvXVTn+8rO5Y7mSkrFFLBaK3/dm7yKGRJ+puLM0+6L+zBv1CtH1T086GFwwb/vDHJtfoolXvy5Ni0F4qf3gmRiIfySwnTcJ/Vqnc7B1KHi/l0JKU/71YeDApirooZ+kIsFDVUGbqm87TcFCepnwSmA9YUU0wxxU8en6eX7r6xW3CMeq+vzoXPJ9Ovtt7CDKw9Knz24cK3lcKTx9XPbiz+9uXuxwsr2939/V72380vftV84riZS5HV5YBqSJbjSrtD6VmnbrqDmJb6rhJ13P718KVf75cXwrEnGyVgNZx62PdmiI+Wc+1XrYPH9aWZ8PzlmfsHpZFpAYViY/VStiUNbdcF1jZL167PPnmj5majWTVC6kc3Fu4/OXDeOF/2TfPrw1P4s38t9Ebms/KR2SJGej6Ui0Sjktau9be2am/gtx5+v/fZJwt/LBybJh+tHa5cTr1sHVvVe3RY/7vVcw+PlEM3zd7thfxvNt+jBUjC/ZtL6UftjXffZIyoFlg05lot90mps2VPRqvLiZlgV197dLJu/HGzfOvjfK8+HI3sUEjTQ5qpOAe9zl6ztV/rAbl09MpqemvYWOseUGU2Evz5+aymjcpm43BQqkFNzFQy15YTISvz9e7pjeY/NkwHrLfDGQ5EsZ0gPwQEbSC4K8FCkcwAeiqDz2ap0SSghHaAUaUIWO02YLWaQG9n8s6OWCbw/96+AyzE9oFvs03gRd0CeiMXiAUk4EpaB1bTMSCsuECtXmaswarXgGGlDh7lYw8G+FSNSOESR6vH04ChKUC9N+lGFK2Frf4ISEeCwKzgscJR/AQvs1nDT9vyOCdB7XiaqiF+vZ3rGPgdhSI+SijDjnkMPf2WNdnDkd5D1/88EjvB84xIjIPmBfU16OKLzwSD5uVmCdGYJ/NivK0vjxuM71rgqH9QMFjCYW6rLr6SQISH6aoDKLIzPjaxreAPBJtlHrlGPAzBVIksK0ORgYiuAvGABiQCOpAIGkAsGABiQp1qjfDFdr29En51oyAOxZvQMILjp1cozAKZBcAKRoFN0XX44AXwqjkAyj2hMHOBoDZxKYrHmHUBgvqk+2KKHzNmjPDDtfeQIpU73YYy+OiDhUdvWyt89MP+xzdyD9qlHx4efHl96dviXiaUWs3Jf7+9dyF69YMUu/0XG51jZFhWX3rSiB30Omk9+sftBrCsJituIWzoG7757vby/MY/b4vLjUq3UemeX0p00+G9ahN4vlH69AidE+i+Pbd9aFtf1bdXr8yYh06h+qZ8zj8xqt1etetRdJlL4QuxZGmneVg6/Qif3T+4cC31ojoZpyzH0Ruqokj28cns663W5fzMXn8yzDXdtyRdncDfrmYevW1Z8AR0Wb0Yznd76v29+qYzoQDz4fhiIFE56G49Pt202BoMJ+RcZxxHStBQr6xkGnL/aaP8qlabjQT/5kK2JzW3ugfPBkVO4/4OBg1o/Pz86uveyR8hpgPWFFNMMcVPG4OmJb9nJpNp299U9m/cyba2utXaWcGhAI/XCku5uJNW7j4uXpyfMWX7d8+rn+Yv2k7rv2yXDCV3KxmfCUia7FiOvNsa/rfDDnQMRQuMsu1RNWUEH2+WgSup9NOXRUCWpObzk00pxZ3GnJs0dFU0x2+sHcYWDOHCWd+pxpaMo363s/C8WQlGtDuz8/ee/BjzJ8vdbrnblXXp1kdz3f1+4bUSa9OyE6OTzpJXxfqHN+fv1o7Rk52RWSyH06lodeTNanEpxTv3WF/NJN5ruopr4UUtd6/Q+iffgipL0oVwIqPGioftwn67TO/NeziBmXhoaTmx1jr4prUD3J5PxaP2s87u414RmAkEV6OhZABNsoHmSPm20uoe6QWXtT9z0uw7YjpgvR32oGvWSoxdcoIqELqraAIwEml8O5ghTFj5IdA/2AX6sSTQM4LAoLAFmPUqMDwo4muzrHYDMKsHwKfXPgauz60AG+U6UO4O8bmb2XAAuJhJAsNKYbytX9UnyviGgGMKY50LqKEKoCUP8dVaZrsBGNE0vrSoNTSBvmUDqiQsb0Og1R8C84kYEFoIAQMjiJ+5JagU98hnn+tJo2wYB1ZJjGOiBPOnauP7FVA9asplortyx9sySbqS8FVQ4g+2OQKsbgefVvRT3W3G3JW4fPQMdOTboCdWcxxgZDnA0Lbxw+7FLQXz5B2QJI2vUY5ERWmKAqiKPPkpy4CuyPjKqoCiAAFVBhJBHciEg8BsPAKEZBcY1kqAubcNNDymSujGTBjn7suMU+ODEfy3op6eBdyQYK3qwNPtbeBJpQe8qNlAqQXQG4HvXsxEXcBQbOCc0GNpKr4Hc4ofP/oj68zmEQDSsdBCNookjYbmXqndGXiy8bXDUnomdD4+8+rVMdGMriqX5zO1bq/YaDuOWyg01ZL85Qf5e+WD0YH9+ZWl55VKfTD8cP5CMmQ/qO2dSBufMWJuN3WvXAWuhLJ3RwVA9k/B1/LZnT+csk53sFu//VfL3+wWgP7A/CCZ/6q4BziOsxqd/b72Tkt7fcv8urlz+2Zud7PVfk9N0vsioCvxSCBk6JJrG4ahKLIoMB4MzXZ/VG32Tl0OdFz3h4MDTVc++ji/uXbYHxzL0Xj+7DC7Gil1jjkTO2VTUjixt0K7qyrxW9nZmtVIyKn3Wh+cT0m1dwsRCyjaxcC5r7brz02/ryYcO6clt3YbO3udHSbHGdL1uUg4pOm6JNuue9DrHLZP8VeGA/qVS+m7zcJ+tQl8vjjj6M3t3stCm7lQ8JN00JVKleFTG7dyxNtwJ2Oo3Pinoreo3bR+RCTlGzAdsKaYYoop/mIRNNTLl2fuNwqFvs+XpFmNZ1JucP1FZTAyq91eSxl+eG3uyZOJ7Wspk9j+wy6wOBOeuzyz1+3s11oP7u7NpiOZldi9p0VdU79YPbdeO7xfHASV+PXZRCIkI7vmcDSw9SfFVnvYADLB8LNNb3QrH3onRUM+c8nvxff7sfOBVm8I7L9qSAFvqtCsUyIbr2USAU22HR4f1qzj08f9WmFhMZZsJHZK/2pidkNTLy4kAxGtL5uNUf9w0G2ag+Z4HcuC8ZCpQAQjri6EY1ktYnWd5zuVoXlMmm3a9jfFvcxy+Jo68+TxhG9zXPdEODuwddC4fn329fCnnUZnpyGGmPdbLzOdk+lop+JiJLdzKP9mzxut8uH4vBtb2zisugVAkaSVVCqtB82OVS61q/vdwyPN3LIkrd6aeV45Nrhn42FjQRHWyEw4cDWnPutsYjEXCn6RUQ+HT0qj0wXsI2cY1LYkYuLbdUA2OHUF8UeG6YD1dljd9qh6AL4zLpYCZFUF9HgKKDS7wEGrCwxMCwjrGrCYzgPxRBrfSSeYHqvTBkb1EjCs1oBhuQQMD/eBQXEbCF+8BdxeuQooy/NAdzDCr5HXbRPotJuMxUaC0lBVQFJl8OLeHcsG7H4fn22yOs3x5UB6Dp+SGVoOflCTYOPqgxHQFsyWaQH5ZAxIzOXxTXkiJcvy2g/N8d48ouUIRyWIInGEI8vC9zAe5bHEth6XJTRk/l9FBpX4KTYRGb5CRhaNJfENkt4OjiRjiSfHOzxhZhSx8po+/uklXTk2fhrW0XtRjnBRgt0xNBWwBpNgMJHwLhKkBiML6GsWvidRU+TxfuIB4dQLAzPhANDb3wLqxS1gWN4HrGYVn0PystqFiM0T0iUBPZXFz5Q3sjmgK+nAs90SsFZuAo9KQ2Cz7AL7NQlodiesWyLsAiF98hII92IqHASGpWP2pSl+iri4mv5jdffElc+bZWB2KbLK7MPNQ9O2H3TK1y9mn/ssSFI3xKV6pVuvdCWJD67NOwl1be+gUu2sLiSNlHF3rWBo6ucXlw7d9veF0/XyS25ibVACNEUZL0SaZwu9h0PrcnZG2Pgr1c7qB+lnlSpQqfVOnKz+ejmzOdp0XReJlcXwkjF/d7ddH0woq/1uKxTUbq3OPXx+ZmjFO2IllwzNaOvN0j2zwMm1zTMxtK2XrdpLakB0wbgdndvf7ZQax0idcqdbpnvrzmxnp3dYaQOargg57AnovX/Nk7UinzKwHoWEdD1y6XebJTG56orycXThwfph2eGybeMAACAASURBVOkB+Xgsr0d2X9UKe9WzjBWO68rVY9NSLh3tJoe7zQbw2eJMRdp71hmokvSf8smatVYQ7RFIl8LJxaCiYY9c5UG7Wxl5zGfTrF5J5NcbTSCshMSA9aPOcZ8muU8xxRRT/KViORu/e/bK2mG/811/7+bNWUWWR7b9wm3OpLywkhN6Ltfl1ePi9h92r0ixW0vze4X65t2D28FsLhq9v14sPO18oOU+SuUCyrEh4ONUfu2FN7GZth2PB8Xl9UIpu5DgDMjm5M7TqrfJ7mEzaQSP3kzRh66/aNY0u486mzOZ1i/OH0sJ71nm993dOzfn/09Owx/dyG0olbvV/Z71TqzPqWibw29quwfR1p2b80Hj5Kj08PBwO9g9fyd7604+eCFU7p6yNP/kVelyYub16/+FGL0pgUWW5MvGpd9seNNVNhi+aM/cfVy0HCcVCn6RXmg97Tz6odBovoVD2t2rC+GEQDSnl/pd4IO51L7zqmMOIqr6fy+ph6N7pjMCbkQz/zk7Oq/9VrV+41q/1ezf/HX82NLzyJd5NNre6HInvfC+D/1PiSmD9XbY3ZbwAPop7SFAUjSgbznAVq0JPKt2gErPwo/hXqq3gdu5NJC7cgdfLyXSqgaFItA/7ADOfhvoHwgPYAnfdTgs7wGhxVVAn5nDV4CNjiTIe2qwmKA0Uvi2OKvbw+eNJEVmHBnlpdJ3AE0CPwBJEE8jxwVaIxtoj2xgYDscYZIAORUDYulZGEuCwO8r9JtdZXyx1OsRVoIiEtSOII38fxx3vAPHdca3wae7RvbElydgKAog+kCE7dHIzI135am1FBVwRdSeogBKUMTNB/EZLKG48h6NBKCJJHRFBkK6CkQMHRC9E6NOCz8LXmzmGAH8MseQoeHTfuKpsxwFCKoqMBMNAqmABnRePQV6W0+B/u4mMDzYBUYNUSU5xCcL1XAE0NMZfFuom8xMHksoCuwWysBmrQ08rY6AFxUX2KlIQLUhA+5IAiTdBdywUFwBpAIKMBsNAbo1AJoHUwbrp43UXMg9Qi19mp+JhG3btRRJtUba/UKjPRx9X9v74Prcq6fN1mC4cj5ZqXWBzhnZnvtbVbaqV1bS0lzgyWZJlqTPb+SeD+pPt8pAOGBczqZDMd2VJafvPH9+jNaaz8XrjR5gWrZxLiIXm6IF9QSswYT2aFU8f6ILFyLp74+0tXSdkzleLavfsp7/YnVxbdes+q3ALnxd27l9K/fqWb0/fO9i4Nu35r+qbr/vVmfBdOyvazvzS9HlYfzpzrEnx3actcM3LfO5INdlXVVEt8T/IR4cNCMp9YRyTkCVlEXl/O+2vIPJh+NSSX7RqAEfzM6VN5oP2/uAIsuXZ5MRR6sX251mf9i3ZvOJWC6yXquKFV6BoKaKxYHr57MiVv5cMtrWCqZlh1Tlb3JmcbAN6JLyH2cCQ/M3vePvu4F590Lo5y96dUCVtJ12D0gZ0R+2K0BY0w+2f9Q60emANcUUU0zxl4m9gae7UhXp5xcTj1ubHJE25+ciSea/2i4/qB18fnXx/sODHw4Ori+ltnZq+7W2Ik2+Gc2kI3OpqARbxVq7M9x/WZVe8dnnSw/K5UePCslEaPbczHq50h2Mnu6cGRbwymrNpMJigHu8e3j50zl7p18qnNRIqcHJWWl7p5a4EBAZyHb72DQWV8K7nBKG9LS9m5uNxxuxl42JDvp+tbCykhoVnXLjPc7H189nT4R8vhm5aPjSTEjVrJFrmq5pSLom6YORvFHpHB5Jsij22mW5+8m1xXtP3im3bIyXhfqNlbnHHA7t954UT6DeH94JL68dSdISkCVpRbvwz9vedBXWdL2m7jdawCe5haffF4Rw4tbibPtFa++Px9Ze97eq+1vVyx8vftfzrpdk70smYEUcUdFzLiOvtwfAv1+IFgc/iL/+x5ng0Pzq9eOUJLnuO6iyxqrpdoE5eX7dLQE3jNmHzR91KeF0wHo7rE5T5D+pkRigJTP4pEKrPwD2Wn3gSWUI7DUnRMhWzMLXNv3q0gIQXL4M9PdeALLxCjAHDtCpS4BcNYFRaw+wB0PGqfFH8qWETUzWDEAJxwAjk4NxH6KKL8oxm43xtl4zoOgBtG18tsnstvDDlqKGBgT6JtBG2OiEu9AGVHmETxcFVBUw0jF8FZrnGUQCHGvECdOfe6Qo0HXxKSJfawU+XyX+ewW/JeRWQ//rmhC39c1JP6BghoRTr2ea+HTXbDwMGDOTEHxZ0fAT3gU81keEcom4eUk0AArHnwroyiTfPBEMAMlIEF9CJ8L9vTJKJEAR+i3dAAxV/FQA01YA11WASEADUpEQMDjYBQYH2+O3RG97A+jvF4BRvQM4lgMoAQ0wZgbjl1JPm+MjVwJh/PbDam8AlPsmUOs7QHcAMDrygSxpLhAOuUA66gK5uAysJILA+Zk4PqM22H/FFD8FLIZjc2Y0mQ5vjOotX4cUDRr7XW/A+sVKZq31/MRWtVGnxsavLl389Ublm+ruRxcX1jZLesZgh85guDIXrxSbwIXlmcLvN1/YLiAryq3PzlVcu3DYXP96Z3k51UxyUG+3Hg4+u7Pwx+KbUrUq3W5gLpaVI6VKB3hWqBhB9cOfnS+ulxoV739TUeWeNOGnHdddTaTu9gvA063y/MVoseeNTf3BmSFtpWEzGht+EMg9OJhMey9btWQqeCWREWTbWyFLUlnvcDqRdxIX4uHFWfVZZ+fpwH1dey3H5F8u5KsN5dGhJ+CyHOfr5vbnt5YePDp4r2qdxy9LV5Yz5XC30H03E+DZeHY4CES1gX1s3XPVuPS7I/lS19Tsw8ohcGt29tndouO6uqp8mMk+/cOZc+ez73evfp5bL5SBaMjo2EMgGQ2KqNirmcTT9jZwJR47HD4Um3yWyAzN35y6t4D6Qc3sARLSekMBMkb8DzsV4HZq/odHB7L0o1ZhTTVYU0wxxRQ/bRwetA5L7afrB+fdmOKfcjLJkDh1Jwz9RX9rfON8KPRZJpUNeCqcR53NX67MAns0DU19WDpMJUJAeiEmbhDXdGxvCHBse+OrF50fCtcvzgHF7Vq8QdDQbMdZv1fMx2NvPs69ZusgMvzgo7ww6wxN64/be3sRc+6z+dWfnbvys3OsRh/tHuNF7Ib35cBx3SV5otz6dq+aC6bPuqO2OWiqe7fnU0evrA/7j+2DO9dy73JOXpqN73ZOj808gYVYmEhlvb191qjkuM56a6csb/3taip8JLz3m+rOBzdm3+UujuLpdqW+Ofw0lP8knZ8PRZUjE4auKNlgZCWWupaYvRRPZ4ORN+xnr9m9GDh39Jpr0fNHp6sbidmHm4dARDeqL9oiyOZ2dvbpH9/C6kU9sxHZrPd+OL+QELqOhaQiZBtXEpL4Ug1ktdPTNAxl/p+b/q6MD582W7IkKYP0yHIywXBx60e9OCgwZbDeDrvbEclVgngRTJK43BtZQKVnAvtNBxDfjoamBNQ6LqDJfSAXrQJ/tXQR6G4sAFosCshKBRiNZMC0JgHlarAGaPECPmempwUlMwdo0TigJ2cAPTEzvo2WmgVGpT1gVDsE7E5rvE8hOfIeRb8LjBo1IJtfwc+7GpgTckgosYRMQkR+t0cm0BgMgUi3Dywk4/hhVF7lnzDWuY5/V76hT3gGLRPQFA2wlAlr5cFxAVd8hfXMiL6L0HHxuaueOdFjCQysScefwHwiAhhCKCZKIbsGvhBNkHmeksmxgYARBCIBneMWm6CmAvFwEHD7HUDE+gszpsiRFxovzyhq24CkjZ9p3xopdF3Ceuk445fGatUBs1EBRtUKMCi3gUHTwqf3jKgLaLFJDpZXK2kEATUYAnrD0fjlsxwA8ckbNFwgGXaBoO4AqiK4K4ALGQm4lTWAa9kkILdrQH93AxgWhfokwxQ/EWy+LF/0nXfhoC7YlDv5xONeCYiq2t8taMXhM8e1z8f5q9nL/1R0G6PR88HG1czSernxxcWle+vF/PlU7X6PoPdf4PRP0jhmf7TzjxtXf3lx/eVhcbt26/PlPxYKtuPklcjekTXI6+cybpSDQTsfjNOVnu1UhqbVN82vDvYWLsUuuqH1Zweug+O4z4tnFhVvviwtXU3sNBrAw+eHq1dnnjcrgOU4Ti8ly2eWz/Ttkavs3plfulecqJ0EdXTnZm73ReuoVOh1pJJB3o0kymetre7bA7dc3LX2y9V8slqN7DQ9L+E3td0vbyzfXXu/tULHcR5seEtjGqroKrVtpzs0mwybTA7m2sJsKKWdFSH2+5e16+eSxX4duB479/uNYwOl1PJGt5vJzMNXe8DNxbn1P0wUaalEKJ9NqLjru9X+0TeJ/4KE4oaIjxB+al2VXw08jrNrTfajMHjdPhBUV/65lRUWwvnAyn/daQLXwxd/vVFWZXluGH3ergK35+bf8mT9WTFlsKaYYoop/nKQ0DxqStW9j/eR4n3X/5tceH/wxPFLgguDZ1/OtlK6YbvObNIBKlIXaDAEKr5OXFJOYXwsy+o8O1QUGdh/5i269TqTs+z1lex9s3C/Vij22t9V974b7Jo56+at7JWlGQn2m63vWgezN1Krl95C4bgO6aHufVNz3dGBnTS8B/jgoHY9fOkN2w5ss6LsnOCxgHu1grLApfyZBBiA+65rT3u9M6fD11Ho1yPJVj42qZb/prFzdflfbg90odUbtnpDYfQ5gRf7tUePDj9O5U/d1nTshJsBgor+w07/qHkoEwxv7FYBWZJ2Xngrrc7hZPlTlqTkwN74H4/X/8eTuUz06G7bvt2yzQiIBIz1Zgm4lU12zAGQNgIta6K9e9aP6PLkGQio54bK3/63anw8Xf1mX3Fc53r03G83y8Cd8MLz3SpwZz738sFUg/UThz3oW50OvrbJPVJdJ96RPcsBRGl6vSMB3b6MHwueDDvAy0YPuLM4C+iZBUBLpgE9ugtoqg2MLAmwLAmwBzbgjAQz5ACSqgNaLAGMVAOodweA48pAJJ0HZpYvAT2RpyXMaNUiPk3ienSLgh+wJFguxQgAK5k5xuFSqgyUe0Oga9r4einBEAndYntg4qvQwpE4vt5LPDtH07kEC+XYQkk2AlRFxa+6E3SRF0Blu/gVfoLysX1SSpXFYUj4BJvw/dkeszUpLlSOqKnmE1FAj4s0LDheKCnYLKvfAzRFBdKRMH4mlngqZFxgJKL2WzV8K6hnmRRZWUcM5OLpFUyb6DQU/ke/r3AiQfOkafaREkbTBtwjCfKCSlN0obUKAEo4AiiROL4oUA1FgFG3Pt5zWJOBTHjCnKXCk2SvkC4BcxEZuJIyAHEGWk6EgPqDB8Cg8AoYlovglWxO8VOB5J9nZUVUDsi7vRIwFwjWzPUTN66ODn6Zm/kvW8Nnnd1z8fxGs7oyk35eqaZDxk6lkQ7pg95Ifi1WQKCyW7/4q8vPXpZa9V5mMVFudMepRPFwYEuqn2CW+pb5fXUfOH8lmbHDa5slUbp3685svzB4vTdmjOebpU/9FuRirXM1lm3LRfHZ+4+b5Z9dWnzaPhn0NcbQNuvK3s3ZhbH+SeCg16nIvU9u5h+tl0zrFF9e+x1IKYGwajTN9yiKqQ5bc2mlNdRbwxHguO6h3gno2uC0+Kt/Faw/Ll+7enph9m9flWQpGdbU9ujY410JpX7gALiUTu3tVYF8Or57fyJfu3FhduN/em8nXZ1kMYTC+ovDKhCLBtYrFeDicvKPnV0gEZF22wALIePY4XVqT8ndit4KKPLeYLA/aOHbF3KBm/+w0zNdczWa/+plx3L5Ir1872EBuDM3//x+8Yhg78eIKYM1xRRTTPGXA9vPwnYlF5iLBIWQ+YN0aOScMjQUB+tzoaDjuhcyQWAuG7EdZ3ExaTvO/LkkMDpbhG34KUdCThOOeifOhQvR2sCbOa5nEr84n/3VpewvzmdvZJOyJL1q17/t7WVXw9fOZ4GHh4c7RvfWnfwbBMvrd4sfz+e8y1ulj4IL4saO636/NVgKv+k7QN8etbX969mTyVuW43xd21m6HIuHTwmF2titfppefMNux1gKvHcU08Gg/unyhPUp9trXLp5OYt2Zn/8im/8ivfDlXP6T+YXVmZmIbpx6yzfAchy5deZz67hu+7XZTja928c07+7S4WM5ZIVaOxg1gMs/u7S5PeHwzt3Oia+U5y7PCNlWTekBsiTtj85km1x40K78sVHaH3jrsiktq7h3/n67bbr2zdjK1y+6A8v6Ir18/2EBuD03/+LBoWuf/db8cWDKYL0drmUJ5ZB7NJ3cndThHX3nOo5w0gEMRhLQHrhApW8BlU4PSKdmAT2VAYx0BAiXJ9+uNN0F1ICCzy0poQigxVOAHEkAG4UysNvoAu2RSN6SgJmQASwmIsD5W59xPB3eU2X12vg5WKPSPj6zZQz7wEpuGd9XWGiIZK8Bvn3PI4Fc8G197cEQCMYigBqOjZ8lx4s4F5/1Lj7zJ4KdLBGPrhtAUFcBFxW/ENDzD5oyPo0EiMgcYcnULGv8tIvQedNjhixAk0f4eesiVz0RjgK2aPQzzfFhCBbqaDyYqQfwWSjxFdkZDQC718EPrHf6k60kEZ0vH2kGDASBbrsHdIbm+KdoLRSeRFcSHsbA5KcRANRQANCiwts4AmRdAYx0FAhkZ/FNo/rMPKAnM/i6K+GgFCe8TEgDDEUCFiKTPDCRRB83VGAuEgDOp2LAQiwItJ4/BAZ7m8CoXATMVhMgyRQ/IYz8AcuRXCAdMoRoPKx1G6e5+x3X/iQd/G+9focG0FdGgB5VgWAyAJSapzTKedsCoKhyvSP+fVzg3GzifrUAzISMG/nAenurMl5ZUri0GF4KzK8Ve1vt+hb127dy+y/aze7g68O9G7ezh+uN3muSL8B2nKf3i5/cyX1XKAA/PD/49OriH1s7LnRH5t5BKJ2e1B6/jr49UgIHVzNz6+WTqRBPGqXZ+cj5bvJV8WRG++O10u3rufu1twik7u60EjNGz36/3sPHnZc3Zs+t+bxawTlF8PXZ/MLje/vuayTNQjw4k44YYU3VZVt2B7bdGA0O252BdWZ8w+ZuNXsxXHrndtHBwNuV5rMwqnSMjqnUuhc/yquq9sPLydgUS4YelSpAPBZ8UD0ErpzLPGgWgFuzyeLwpbhZ27SDJyutJ0jqGdde+sdifWjXgoq+rC3/+llZgi+Ty3c97iq3ef/Afs928z8LpgzWFFNMMcVPGyFjcr4afycxXQeIGB7JNLDPXINT5Caw26voqrw/aANtZwR0cYDDcjuzdFLGBCiKXKi0gPyFGdtxNFV5Xq0C4YwGzISDc9n+evtkSmfD7D5sbyqxw79bnQkqyv1qQcmxmIkDa4elpWtn6qJc233yXeGLrEd03V8vfhFfFn8qdnpqP6NKZ1YcAh1zYAdL5xLR1/902O90okNRunUUluM8eVS+o+Uuxt6k1qoPhpFBVpbe72TquG4mPiFgttuNbOKY6e9cMrF+r/j6dAU0mv3Nl+XHjwoP7u6tfbe/ee+gstZQ9+zrSurL2XwyFHx9Exdywfi7H954TB9bCIbOyYXUzZ3a0yPTla6rocvx7mAIzK0meiNTU5Wm4Uky4rHJ3Pyq05kzzp/YW1AJ5QLXse/8r/3I/1eoDm3nanTJamd+96ocNwKfhhaFFeCzXH7jXnE8Xd1cfG8b5p8SUwbrXSDJmoZPUQizmNC2iBCmoCYDYQMgGhRJTgABwUXJ4BMw/ZEFqJE4oCVmACOdAsLZDqBoJqDoEj6z5em0UlkgkMkB25UGsF5uAuvVAVDuCi8eQCLQA87FO8C1Zhe4OT8DhJYNxtzScABYQk4kLGzNCr6RzWxUgdjCeSCemwH26y2g0ukDPXPyDUkkVAl6JtAfAOlIBJ+1ErcTRJH4HxX2OnGNOBLBafmdhuKnqPxTgUAoCKjKsU89wSoJhdPAEpcdfAZLWB37lg30Rub4p8iv8vLcReDWqI8vcRMEm3cAoutDSJ/ELQV5ORriG0g9n6BgrUSnoW7gZ2sJPqnZHwLNwRDojix8BktwSJ3BCNCEgkq8GWIpQE/N+M+Wd2xKMAAYM1kgsHAeCC5dAoILK0AwMw8UG218BiuoKcCcEgTmIzBO9tJUIKJrQDxk4KvN+pUDoLX+FOh73FUBsIT51DzzC/EUPyokDWN89pMVX9vuCm7b+7V/Gkci0DZLkLZdZzEaflFvZ0KR/XYb2Kt7M1n62lz5tQTRC5+dF0FToWyY7fqFi5m77YO5ZPiHRlGWpCs5eaPTAn4xm04GGgeDly5uSA0n1cXqMPz7g9rD9uaV5WS3GX9ebaZids6NFirtuwfFT2/kHp/tqnt4f++j6/MPO+WhZd19Uvji5tLXtR3gYan2txdW1nobb3iWmmYvm9CyVqjUOZkCv9dtfnn5dDff462yBJ9czB8o7bOCGx5V2r+6eOFR9033/jo2u3sxIyWUWEAuGznaVDivRcrOezRVu7a7tVNjpxYK6Z9dOyWTLCi9x+l+4s30F2iKjY4kSe4Znk1ZlhY+nX+wcwDc/HDhm+I+cOtqVvQ6fziXetp+efT2r9qxc9FlG1OXIrYb3utKd0t1y+1CFzgfnh12I799XgWuJ2fb+8Mf6geqLH8yk3v4neeInImFl+TQyz+c2QT1Y8CUwZpiiimm+GnDOdLfpwe87yQtawgosndGtE8lQ8Sf/O5Bb0k9Gqj3+rGIUe/0s7kE8HirnFk+xuIYQb1omoCiylvNBmCHAJJzuuO6Pz+f3ejsA/95OTHgbnHwQixS96zu/uDpwL37/yzbl+OxQr9OuHwuEa0NempWkmUZqMtvWWt78rh4VU8Zqgr8sHbwQcoz6v9uqzIXOLPiUKA0bF6a974Yn0DBPHMAdeHh5mH5We9DbeF68nTK5Neb5VvRi2++9xMYOdZqepIcpujHjqpReQ/h/FH0eqPH9/Yvpk+SjtK/SLBk+u+Naru7eud0N2IkHlz4YkFMV1euzn1XLQI3VrJ/rO8C6WDACpw0Wj6sN//rjvTfd/S/3x791536vWrNcl1gMZRZVi59szm8X6wmjcBnkaUXa7XDencuFrmmph7e98apqwvZUNHafPh+8RZ/ekwZrLdDNnQtFgfUaByfqBC8iyZivg0VyEZGQDvhAiHDBQxR8RYBiAojmCwxFutE4vikRWCuDSjBLqAYKhCYmwWMbA7fdajEU8D2813gaW0APD60gYMGgBAphgMusJccAs2hSE4H+Pz8PKDF0/gpWXa3BZjNGj7npIT28XVaVrsOhJZWgZX8CqDKDaDc6QOi7F1QR8IbLL4lC7YpHomBl31leUyVULDZgGO6gCRS3UXfmaDWvbAoiXF/oqYDwaDnZ1ZEEpULPo9lHnERcsQHZDkTK6J/m8mpRdyp0FQJOZowNnptiGJ55ejnr/hUOnJy8lKvAsHxQYosdS0cBcrdIdAajIDW0MRP7dJkCQiqFj6DlQ3HADWWwg8wE3ovORjCf6hqOAro2QUgmL8wflECc4vAXq0F1HsDfMeiyI5PCqYqaADJcBBQHRsYteqAVS4BtRc1wGrWALNRBka1EmB12/gUo2y8t5x2ij8LJInJ2VPzOIfqoAdI/nlVOXsNy5D9ZAcZIBzQgUwm2uoM00vxUqExGlnRy3Pl7Umg1PlfXLr/vABc/GDhu/JBOhV+VC6lY6G1diVh6DvmNvCflxOiC8WQlTvxdER2gJd9+0WvfjjYmQ2V0sa1r0q1uaSeGhobzeoXV5bvPSlsVKsr2ehhyRNUXZxLy4WhosvRTHh30C3WW8DGRunG1bkfOiXbcYovO6m5UG3Qs/5/9t7jOY40vxY96U15X0AVDEkA9KZJttXMnZZGce9bTOjet9FCCim00ShCS0VopdC/oIVW0kI7LbS5d97VexE3QmqpZ9StZht6EgQJgCR8eV9Z6TPf4sssx4Jhd88Mp7vOoggmqrIyv0xk/vJ855yf7UaQLuIY1mezW/jRmZV/2xhv/LfdbSTl4BHhWC6wtlUGcCmfNcPWs9Z40fDReuV3Vs682n/mCESkgYLXpgcXGYlj93deg74a31QHIfWVm/vrFVjehinWYGpvz1J4njWMEWJ78Xy2xOmruyUAK8uZx72q7TinZmJrdtl2XY5mzuc9LvNozEgx2U7eel52UWFp+u1YfmOjfl8t0BT1Tnb2+ePyc60LgKapt/Ozzz7bntjI8k3DtMCaYooppvjNBjWkH2rZBoB4SCqYbfRjewGJDvYwWeMsMxmgB6BnOgBIupUY5AF0aO9uurpZvPRfz6Op2oZtxERSXdE0VXBUALnTsZ2CsjgfPWi0rucjq73yW4lYQbsH4JQUuRbYU617sAFgmcfV4OVfNOSaqXLMo4vRC6vN5vW5pY/W9X1fJZb0CyyapuiCXtxrAMCLGsPS770z/+X+geO6T9eK717Pf1baaynadWH2lrYN4Ku9ejoz3v7lVawpm0vx/GZ95K7vAiFZODp9lGBjrwbg+ulclVN2uoMyyAX17+vVH68sPepsHrsSAooZVAmWO3hKzAQnzw/mEuFc0JORKY71stLoaZO7+Wxt1egMNZzCeuJgL8DPBgJQVAbnTKHRufJ2Vt9TCtsNlmeyi1E6KT3c82RYFy7O3O+UTds+NRMriK2eYUoce3NRXO8eM4tHU9Sl4JlPnzdUuwJQ56Npq+LcfVgAsBiLBrvs49vedGcuGYkr9NqnW6+xJ79WTAus48HKQSEzCz9LnQ3HANCcCJ+5iUscgLkwC8BxLQBd3QUgsBSAXJgGMBvkAYSIFtUm/QElAGwkDkBMKQDYgAJf0CNmBtyVkJwBUGp1ARx0Nfip8ft1ANivMAAsjQJA8y6AjkpinCwACakLYCHWAZAh3BJFwScq9EoRgNVVABCdGcmsd4i9jjglOR5AMpaGz10RJRahTDwCiQJ8RRpH0wBEkhlGmgZ6Se6kI6EF34KHYVe2581E342CEwAAIABJREFUfzkx6BHFGHzFUiIoY7RloTPU3NAeysHqr3fwkzMQgREGy+snqHbhC8LIRAZFkt8JU+WltLMAKNIC0ltCuCsZvs3TpmgAim70h2hYJUaBxH0RXs0GwIhB9DVYsWR/cAinRaR+XDQBQMguAAjMLQFQOQnAy4MKfIMnORA8wwCIE9ZKFgGkghKAXmkPQK9SAGA0yvBzvMheEx8lsXx6fRUd0v1Qgm9ineLNR882CdkoCOyLeh1AJhH0CixPDwmBDgGTffItQyYFVlMblBckp3SjWEsEhV5XB/B4029i0/akQitvz31ZKHA8s9as0hT1Qq+xNF20igDmAvWSjnkpclG6o1ojs10949FvhZJP9AubSvNUuLLWEjd62wkpsdNtLqdTO+UmI3pk27W5mc1PBjJ523KefLb11rXc405dN63H9w+WLsc3q/XVjVJyIVBVFdW0TgVm1trH9HKxXSefxOYrbanJDMMJsfqizNL0BxcW7rT3+92XXVAfrVd/d3n5UfdEeiwXg6LKHKLJw7ww1jExLAuLVHDrXvEpBjyizLOXb+YeVao9fbzMMkw7IQcqQ+WR8zpzhKblbUyjp86ExHbHuw4/3C0BiF0MK5r5RGtjzytSr7yV/6Ky77juUi6+wzU7hh4S+CvzzLHVlchwWSz863oVgMiwbwVn760WXEDiuGvxzJOHBxXLASCL/JVkav3LnW3r0JnuNxBTDdYUU0wxxW82Gr5qe/lchnj1paD38Kz62VeOO7kzXYiN3io3AcT5YKmrArDJcxEFAKZlz1+crDoKhsWXvQ6As2czTVVbmU8Ue92LiWDN6FyIRkr6NoAbQcVyJmiJDKd6RS7QoCr6wdvJqGabFzNhAMmEDMDp1zntCVzUxv39a+kUANtxIjoPQDftZb8vIWOfaF77WXc3Exh325n26928Lce58/gg14ssySPar482KhfkldftQ2wM2fTYV+Zzz8cTW2vFsYWGYa19tn05OTkGTB01qWjuST0rNEVV24PKLJEcP3MaHVX3V04x1KW3c7fKe47rrswlX3KNjqmnZPHcnLvZLQx/KshOIHRO8ae+2KsCCHHCkpu8+6TgAqfjsZwqPby7Z1kOgGsLM5km/eSzLes3qrrC943Bsm370aNHu7u7i4uLFy9epCdJHV8FG46J+SUAfCwNgI9nALByAABtOABiIg9gIWIBkDgKgG65AESWApANCAAWY0EAiZAMwC7VAFAMBz87yomnADDBEABGkADwqQFnRnoONhsqgJY+YMg6KgXA6VIAoooNwGBpAGWGAZAI2QCKigmgoeoAZsMifBudl+ReawDQah34JJBFnnhoGgATCPf3N5rJwWenCA1DzHF+MtaAOiKpvkKYRD0J6HdvJEosor5yhhPFCLPl9H/rZYyR6HPeuzoTpRQfiQNIhgY8lgMXvjVdsx0ALE3BV5yQlZDfejZGosHSe/CFaOR12PDosVYcDz+hijBVhMEi3BJZTosy/G6AqidNs/vbRp6HOc8aSV4ZYERjSwR55DTwWjG6DgBGDgEQUjMAAvnTAAptFcCLUhnAfkcF0DHs/rATGjUscvAzwPRmFYBe3IWfzG7UCGHZAuDoen/wPcqQ9DcknFwoAoAmGYOHpiBN8e3j612jCCgaJdu7L9b8sqZrez+UNQqT7vgMzqh2DcCMmFpDA4CimQB0/37cpidUORRFxS4lVvfKAGq0BkCIMKghEnCLOlYiVEHDohzRzP8k749x6fNiToD51GgV9F0APXPjevjHt9uVXEBHBaxgAgDrYkiP36pOntN8+vnu0juZzUJt/Vkpfz6812qrHW9r9UlVhMDQ+mjx5LjuhWyo9HzETtidFMF1LParbaZGfXBx4cvWbr/bzMfPyx8sLO1aLw3nqLKGGirC9OF3jh6pkCS8uHuooPvlgwMuy4zl0YeCYtHQhpc0zXHv5GGYkUNVY/BmOXhoaFUoKCZXwiRk/9x8coOq9kwzHwkk4sqO4k1xXo9H50PdqrFtOmaIufnRwUC7thSc/cVGCaAEhl2wYmTu9cbM7MtHZV23AKQjwTwlbX5yDCX5xuJ7xGC9fPny7bfffuutt/74j//4ypUr77///tbW1q97o6aYYoopPHzDa9T5c7NbjSaAXDK80aoCCPJcVffU4ndrrQATHvtITrz4rwde1mVXYQBQQKWpwH9UAPDsoLpwNj32wXMfLJDqamUpvVmt0zS90a0CqDkNAJZbBbAk867vQXtHFKLW55J15y22GmK97NpZUQOg2VUAqq0CMKmRKqFVmVxgua4bszkAjuvOBkIASjXvOWCMhLoaj/6PBe5HM80zoVcIPGakcJQ5vnMCAdZE2K575/HBOaRT0qDJ4Gfblbg9H+Hkoz7pDInnzMG3q/ZIWea4MCa1GiQIRqRXu/0sLI64CAWO3VdO1rwamB81YzLM5DohEODlU9LjUhnAYja6Qdd6lpkJSqmEWtSaAJKi9H8v8Bx3v6Btmo4JgKKejwSGGUEXFIAbkVlSXV3LZtfvFEh1dWkuQ7/svflWwSPwPWKw/vzP/7zZbG5ubp45c2Ztbe0nP/nJH/3RH33yySfHfpCLJuSFs/Cz1PloEj6B4eoKgKDAA5gNuQBiIgefmiGhRImACCAXCQFgLB2ArirwGSPiSSRrJhQLI8nweSOynCPN5qpd+JIi8lhLGkCRv1CXUDUOAJC/TUIwaZYLf0KduPOIyIYQGGZXBaA1CLcEAK7bAcBF6gBsQnUQmY5tw+euSKp7y7Dg53uZNkn8ogAEeA5ASOQBiBwHAPTgIuJxVx6PNWCthlvyeQotQiZp3ilKHHbkVyTBPBUKoO93oyj0STUAPmPk67Go/gq9/SRfZxrwZV7DAV004ajIZ0ljCppBP/VKkOA7BwmzRZbbmtX/FElsD/Fcf3tk72QQAIRlEX4PRC9Vi+UAMIEQfN6Ii6UAyLMLAPaaXQBPyw0Am40egIJi9Q9ugKPgM3nJoSZfNgk8I10UGxUARq2EfsYV+V6GhX/Kea9el8MIACYQAYCn4xMTU/yS8LWvUQA4ljnwycb0bOBFrQbgTDxUdD0xj247IfaMYt/rfyQnXv7fu13CtsaF0N2dOoCsHKrrpO7xdUUuttDLn07sv6gBEGV+/ubsl9ue7tgMAypW8vEHeiEbkKpmgabohlECEKR7hEKR6SBj+d46p7kkvnuv2wDAunWAa1sNQOrZGgBrSIcUFAXDOJQ+3XpcFPOsZliUAQDNrsZGacsZVnWDpui0tFXQmgAWQyZNndpoD4qMrjOy8hkptIeTliATsbFbS4Tlc/nU05Y35g+K9flIPJcQ99VXBF8A/M4fBE1dlVmBlErV3si8qqLpp9OhamlyVH3qTOzFzvg8rMqPlFzzmchj56R/yPXyKNc1ifjMpkNKzHlRbwDIxAK1YK+nGmGBn8uYu706gOuJeEzYONBGtrltNd5OnvqiUgfAUPRqsQkgLkhP16sAsuFg4WmDHMKbi7nnn+3Yx80JCiJ39Bt+vfi+MFiqqv7Lv/zLX/7lX545cwbA+fPn//qv//rTTz+t1WrHfnaKKaaY4peNb3iNOn9tZr/VBpCMBB60PO1LOjxyhf9FUZkVL8T4VFZcpN23/td2p99MfZadIY9POdHL+1bMAWXSUfVtRlv54cLKDxfYldDtrX1Sx+Rz0dVSGUAgygOYjUgAAgxjuSb8PvQANKfnMoNeex3bn7qiWPgd3L0F5JUCgNBoO5UbyzM8P2AEdM0kiguSAea4LlnPcGfqm4lo2/Imqrp253JsROVtjLJEycOpJgq4ms2+n8pf4hLn6fglLvFeIvfubC4ZCIy9s9bu7T/r3EwMuhPutLrP99kLoYWJa9aGAswc151LexRjpavMzIwErwunwww74X599p25r/bGOZ6VpfSj0oihIRQ7vDfNKG7G81vFEQOj1h2fOWUY2k4zxa7HL8byUlVVANxcDOz2qgAuRiMB/knXnlARZiVvl1NCuKkbAJaDKRL3s8hFuooO4PxsauOTrWOrKwCLN2dPuF+/FnxfGKx2u/2nf/qnP/7xj/tLFEUBYB3evKkPLpoMLJ6Fb2Qjpq2GogIwhsKHkrIIeFcIIrUJChyAqCyhz13VyvD7APpRQxIAdohoIZwW8SoyUhAAIVGJcCfEMQBiEgUgGXIBKJoDoDXE4gZlBwC5OhEnI8sQEZIDn7rwGvCZNjxTo5cDRa5W3nuGBUkMA99F2NRMAA3Ngm/lI/Y9QtIQZSXhzKThq90riiuPTCI/k2+0Bo0CXbJZ/TxhYmw0B0IuIZkFkAoH+kPH0jp8pSrPDjRY/o4MstqJAG541wgr6B0GlkWfryKaJCkIXxdF9FLEOUgEczThgWgbflQj2WpyApADR4i9eFACwDsWfI2URRRgpgk/TZ6RA/DVZi3NALDb6AB40ewB2GyYACpdkl8PACGBZMRbAGaDJvw2kUGa7o+VM8zV6Xr/EBC7FtlfsndcNIU+gRpLAVMG61eEb3KNCgWFO2WvqMotBPdrTQA0RRWMkbSnpmH8bNsAyJ/MoPVegg99seP9l7O8K0nXGLmt9nTj9vb4jTw8G3APmgDqdg9AUGChDQgP3eHJjw6ch2b8CutSTqPOvLPZvUveYLlhoCPSEgCO5gCTzB+RUolnmf4EoSzxTz5aW762sGa2+ySVxHmzhAAYiiK9XMi1jiAfMPaHZEg9p+jvO+BLJAfQJ2vSF2PRSI/bvDPhr4CmqKunU26EfjhUzRi2/fhh+f0rC7dqnv+xpRufbBgfLi2vKpsjDBvQ1EZ4pmhUgj9jm8qFCoVBcPzafvn6+3Plx5V2wyOrkjOR6FLkq+0RITkAWeYLXM8dIqGoI2NUh5GUAtsvRqorgWW3XwnxP399huiuAFw5k/2qvgvg5mxitf0cQF6WM/JLxdYwCTTtHdUg63lXHdUFEJelp0+KAFiGtvfUQxLjR5DNx+4dHNpA+k3A96XAymQyf/d3f9f/797e3t/+7d/+4Ac/yGRGDDKFQqFQGDlfu92pxHeK7zVs22ZGGxZN8cvAN7lG0UGGSKZOZWO3696d7+ZsfFs/Uehl1M08MTzpcbHsXfEU3UiKnKodKv1JJYMPyyUANEVtkzgo1wHQMU2ZCfbs7v2OdiPAOa4JYF/fKhiMTCe69t3+Gp6rHIAAkwaMAC0BJutQAIgQazhvRTesaFBkEpLTGNQcrZ4GgOVoAMlIYAcGAIfy6kKBoevGy+EN7lmd4QIrQEvkBk+wX5xQgsxFwr0XaqU3OfPTcd3N5xUAK7NhPUZtN71tc4G7Dw/euzj3eXOXLLFcfLRReTe3VKa3e/agci11Rqb2mkPb87hejkflenOw5O72AR2m5s+kKUAzrReNDrbHZwaDASF0OrBZHymJrqxkvuwc31KGpekZPbSujDCmb8XSj0YL62BAuF0YLOkIKjQAEGWN5KzdSNJF/dB6Trc7gAiAgze7V6l3ASyEIutWEcC5meTOZ+N9fiZCWghae4phGG/sNer7UmAN45/+6Z/+4i/+QpKkf/zHfxz71T//8z///d///fCSXC536cJ5jRUBVJtdALplYdTQS9JTAgIHQOJZAEFBACByDACj3QSgkRBtEkFEAodAwddyEcOaJ4gh4h6ZyHF4ACSlmSi9MsSTGCUSHBMASzsAGkESWQ4AYQkAMmEASEqkCR2PvpuPOPW8rCkaAMMBADk9WYmQGTIAljTLC0Xh+8BrPR1ATTUB1FXb3wlvBLxkLJLeDsA3xPmKKxvw+arhUOGRNCzCn1nw6RbCaQEew+R65JbVH0AxPQsgEZT6G0P6Dw4/jXq5U0Q75XFRQfiaJ7JhxCHofRUv9t9Ddt9/jcHXJ7FyEADND4h3gWMBRCgKQFDk0ddjcSwAlgIAo1UH0CPcVbsOP5GLUIa0KPX3i/Bn3R4hCw0AVdUGUFUcAETRSxh003IBhAQHQEMzAXQ0A0BEDPT3heIIYzdo+OifANxgZAKEwUoA4FMzAMTkLABVVYPByQ7/KX5JeN1rVEUxEwAFmGHDUfw/Lq6NE4i2F8XUrZcVctZlRPlgfzCtEw4JRxRYgVlBr3UBpCLSjtUC0M/4DlCJHrolQ3Gla6C+Igsd1+4ONZzmcHq1WwfQUgXAcA0agK3bACzTBOAMNWCwbYc7l3q4OaCR5JBQbCsATMoCEAlxRE/fMLyvuBYOqs5I/7uxKHPGGtz+5uRQeX9cUB8ReLpoKSdQvu8ftNkSffNi+m690ueo7q0Wb5ybudMZVMNf7FcWwsnFuLWllwGIDL+tjqz8aasyH4sUGz0AHd3IzQUb7d5wiyPHdbfKDRyCVDJoJDFWXUVl/qlROewjw7jKpx8/H6muTkUijx+NM2QzM8GS6r0tFhDW2zUAaUl43jsAEGbZmrF+xLeolkIKLDJ/QgG1Vg8A7c+Wsr1xwf5EJLLBR/slAPV6/Y29Rn1nNVj//u//zvr4q7/6K7Lw+fPnH3744Z/8yZ/8wR/8wYMHDxYWxufF/+zP/uzuKG7cuPEr3/YppniD8GZeub4D+NavUVdXss99b/w7+dS2fqLbaq8Xcv3nkVOBkYaDqcy467CP5eX0qi8Oi0U9WkixvRtK1fDW8/OuI/HXXv24xJ6+q80CkNnAnYYGoKERGQMNgKU5AO5oREWxMiLoWbiYJT80HRNAKCoCCAt8yfQKrFxkXMETFUa8kIo50EfPceOd+wAs8fFq/aQNAS3bWXtYvhHJ8kNUyurT6vX4iEhou927s2ueC84BiPPjEi4XiOQHUrCn9fr56zmOP56bkUTu6o18KagddEamXGYTIS7Pts3ja8R3EnNj1RXPMEKLcu3xuTpBGjyLpuJBUlDOx0Lkh6Vw0HSPSrug/OaYAi8CkDjesBwAjOvVu1rrRGEZyeUksVhls9k39hr1nWWw3n333fv375OfU6kUgHv37n344Yfvv//+2traqVOnTr6qnm4WW10AXcPEKHdFktxljgMgcTQAmecBiCwNn64wO0341i1bU+ATMD6dIAMePUN7wUvEpDZYbpsGgFhABJCPBOD3+BMYFUBctgDUeyQiHABkngIwF2YAzIXE/mftVhN9HyLPA+ACIgAxRgxlhBCKARBSWfRz5FMzAPbaCoCSosOnUlq6A4BnKAAWT/LcB1oxoksjXJ2nqTIN9HksAqK3oAHAJVcl7z8k+d2E72Hsf5CskCSekzcTx18gkwNg2jx8xRWRxxHdrmZY8JskWpE4AMdQ++8kHA9RKXnNEAURACuHMOqq89RXEvEPSv1DRvRM5GQgPQeJ6ZI4H61GA4DebQEw23X4rR5tpdN/j6e+csIAnEAEfZcfAF9lQqya5BDrQ0ZRor7r6C78mLS2pgPgkyRcLdzfF0sKwNd7eYntJM1r2BcphwFwoRgAITZyu53i28W3eI0CwDPMjutVVyxD6VwVJyACLoQWP14fEB6WMnI3dSTqlU8AQDgo1LjBPVvkGZgAsFltxdK0DefzSv1/LJwuaC9U2/xZGe9GfzzLbRnWvuMaAjtjYPn/rbUstw0gQJ9tW/UYH1zdaQI4qHQAWIYNQDePEp9VbBVAOhkkRraq3QNwPh3esjzZmWaPmwMoNw6/U2GYle4feDsuc/yzF+ONBa9ls08n6a6OxpPVwoWl9JpZ173OENjeaOXnI3vKgLqzbPc/Ntq/tbDCsjrQGlvDw3rh3bPz9595vNFXhf2FlajUpHb3JhNX4ZC4uJx81ql9VhyfBDy3mNqm6k1lshZqGPOh6LOn4+X4jeTMw7sTJhat4c7iHEtYUpGjYABAiGe1o+VT7kjdHGC5Ngz4Bx1Au3Z8USuI3Fpp/JC9gfjOFliBQODSpUv9/zqO8/u///s//vGP/+f//J/UawbsTjHFFFN86/h2r1HnT6e+7HmKn/fzqXXtqGmaPsqj4qL90sj9frVaiYakVmfEtB8JScKi+LI+uN/Tvq5cte0b4syGtg/gsxJ/M5WtGUUAXzQrQIDGWY6mdccGvMpmVrz6z7sNADlu9qlbXgzGCvtdAKQzT63TC7L0RCvZ8lv5O6USgOxi9GWhm44GSe5XSHLRAQAKVNsauQHztPhVZUCNzAtzG7ZXil0LztzRRmRGqUCgvD5e+pwQG5vl61dzt6qeiqirGXkjsjdaSLmgPt0u/85K9LeXkh9vjhcK99T9S6eyqy+9zdtuNClg+WoywYhGz+opBsPSgsgKMttyjGfVaqE0XgbNJEKJWfFu/eCEzXEydqhkjMyQzoRCTw4JoKqWO/Az8Hua6Qkz/KqroZvSkYZFmfHYJselAAgMCyKe8w2tzgny9OfPZ+7U3mh5O8F3tsAaw6effrq5ufl7v/d7//AP/zC8/A//8A8labxhwhhM2+noBoC2bgIgfCa5AEosA1+MaTnEcgwAjmXBZ26G+RtCG3it7ngBPnXhhYaTV17sv5LrLFEjRYMDup7IeuIiD2AurMMX3+jWgFVKyjxGE+S7JRW+BIfQMHw8CoAWeACMIAAQsjMApPwZAFLuNACdFQHstxsAyj0TPndFSBTSZJYnKjSOARASOACywAHoNcsALLXbHwcCQjv5YiAGAA0KgMuagEdNEVqIEEvwBWQUaU1I2B2aBWCSrnlyEEAgEAagGhZ8Bou8ksPHMjQAKTGYJiCDbPU68P2JZJOGNVhEmUQYIHaItSLvJBzYSEa8oQGw1R58uyghL61uE74IjwSMkT6AhM6k2cE1yQ50+oMmSxEAAZ4FEOBpACJnAyB29eF28sTOqVoOgK5uAtBtFwAXigJgyGsw0v9GxzLRPwmJQoukf5FXjsfrdw6Z4pvgm1yjAHR5o6+Q1tkmTjDNkpeSd4YsYxkpWN8fYTt6hhGbC2drXLHUBkBT1Mq5TJlSh6srYERGuV11mRBtu05Z0z4+CP5f+atF/ZHjOgAcuLpPYHM0H2Ev/2y7BiArRm9t1wHM8qECugDabQ2AadmpbKT4CnMTSwZ2rC4AQWCfNCoA5nKh3WYDQMEXG2VEkSRb9hGgLx74yqEwK33puyYzUvDxs5FbNU1ReSew3hkxYL4WHj7Yv3kzd7vg1VhPtyrXLs/er4/XKxSwqmz+7sryR+sj7JFh24/c4tUzM4+eexvmAuvVoTrMAAxMDO2aT0ciWfF+42CrftI/3rgoP3k+vrOLUuShNTl2q1pXZs6FCp0OgFK9SyXgAjutHkmxfdJsfzAj6fahqfEcHfXMgw5puTH+LCFIXE855vR1gwxpyRiJHP+n8WvE96XAevr0KYC/+Zu/GVv+k5/85CQXrymmmGKKXyq+yTVK4NhnLe8euRwPb/dO1FokxsSAwa09JQaar6ji91ttUWTPvJUGUFfVO+0Js2bOkExnt9P7YeLMhr7pwlVt62fbrax49mpcljnVhebCZqhgzxQ/r3SaRg1AhJPbzXDPbLM0XTjoApA4ts+ZRU6NF1jhWMCekyq1FoBzl7KfFfcYitoymwDOJiNV3UtGcEYF7bPi+f9nezATmqbyG0YFAE1RGSP4zBxMJlLAe4ncgwfHe+6ORnGzyYRo29fpU5PM6CYsAI86G7+9snB/V2sMCd5Nx76j7b17ZW79WU05PMO9D5Fnzi2mupy+2izjNbMdgyyvOOMC/1ezr4axGIyQAkvRjAvR9GqzXFXUH87m1rv7lutG2PPlIa/oGOq6l86gGi4AjvIUZrQfmxGKy41DWiT1seObSXPzsaPf+evF96XA+ulPf/rTn/70632W8qkC8kCveRlRgL+cZSwAkmnB7y8hiTzgxX8TvgpEccWOxy8R85oXucQPtbpj2P4aiAbL7bQAhAQRQCQTB5AJBwC0VR2+cYz4+MgjAXE1ZkIBjMl9GBa+LU6wSDC6CYAJBAGI2QUA0uI5AIH5ZQBPKy0AB10iRB1wV+TPgcSIx0QWQDIgwg+m0uoVAOZQ1JPH3nE8AJARGBoNl7HgC62GKSL4FhriH3T8vHn47AvTDcP34smROHxLI9EtkQEhB46YkmIBCUA4mwdgBELw2SbPmUjovaH+g6wow5eDqOTQ6yb89hHEOUgGnHBCZG1kl0nXP/JqEwaL/Kx0MdCTOQBczoCfR2V5aq0GgHhyBkA6IAGYDZBDMNCWEXEFUa+RwDNyiTIcB0BPNwFIgTAANhiFryRzh7hA8o1eWthQpD7ZF/51GuFN8Q3xTa5R0ZCg+Oa1+bj4+Jjbk4f2KMsg0pNDsTXLWi0fRedYo31aPtmq/Nb8chE7XVMDUNTU4kH/myhAAbzty4oxrRN52WgCuB7LPdgtAkgHg1XH49Vu7+xfvTzzwjeyLV2dLVL6Qa0FIJsJ36sVAVw8nflK2QWQj/FNv45p6OZpUC5cALPi1f9vp+v6JdeF0MLHPmP0XnT+zuMRYum9dP7BvW9aXQFoNJWrZ2buFr0tf7pdiy2KDX2EIFQs779POtu5TDjZjm7UB6yUC3xe203PBW6Is5sv661JUqqwLCzmYq7kPmmXv1B2v96m1g2VGndYDibsJqKy3+kb5IKWp3lXFe8x4F/2W/8tt1Dyi91hBNnIp0Wv0q2rBgDe7/PRj1GVY8c8TuQWE2t+Ir97otbevzZ8XwqsKaaYYorvKhhuMM9iUSft6bvTGOFVWPdrilNrTRXiyJL/3CnHxMj1/HwbjR1lgpkxLyUjVPzT7aphNQFkpOCLTY+pSohS1Zeiuy6eKI1LP1yggaah3y14q+I5hsqwas2igAbfIzlMbXcw3Wm6tkhd52mqYTg/G+Ku5uTk7S1vJvWt+Oy9x4MMAoFlr0cyD7+N6spboTV4PnEcZz6QaOgj/F/NGJRTFb0tyOqH0VM/fzFSy5ZVpawqbJw+sxhP0DJcyrVdiqEs2q4Yyna3Wel1cVKn42R0Df3dlfn76yNxDFLsqMqlUGidvZp4Vq0BeLRRnl+O7nSbtw+qP15ZfNzZ0m1PsPCSAAAgAElEQVT73w74/5Y/v6+uDX+KAqUaS7pdAyAx/ItyG8MFlq/ks/ljzsNwPoQdb+gq6skeJn5NmBZYx4NjGYlj4bsINWJPIwSJbQNQTRp+gjkJYQqJAnyjGSEqGEIMkJOJ9A0kTBUhS0gg+JAqi8CzzlkWAMvQ0WeDKBoAz/EAMoIEYDYSg8+K9aONAZi9Lnw/I9GBEYERF0n0v51wbCQ7Xpw9BSBw6hyAqmoA2G8rAOrqoPkdedII8BSAtMwCyIclAHPREABWVwD0SnsAzEYZvobMS/mSgwBAWvgNjYA7lHlDRszjuvqjQdRORNxGaf3VekZFk6STD2xHw20TXdeCz2YRilE1TABBUQYgBsLwCWry3EYcQF3DAqA1WvCFd0RxRbgrkWX7SwIC3z+s3nY6QyH1Q5nEnvyOMEMkO34o2t5TcRHlVqsOQKuVAMzHw/Bj9EnMmMQaABoqkbYAQFigAQR5Br6Rk0xPeA5B4nyUgwBsVelv+fDWEo6Q/NYmujTjeP/RFG8C7CECommdKBs5wgXWlZFSjJ7Yc+4EKNQ6iTNyTRu5zzc0/d82ywCSciYXDkQkloLrguoZzkG7d6fQA7xKIsqL8Z78oucVWII7kkpgWPbdVxLkl69lvzzYB3BlOftlexfAYjS0M0rh/Lw4PlWWEML7Jb5j9ACsRFLP/bZ3ACKiMGcHHz48Ub7lCdFpjvz5BDCi/U7KgmqPWAx021xT1z9cWbi7rbb1kRk6y3GeNV/DNLcYDc2GRZmnQNs2bIZiXIvebejr9cn5nxt2NSBww3ORD2ulWERqtg4t1kO6VzzYjhPX5F00XeDzLeXSfHpLKSuW+b+2zJvJt+YCStss6K6e5PNbnfD9undQTsszW3YLAE9566F8Bmu/PVn71UfRP9M4ljn2zb9eTAusKaaYYorfbJjuYJLOcI6X7ACYFRProzLpb2KuXhGSt7TJwq9qT68entV5IZpp7+svmgOhlaUelc5A0bh0Pf/5wR4Akee2Xe+Dp5PS6pFcRkoIdxuRQrcDYCmcaGyp/RiI8+lUb7v3sv5t96UdG9DRObd0QJr4fWud7VOzsV4rvHFIMXQELqRjuShTNqtFbfe5CYydCAKunY5Fkfpsp2qMejPrWu/8Urr8XOlqXmHXM8z5xaj+zDosafbpeun8xfhavQ5gbbvy/qWFzxrbimGu7nBvn5p/0t4BcLvauF0FQNJenH5GBkPRezVvOFjH5/n8f4uNzqXl1M7G5BS33OnEmh+1ms2E1p2vafb81WBaYB0PiWcjkgCfozKIoMccKLHIEsJsEQtbTzcABEQZfRchkQ2RXHJqENXNDKVeMR6DNfDQ2V5wuQJfiUVyoXzCxoHPeNHECEYUXUS/RRyIQ2lSnsJJkABw0SQA1o2PLZFmFwG4gQiA/WINQE01AGg2iXoCAImlAaQDDIDTURnAmWQUQJQFAOXlcwBaaQeA3Wn2952QKB5nRraZsHdSAP0mgDTd3zum1wVg895VxiGCreH+rB73Y/eHYlgY5wnmrMEhU4cYLM20AZAnNp5l4KeuE96LeA/JAfXi6QkbRFH991v8QO7GMgwATpThx3eNxH0Nye88iyghLFUFvjDOHYrXJ8wcSczSyvsA5DwP4Hw2Ad9AmpAU+BSjbrnwraMJiYdv5CRbRTl0/2SjvdQrEb4Sy9taoh7TVQCWMlCAGYFDcyaneKNgDJ1vpJ3fsWAcccyHdkJL/0TcXyu+d3n+YavQs05U3uUDkZwYVurmxup4mVE8OLSw4Hhm5Ur284I3i3fhbPJW3avqNOooJmNGipUqEtFlnw7Hm9t6x6/53p3Nr905sB3niI/LEje/kKAZyrGcnZ1GTz1REqYU4DFCUY0UXGGRqx1SSRa1hiQrPwgvfLp1oqjYfCRwNiVX7WpRe1k7ktApqI0CGkv5cNRJ39qpuEObtNYsr5xO0ltU2x+Zp9XK5QuZ3YdVc1RjR+A6aLxUkrOBqqIAuPP44P0r87dqO13D/GTd/OHplZf6lmpPHqiLwdP/euARcqbqjbxDD05AYUbGxuRdCOSC2PbOkHBMRnNaYE0xxRRTTPFLg27bfclMiJWqh3eCI6BAbVTHlTvOUczRMXBc997DgsAxZ+PhYFDgeJaiR8O8XNdxYJuOqlrFRrey36tMkg7NRSL1/cm3zJls2E4xX/rZB8tziS8b3pygxDDbyqEy/JVg7vGe1VB7AM5Gk/WXGqmuZJ6/KCUef3WU6IrnmOWr2QeV0p2OJ5+iE9TpeDzFyC/WK13lqIR0UxxNbaVH/ityFA4fcNU2NuyN3z6z/PHzo2qshCRenws86W49Vk7UXoagprdraN84k2KN6Be75X6Ztd6qzuRDZ5T4831PtfaoVLp0JVNam1xTdrp6usEziUCpowC4+7Dw/oWFO909w7Y/fl5OBxNXsqEDq1gbOhslhl+SFn6+OVDFHVS932pDDwkP90qXr85uPhifGj59Mftgf5CpQYlveqTltMA6HrahxwMiAM0cdCEkZIk19NzjkR/2gPYISoSjEuGbs1zPG0jD56sIf0MClsiabduBH9pElnv9+DzCQwdg9drwqQ7Yg1hzaijEiPwMz4tH/rap/jfSElFB8fCjnvhYGoCQyADYqjYANHo6+tlaNAUgLjIAIgIDYD4sATifjgKYCXAAOhurANTdDQBmrYi+b5ET4OvDCIi+ysvi8vK9qP5yMlZEDMSonqDEGTbgEPUSQ9KbBpZMmmHgs02W48LnrnTbAWA6LvrJVd4hI9zP4InfP4gOBpotB6OyNsEe6LG85HcK8BtQSoQaDIT6B8vWB4oxslMkect3FLbh666ICoq0biSuQ534+2wLgJjOAbg2lwMwE+4AqCoqfB6O7JHIMgDI6Ur6ITptZej0GMStEUbQZ/4GGiyHbGG3BV+6N8WbD8Ox+gWWzMhHvRUAsBSc+bQwLtVSeycin46AbtpbpTa+QQDkrBysvxJuHo3Ic8vx+5WiVvd7HYp8TVJsP3f+dDxUdSdMuNEUfTFw5uebFcsFgCvxzPazjmaYAHKRsFynnrwcb7Q3DEnkshfi/ZKOwHHdzVp9E3U5zV1J5Hc3ahOFSvlc5GFpZCBUd2R4mRPwjGu9zQ/PLP/8lZAqAHFJuJ4Pbao7DzuvHTdPsNurAJW3z6QtNXjXD7UvKJ0Krbx9Pn93zRuZx6XS8nKCft6dWE2WK52kHTiVi5FotLtPDhYyMTvuvGjXy131o02VpehTsfmZiEhTsGz3Sbn9kTooGedD0ZLfArKhDYbRtOxHnfqVa7mN+4PBX76We9SuDdNpRe2NVrhjWmBNMcUUU/ymwxkyUtjGMVd1hqIbTR6jBFJclF9sHdpF+FeDsCAUhoJPGZo+dSrBx/nHlfJ+YcAzUcDpldjt2mCJxDGvTnBmxKijRD/ypTw34/mna95s16VMpvy0eXBcF+fcxcSD4qHlS88wPy/scRHm8vKMUdEOih1dt8hmX7w886xXd3qDbWIoaqs78rhCUcdPybpwaWbyRl6bEx91No9dw7HY7pWB8ntLGasXvH1QA2A5zq32zs3L+Y1nVc2wAWzUahdWUtqjmjUpVb9aV7iu9t6V/FfFfdt1d0otukK/f27+qVZp6KrlYqPePkxPlkO45Gd27LXauahcb3qnpWnZdxvl+RuppCxTQEVV71bKQ6c5zpxKPmxU6Te7L8u0wDoejqEHeA4AUWIRgQ5JVdGHUt2JdYsiieSuC/+q52W1M4OhHk5vJzyWMaTfIgQMQ9Pws6w8AQ07WAOJHXdGRDwO+kSOl60lwg+LGua0SKM9TwEmBuCHfQvRBIBSqwOgperwyRvSYo8kXZHk+mxQAHAmEQEwExQAdDYeAei9XAOgF7fhR5YTkBAmNxTtjwPRnBHuqqPpAGzbBSAJHAA+kgBgayoAx3+s8XRC7EBexsiB/i6QnSVp5oSFsj2+inyYjPvgmPoWOhe+L4/8TDgtQiUOv5JDadMUAMoGANok3JXZP2Qkd8o7DYaYLZqRAHChIAApMQMgyNIA9GYNgFEv91/NVhV9TqunwNdFkSVmqwZAr5UAhBIZAMlUEoBDs/DpVbKLIs/CF/yZnhPQ7Z8AwzowbzSGiFgvB4t8r3oiP9oUbxQ2qj0qSLmHS6rOSksfH4yTIufk5B37KDrnlweOYRIBKS5KksY8rRezmXB6Jqwy1ma98UCr4JV+Ldcvz3xWGxHU67aDIUIoyImL/Px/btU1y7sKvZ9YuPfQ6xvzzkzu6d3C0aIrABcvz35ZnNwrZhimbd8tFACwaXouGmMoqq6q/T45fZzOxR8bX4dqsowJcQlL8fCTzomyZE+Il0oJKP3W8mypzm7W2gBu1/dWlpKdHb3e1QA8KVfefSt/2HSqadiPbu+dnY8bMWxW647j3H1SCAjcB0sLz/Va6ZDLyFwgcn99QPI5rps/Fa/fG9T9rovtSnN7VMhGQNHQw8Ab341wWmBNMcUUU3x3cNBRfjSTf9qZEDvJUsyydObjV6aclsKJx6/0+j0a8aAYkIRqW1H1k0q3YpK4EIlKFAvDNQxb1yxNN3uK0WqrHXQ76AI4dy77QCk/rxyqIbt2NvtZfby2WKu0frS0qDgaTVGCE3pw0HquevtIU9QHkYWv/PyF92fyD28fn3QVCoob6uvNj1uOM95BaAhCjMbo+o7sZA0Ay8FctyP8x9aE+cGtRvtHZ5ZXlY0jyuivgc3uASswv7t8+ucvqpbtrreqc7lIZE8kGadfHuxdWky+2Dq0qNneqVO7uHEhu6E22rqu6Oad1QOOZd4+PadwxtNWeZhn5Rkm0pPKzgiNutquZJKhUvWY5AWKxsUbuS8Ovs1MjV8SpgXW8XBt29JU+OlW/Tbp/Z8JcSCwDACZZ+EHfBPJjmEPMsp9398QyUHTACxCNth2/5UwnyQtPSRJACyiZBqicLyULM9paMKPWSJhUURYQ5gwkC6HRIJDVF9yEL5UiA9FADR7KoCubsCnbQh3FRU5ABzRYEkCgLlYCECCp9Hnrl6sAlD3ngMwaiT7SgdAi8QnGITPXdEkHt3jrgwA9a4Kn3aSDA5AMhwAwMdS8B2FgOcZJOwLIWoY0h8wGOnvDvFdW0Md9FiGDCMDgGMo+PlV3mEirSRpQjoCvoRuhHSmAJ8PG15uezlbg4Qtcvkwh/RbxHpJdo2EDEkcAyAmCQBmwgEAs2cuAOiKRDfjos8eddvw+xWaqABgakUARvUAABdNAdCiKQBcJN4/lISYtImUyzAwql3zml1KQQAs+S4ienNIb0emP8Ie4XrcU/4UbyaKdYbmqeH7GYCl4Eypzv38Fe4qJohGydaPveH7oCnq2uXsrdoO0Hnr7OyTh8dUZgxFXZ+Z7ZXUneeNDfcoFmfpTOqxWrUOP+uurWTv9CbcVi3H+bf1Ps8xkPJILHeJy3y1uk82+53k7EmqKwBz5+NfHYzQV4mwnM+EGYmmXLi2Wyh1C0cb9oawmI3ea4yzg+WuedjtdzGQNnuhTzdq/cj7MVgu/m2z/KNTSxv6c9s96R9plOd/kAnyjKLZTRs2S/E8FXRduawy9xvNnpfvaD/qbrxzemazgHJX3e22zi2k1GemYdsuYMdobB31Fa6Lp6vFaEQ6u5K7fbDvAqZlP1wvAkgGggu5KCdQDlzKojZ36hvKuGyuremxrJSwA7XGoeKqdCok56XfiOoK0wJriimmmOI7hmfV5mI0fybNd52OSPOcK+03zf/caA4XHwSnQjFUqIP6a6Q1vnUh25+hu1c7WE6ndsoTJnH6uBmbefzV8bdDSeR26a7/yDoB11ayX/X2xqrGIxDkhUUz9nC7BIAC3k3mHt4/UXU1n4+RWT8Ckecunk3ebu0f9FoD3ZqI+XPRPB1Zf1nrqEdpubKxkBI2HGV8s9cqzd85u7ja3iL/pSlqXk4HEdmua18U2jhBQ8FfvKzMhWfPZrm1ztZJqKwP0qGKcWfCL2jcSAlJ/tytslFUVQDPu4VsKmrbYk3VnrYqH1yYv/OoAOBJubyQCFZrxygHmi21+dX+zQvZJ1pd8RNTW4pGKq2jsd1oCmH2ylLO6djlYptIsmSJTyYCkYSsMvaTasUsv9HhosOYFljHg6IZwgYRXiokCPAZJtPi4EttBJaFb90ir0a3DcDqkcZzGtBPahooolyPMhkotyyPLHHha7PIEi/EiOiriJpqKBeepD+5RB9E/NZDD4IeeyQIAFjCYA1xV8SGRsLNLZtktdPw45SiFAUgJPLwux8GXBNA58UTAL2tNfjclV46AGB1Ov2tovnBnnp+yWAEAB+MAChUGwCqigaf5pE5Cz63NxONA3At7++TLLSlYH+nyApJJD1HKDFFha+pItxVACx8Go847IICB0Dmuf4BJYdyOMOd8FJEEucF9zsDJdbwFZ4wWz3bAqAYFoCWbgGoayaApmYD6Jpu/2hIHIm/ZwCciqr97zqVnUO/C2G9DJ+6s9oN+EosimIAMLIMwGxUAXDRCgAuloIfxM/KAx6LOAeH2SkvcoxmADjDqV0ukRLSACiOQz+YTR6M9hS/Wdhqdra8sscAJt8RbyZyG08bxFV3Qggcc18ZuU2mMtIRBdb17OzjO8crmQCsXMx8Vjy0ALp+YfaL9s7Jq6uUFEh05Q0/zP29dH6sB87FfDoEzmHw5fZI8UfRcJKsXfG+KBkJ0Fn31UlJADud5g6acpq7FslW9jv7tQmky3wm0gypFWUyH/Pvz5qZ4MypeEDR7d2m8sWB3k+3PyF2293dNs6nFmJR/Xn3GAmdwOjj0aM+DEc/0B4sRfm34lf+z34VQElrnsvPfvGCsmz3busgEQ7U2j0As/nIcIFFU9TNhRlKc12e3u929ofE7E+eFGcyYSslbzWOqr9fhW5ZXxGCKgAEAECBUXENVMdnYFmavno581or/xVjWmBNMcUUU3y/kBIDs2740cPXu50DSEbkF+aImKjpHNVPiTpZPlM6GbpXOzTd4frlmVv1CZ2DD0NClIMN4WXNu6+/+4ru6uZibv0/tgCcf2d+7LOXL+VuVbySKx0NOml7t3tUqFjPMr+o7ULE4rnYLBfSVbvd0QWelSTOEKzHjaKtHlUUlrpqqXvS3pGHYa3SRAWXMqfSEXdd2TWdyWNe145pjGw6Rt25/d/nr/3vnSaAze7Bb80v/+JlRbOtxblobbUHjxwY4Nr8zNP/8A4NyzPvvDs3XLAWSu2MGxIk9ghi8ushLAtLC/Fdu/V57Wu2uP7VYFpgHQ9GEBkiTKEAQOI5ABxLUp0I38PAp0MsrQdAq5Xhxx0RGY2XZUXR8JOxSMC3TVLUOQE+0ULDBuBgYHCzbBsA61nAePgOREI2EHehY9v97aFoEg3FYpCMRYK8ZfSZJCJaIlIhk3BXDvyWfBLPAghSFHwnYyIoA6A1BYCy9xyAtrcJQC/sADCqZQBmpw3ANUwAjDSwqnkyqUgCvrKq2lHgc1f1noZ+b0fLhi+KIgKpWCzlHQaaAWAHevAJP1qUAPChKIAeYZuGdCREa8XyRPnEAQhLPICwJMJPhPeC8olGimUBROQAfB0VcQWqpokBlThI2CLv8bguywKgmDaAcs8EsN+xAJS6DoBWDwBMGwAEDgDSQZIyr8A3ZqZDcv+gkD0lRlFCf3qkIFGhKSJ8QpTQe17E2lAmOxG9eaH5zJBzkCjYguM8nJcISU4/ctpwg9Nmiu8SJJZ7KzS7ul56anwdC5ZIzuAh7ClHRWm3GsdXDzRFCXlRrUyY96Fp+sql9K3aazjmklIg1pZ2at5WXcqkV++NcFRX5mc2P90GQFFoUCOUTjwqP+p4wxKWBTft7Csn7Vez1WlsoQEALOAAymECqpMiFwjPCGHeoW3LtWyHpWmapW3WqRjdrU7j1artcamBEtLB9JXZwGZv59UU9V+Uav994VRRe3n09xb1+x+kr39WrgNooEJTlOO6TXhltDrUS4Nl6MbGUI8jw376ydY7/2Xxy63BgJfKnes387cKJ5qcPRo0TeeT4WRS7jHG01blVnsH/vzDG4tpgTXFFFNM8d0HQ1E34/ndrfadV3onnxyvNoRum3pUkA7zEjLs8XmaF2/kPp90AxY49vS52BevQ1EIDJvqBV74vepknm+9UFx7pBqRKFqUOMdF9nr24c5gWo2mqMjp0G6pBICl6cypwOPmgFRjKZxPx1Mh1nHR0517B43DiKJviNPheJYKHZQ6hf1O9RXNHMFMODI3EzZ5e7VV1u2RkS931Y/W1RAfuTkXq9qlsj5S/v5nSbyRSjWNY3wJGdkrdktaczaU22srBdVbz3CBlQkHai/HvZadnfFC2TUO5fBoiooExaDIcxytGRbRaRDIIicKLM8zDE+ZlNO01D2lvWFVNt7o1jjjmBZYx8NhWNOlANC2A4DnGAC8S6Ofq64qAHr1HgCbdNBTFfS5K9MAPPrB111Z8BkmWxABCKIEnxUjLsJh25qX4uTlaQ2y2gnB4HAigOHUOr/xnAS/1yHx7jGSDICVZAAuRQPQDQOjtjsSa04a3kkcCyAqiwCcXgeAWtwFoJf2ABi1IvoiIZJW5RKtGA+ADZJ0+AQALpEFICRnALDhKIAK6XLY0wC0NBMA2QIiVBJYE4Ck6vAb/wEIxpLwGzJ6BkyWA6BoBnxDIiHAyDMN0VoFBR5ANCABcDUFgFbaBWArHfgRYgQkbn6Y3gvKQQDRQAiDTCwbgOnRflb/e8nBalImfH6ra7gAiBWGmI10kwIgcIPMrahkA2hpBnwmLEC8e66DfhNJXUefrxoS1Tm6iL6B1BzisezBRZ8QmYwwCEXzA9J4AAz5meMwIEodAM5wV0dM8R3BpWhGr9j3H37N1O8+TNsGM74wLAuHFViRmLy3f5QE58qNyfRGWBaSp+T79derBa9Js/efDWqmq9H0w5fjK/9ie59J0eGAMFxdAbh0PXfLF4FdupQeLuzezSc7bLmsvyj7pNSpvDwv5G7vtJr6ifoSHgsKuBaf1Wr2i7X6Po4RcdfaPaKICgj8tYUZTbBWm6Vh92XHMD9+XmYZ+oeLKzvmTtf0LnRVTd1oZhbDqmIdJVRvmUW/QzPSAXGvrbQMXaQ423XtoRpI4thXN9TQTYyxnPwEkikcEJZPJV7otWLP5whfpcsN4NsZ3V8bpgXWFFNMMcVvNiIif9ivOJq5GczdWy1MpBFmwqFcIMy7lOvCYtxn9WpbOybf/FWwzCs1lw+NP5Tm4Xj29KXUrUnC9nQ0SGfdtebrScRuJHL3Hw5qpiAvPF2dXFDajtPojJBDFy/PflHyJrZuXJj9rObriih8uJx41NnE6H60zN4jcyM/E0m3I+uHxJSfHKfDcanNPXk0gVgSWFZgGFBQDPPVcFRFN++vFwHEZPl0PmYKzrNORTG9qsSy3Y+fl0NC+L2F/JryklBuLzpdx124EKvXjENF8RIT6v9MOozxNEMcBhx9DCWZPBN/vjOYIpydjTyqjxzHsCwsn4k/7JY+a7yGrm6wwpA8G5KCIssyjks5Ln4pPOK3hWmBdTyaPa3W7QGIyAIAluYAmJ0WALPTBGCR6G2lAz/8mkQZOR535aKfsc5LgCfmsnkRAEPa1ZkGfNWR7bDw6QSvIyE5pwk5QcgbTyhDmCoRfp6W790T4FvAyKuXeiUF4XNaiq7DlxZ5bBlFYZTBIrlfrqECMBpVAFarCsDqNgE4ag++SY0QIRQdBMBIEgA+ngYgZOcBiDMLAKTsHIBiswtffdXSTQDKEO3EM4MQKSJ+6viXe68bIE3DZ1m0noLRJCrCDJFhDEsCgFhAAqBWSwD0agGA2agAsJVW/wB5+U+E8POytcL9n4mfzmN9WCK/4wCEQxJ8RRcJDNNtG75/UOJsACzj+sfEoyEdt39GeMvJHpE1kO0ZVlZ5J4/Xe5GE4EsAmEAQfXFbKAKADZDXMHyLKFFi+bRloH9idFUdQLurAehqbQCKYfa3n5wM5HAI7KE3zineKFC88l9OpX/xcrwikVjuHJ3q95XrIxUILIVilYNOYa3VHuJLMqlwOCXstQ6tGIhGc/zbD5fBPCyVrq9knq2PC9iXzqQaonm3NOEefyobrQZ7RKZ5cgQ4vrA1wspcTCYfvzxRWtK589m7zSK5wlw6nfmi7Um+OJr5wVLoUef5YR+s6C1R7v0wdOqT7de2CxCwNP1OZO7ek6IzVDzJPH8+nmB0VMvdykHXdi0AAZpOxIPJTIiW6F2lc9AeOUbtnk4qLYFjrs/l2CD1uF3umQaAjm7863p1MTKbTxkvlRKAra5S04K/m1s50NYnbhXtZuHnou61FAApMVBGD4A01JLEsMeLm1MXZ27vDY6pJHJGnFIaAxrq3HyyyHcmujIPg8iy55LhRJA1KbWgVdtWc9cd5I1MNVhTTDHFFFP8EmE69lNtPR/JkdthH5eE7Fj4UEyWzsrxJ48KD50JFUyp0r6Umd3DoQVWUBLwimuQekWYNYwHauXmzXyroBi6xfB0MhNqQn9Qrry6HgBXVrKrerGnvnbb6cuhzL2tkT2lTza7dOVK7qtGgcyvLc/FV61iP+flg9Pyk87W0R/XbHPD3jgXyz1tvHZfKY5mrvIzdx4PpkFlnruayDx/Unn6Shdq23HK1W656n3Lxfl4KC0/bzfGMiB00159UQYgcOzb83O6bD1uFB3X3Wp1dtrUDxeXD6y9tqV2LPNn23g3dT0r14ragEmiQM1KF/7PrncCnAvlf1HoAsiJYa/Aogc1w269/d4Hi6ufbQFgWHr5nfy9YrlPsyXjATYnPK97hdpsIhSdFe/VDw7RlY2DpXBtJhEJOi/VQsGqFt70ts6TMS2wjkdLM6qKCt8nKDEUALPbAmDUSwDMJuF1WgAcrQfAMckFgnBXLAYR5AwAmhT+Xra7DT97nZN4AIJDnIkDBotjGACmPtA5eYYvougSRADuUDIW4bTY4T/JeWwAACAASURBVKDzYBgAFwgCUA0DgGZY8B9ByKObzyExAERiIiP9FpWBqsxL8yLZXYRQIdFK5NtZrv+NfGoWgJQ/A0CeOwOg69IASu02gKZKhEdE9AMAhCthvfz6oWj1QXvRwZASRRRRQZGGicPcFaHfoh53VQSgHWwD0Eu7/UNm9zroi+FYHn2qLxjpH0RG7vYH00s2J0lRZPB5of/++USmf5iITpNkuBskXh8ugJ7uAuBZAEiHKQCzARZAJijCZ9oaLxoAbLU3GGSODGkQvpCOi8YB8MkZAEJqFr7EjeSBEQbLY7kEEb7WioScddoKgEZPw//f3pnENpJmd/4fe3DfSYnaU8pULqqsXGp1V0/VuGZOBsrT8Mk2DBTgtgsw5uiT3QcbcB9twBcbht2uNuCDMYYHsGcwmEEvVd1dlUtlpTJTWy7aV1LcdzJIRsQcPgZJKZVaqlSlTOX7HQSJIoMf4wt98fT/3vs/gF3SqYoGIFttACg1WKUkYLneu2VSsF4kxvyO7gDrmj86Nb0j5ng92rcyk5yu7qfrJOPFPbJhLEQ793RgtL/LpW4Yt1mWlQIA84m9s5R5nr8yETlSwWDntRyXiFV2PWjo+40KgN0uD18M3oy1zsb4YHCBS9WaTQAih/805mm7gO6PCRPOTLTp3SruHsM+iDx/WeqdXuxoexdDofJ69emksT1ZWctgLcPxuNDn94XtRbO+nM2X6p3tXa3RnFqMAxjw+XoHHJO5rbqu/2I5GbB5rgz0zBZXTJi3kxmAG3RcmvCpMq8b4OayzVvbLUVT4oW1ZGtDsJxt5dg1K51kO9PEzY3NN98ZhmGulYtfdGlXQ4P+hKqlMhn2SV+9FLmT21zOHNx9yKXIF8Nul81cr8XXG4vrL4yl6N5QgEUQBHEakMQdOTqVVOdeyDGzzWc06+3G7pDxDNOigNv+uLxHntCe+4ZHoi/gVnuFrxZdARhzB1Y3dsdtFVnneOzZSEbg+YuXeua13J1YSz26fK5nuhZrR1fvnvXOHC66YuT1qiIEjjTmN7z9zB6d8Xo0+nAyZh4UFO7CNLC2nllbzwDgOW6sx+MPOjiFL+jaSjbHsizi2WI8Wwy6nUPDnnu5rXS19rMntYuhoYCv+aS4AWCtXF57ygpV4oV+fuRWNgXgsq/n8UwKgFtRlpd2W8zfXtsdr79ype9edlsrNwFcHu3ZEvLde4IuRR72OLw2SZLAc2ZL/eQMw9QLenmzmlxpJg7K8n9hoADrYApaM1fVAERcdgBGw4SlV9UzSQCNTLz9SKswjSXZiB1TbMgKrEwsJksw4YSVerGLjF1prJZQMnlY2aN6Q4Nl7W2ViXXK6HjY2kNtdRtk/f4cbgCSywPLsb1Sb8Cyd2q17TM7tYosGUgQeFi1e+yzdJt9M4umVk2i2wfLjIodg++yVlfC/QBsfSMAGooDwGY6DyBVqQGoNHTrJEEWOQDOlku+CMApSwBUqdMoEIBhsjq+jnZVa3S8qdjgbTwHy6W9WS4C0JIxALXtNQBabBVAI5OEJci1Tppqa3/MFkxCY/pWlVX2mQAMZpfHjPKZpZnqAKD5QgAC0SEA1wbCsHoOuqQigFV7HUChbgJgklDUKQK4GHQCOBvyASgzO7F0l7rG9ilY7hRz/PKHACiRQQBKdBiAGhkAoAbC7XPSnYuGug7A0Mqwku1azR8rNQCJkgZgs6QBiJebAPI1w3pRS2kL2HgAbhAvBmZXnDPuDS7PdjyK3jpck2MArpANz8h+Dg857mf20J+EgxKf94HnuKsXeu+Vt6rZI28LtgkK9lXsHtj09vbbr/RNPdhx+/d67AMj/tVa/pZVnyhw3JWJ3puZVbYciQL33VHPzEE7g7sYkSI3ckcICoZdvum5TtrW9Z7eR1/GzC5vuqGQt0e2l9OVXLKk2GWn1y4HlIV0ZldufjeGacZi+VisdR4knh8dCLhDtrhWXspk04VKeqrid9mHRrxfZjfmkjkkMR4c7gtwS+XNXaZZY85oMi3eyqQA+BRbaq31phf9oeml/a4imyoNXQreim8CCHkdwQHbnUyrGHMs4B72Kzkjt1lNJsxE4itVCAZV2/WAwyFWTZh1Xb2TqqS0I9dkfJtQgEUQBHEaMI1OhOU37CtWzHE+FJq+e7joyq3OZvfQqASef/XZ+3eq8hW3kkf7/E2PfiP/VarJuqk9wy/+dnrr4rWIQ5AEEw2YuXptMZPZTHZORY/faesRb1g28T6bMtEvHph31Y1LUofkwc+Xjuba6qkoMb2VTTXo9S5OJ9pdgHiOez3a++jWasdLNFtNbuYB+EIuPaAUKocKKXTDWF5NYxUAzvf7PD32mUwyU6xmpqp9fk+k3zmZ3Xycyj1OQeJdl8Iet00UBdTq5nax9nmsFSwGVHuw7Fgp5ABEXM6luf0MtCIhtxHh78ZjHHD1fO+0tr2Ryami+OaAvyJk18pr00fOUtvNO2Elpn2ZsxTWt8NX/tc6BVgvOJpuaDpr1sbBagzH9KpmIQ2gkUsD0MsFtHsLsoZuXabYrKSLpexITi+svCjR7kDHMpsDILByQHCwtCvmMtUyPWKyCns2U8hY/lOr2yDLvnKirWDZnQBKNQ0A67vJpI5ml52JyHOwSoFY/hPT/PWn8r26m9Ox7CsGxxKSHB5Y9YNqOAogX9cBbKVzALaLVQDFerN9ZJvIA3BIAgCvTQbgsykA3KoCy02+XSTCtCtWXMkq3Zh21cpIZe0gBQGAQ1UAVGNxWH39Gqk4LH2okU2jXT/IksZ4Hjur9tjXbod0NulMWzJYOlpDgyVAsjo+LbkJwDYwBuDNkfMAetx5ABu5EoCC1mif6rDTBuBM0AtAKmUAlFYfA9ASG7DKUVmml+D1w7IQUwfOAnCeuQCg6fABWM7kASQXNmD1TBSY+b4kwnICU7v6LbbOoWECqBsGgGrTAFDQDACZCjPTBwBJYKfBAClYLw7Maw2AyPPzq618F0kQ9Hj9kE38ouf8k7Hd1lOKJJ45791n/06SjnwfCXkd0UHnnfSGeRy+kfHU3rduwzRntvfuwKNIwsR45F5xq5pvKWfjQa/kzD4pHXZAHLhLrpHJ9fJC9WglhFf80YeWIwPPce6ymK63AkRR4K/6ww9v7h1xZpPFc4P9X1ae2VPoWaxvZNc3snab/OqF/ielbDxTimdKvV5P/6B7rhjP17X78T2yo14L9K0tFlbKOQA2SfSXpLXKM0Okc2cjC3qumNUcqjx0znMzvcbBfGcokuPij6xaRYHnXKIEIFf/ivZWHLczy43LAl9dPf0WoACLIAjihYcDt5RpbXxf9IYer7duma+Ewo/vHtAGmDFxue92bHc+zdmBQNFRu5/Z7wiifISbnMumnDsbmMxtbqT3NiDlYJ4P+XrcsiAY9Qb/y6e8J3bR7/AkN4+QXc5z3OWzkXXk2z5MPMe9dyY0X1uqP8MudRciJ5x3Ds0n6j+LHZy1/TS1rty4iXB4cbITMF0b6Gm39tsT4SCx0KZIY+GA3eTNhmEaEGxCDcZKOpsr1yrV+oPJDUkW3r7Uv1DOJnKlRK6kSOL1wT7BweWatWStLPG8W1JDkjObqLRbVXpUZch0LW48U6U7dzY8o6Uaus4MzO6lt3pd9jM9mC89ATDqcl7ySUAm14hrRg2AVw7a+egv4/W0tl8jy6eZyiqv+s/HavOGqfOcUGoE23YSzycUYB0GTmx1xxMBNHNlAHqpAEvHYsKGrtXQLjETbLA0HsnN3MwjAGR/BIDsDQCQnG4A4EUArLRV13W0i9GYkXddg5UL1VKwWAJQVyFbS8dirlp2BwDJ4QbQBAcgU6qgrV2xhnqs7A6AJagIzCMenQq+Vt01U7PY8ZlexWQVW0fHYp7yTNmS3T4AuqgA2CyUACSKFQDpigZLu2KykyLyANyyCMBvVwEEHTYAfocKVgoOywKKa63drA7O7GpZWNc5WBb2LfsuWQJg1msAmsUcgEYh0/7aLOYB6NVq+zgiM8SXOx7uAnOQsjthmea3EtEa9c4xmSpWyMPSt5hwKG+tAqgnNgHUk1sAQgNnAQyO9AFoMDWQnd6GBqAaXwFQXF8AUNtchqWxsXdklYByoAeA/cwlAJ6LrwF4kioAuL+6AmAhWwOQqXbkVa/KAehzygAG3CqAHqcNgEuVAdhlEZbmx/zD8rUmgIykAygIJqwcrC4hj3gxGHZEblm17I5mpw7QLB7KkP/8hZ4vd9qm8zx/9VLkVnbdKB5wHZj8od5CkcSJc+G5ynbbxnMX40HvgF/c0OKZ+krGCpn+y9i5ny7sF2P1K+4kDhVgCRx36WwkxZduFzsu7cNeV19Iny3t7Qj1NGPO6GZC+NnWV7yvX/CGl7py44QuSUgU+O2H+x22fzQ4Gd9PvhqPBmtLxdX53c2FOI6bOBu09Tjm4qlyTZu6tyFLwtuX+le1wlahMLO44/TmUV/v8umYiIQLy+XF7DOjq8EB/+NmrqHrPX6nFmjEi6U3B4JJbCyUape8nrOecqw2s71zHy9XT+WQej0cepQNr5SOYMCwWCguFhC1j/tkaaFQ0ow0+WARBEEQ3yxGzQnUAEi8sGDtD7oVZXHhgMZzAM6di0yXk3pXQD3a56+46oc0hNQO4aZ9eSyyzuVu5PYIrXiOe70/IKrlhdLK05niy/U1QH3WYQWOS28fbKzEAROjkZRUvtMVWokC9+5I6El1aaF0KOHKJalhDNyYT5j7+n7tj1rp9JFxysp8V3Djc9qyy3ureqLIj77WP5tON7T9TrWzxsUSe+zimaa59iSJJ0mHXb50rW96O1HVGlP3NziBe/NiNMNp8+ndtYEAhn3esGmfu7+1ZyUmQ5aEoqtZydddNsUIGvFy6TtDoaXGIoD/NuiNaw9iNRNAn80VkhTTxJNKvqq39mSz9eS1QG+3OyzPcZecZ3JlrlJvqhLvsYmGUF0obTXNHZ96q1LZOoJkeZJQgHUwNpFjnSjcdgVAYbOjWjE3c6PR2VHutkdiqlXLzTzSD0AN9gAo15sA8mUNgGHUYNXKqbLY/p75Yxn1OgCd6ViszM3o8oXvqhlkHlfMq71QrcHyQC9rDbS1qy6zYJZ4xLQrlrgjCuwrU4w6XuNMwYLNjrYpFNdlBGWzA2iAB5AsVQCk0p0+g7laA0C50W2zzgPwKBKsVKQetwNA2O0EoOUzAKr5BKzWe8zMCYDs8sJyTm91zTNNWPlYrG2ig9UPVgqwqghb01SrwjIbYx9KkFnDRDcAyRcCIIf6YClGLH2NufvoLZGyBEvHYtpVLb4NoNHlfCO5twBo6W0A9WwCQD0VA1AN9bUvCXZiWyWoqRgALbEJoMHcuaoVtBtN+oIAlMgAANfZVwBMx7MAfrqcBPDFRgPAagoAKhoHwK4YAPr8AKCFNQAeRQQQdfOwGkraFRlWRaFLkWHZngl8GYAs1GHpYexO67M91/kNRJuQ4v3C2sGZ8EXm1ltB1Vl/4NHSAe38zo6FH2rptis3z/NXLkXu5Daah5O+ABSb+yUah7yOwIDtTmaPLHsO5tuDYU3MrlQX8Iz0noDkXnx2vdlr/v4DGyxOnInkleqXhY1uB68rPX7enp8pH0G4WorhRimJrxFdXfCG52Y7EdWo37ewfHB3yL4zwYqPu7N18D6voB5wQ69V6o8+WwkHHcGL0XurMUM3Z6a3AJzr9QYizqZk6IYJcAr4SlZbnEsmjf36SAI4/2ovayU5MOa+l9l6sz+43Fh0S+J7vc1Y7b7ICe8F/E4s1JpT7PmDXm+Du/qTdE43dQB6lx+DT3aKtdBPn+wO9Xxq8Gq/J9GMJ7Wv25Lo24cCLIIgiBebeL6zKWgWOhGA2DggGjh3LvJQSzP/JwAhj8PdL988SicTADX9mQrQaJ9/S85vZPa4T48HPQGvtliex77+DG7BA+wtwl3x9z56tJ8+JwvC+KXgl+kNdEWAIs//17Ph+8XHRvWwW+DjroFbi5XuzjA8x533hD28YmimYaJR12xutYL6w3zy6QYynbcu7PiPReV23H9ThfLVy70LVjtFjuPOTPQYHnF6fdtIHmqoxWc5mO0kmypnf1l+9ZXexUaR1SRuxnKbsQNiqadRFXEqkwBwaSQ8mdkMOmwpfsM08F6vHqstDaqe6671auNed5pVQ88Bn1xzv38nnwTAQWQO0hIvKFr4wfYeO6TZmvbzhQTPCa/2jAbc5nJ1q927+vmHAqyDcStSj8sBq/9gK5WnVgZgMqtupuioMgDR7YPlY65GR2D5mOuKE8ByOg8gX62D9aW3FCPm/OQ1VVgu6pxhwFKtzEYD7fpElhzFzMdZjpfLA0DnRQCJQglAvqoBKGnMLZ01mOuk6Uhd/Q3ZV7nLAJ251bfel60UrXwvFQDfcqVXAOjgYNmCM2uldJmlBGmwtKtqkznFA52aQRFAwK4AiHqcAHyKAKC0vgigkUsC0GuV9llt1y0yGY9JgB67CktlYbIc875iCk05w0znmWrVZakvigBEB8u1csJyQlf7RgCo0TPtR1gZptGsA6hnEu0h8UkFlhLWKFYBVLY1AEzBlFUNQLNYBWBUa7B0LyWXQlvBYoWolRKsBgAN1uSxVGyPk/d2RFC1ZxBAsg4An6+nAXyy2ABwb0EAEIw1AEh6A0DM6wDQaOoAwq7OcuyzqwCcvAFAi6+1L62o2wcgOhIFEHZmAfRkiwDiJQ0AK5tlBZ57bB4Qzxm1ZivAOucJPuoyWMok96uMP3++Z7rSCQjODwZWhdxG7sg32mc5uV8aDj0yk8x+rxuR5989E3hYWcyVDxDJOHALib3vptcDfY9mUs2n+h+3cdmV8Ij9y/QO5azHYRvpNScLj/Z/324mXGd+MZ9pWh/RLkpX3L2ra/nFjT2iAbfNNjbsT6C0VNj928u+nsczO/6YdunDpon7+fTI65GAaqubxmomfy+f2mXv5XHZBkf8kDkdhgi+WWk+ftTpTvNwK3mtK0RjDEZ9QafKmUiWa2tbnfSvxelYIOwKjwQWYl/xT3zojG+ykOSAglpDHZf7lNli7TcHfbHavUGb54p9ttponQQH76kaBcO6TqJya1fXMFwsS31UHmWdNO2idNETFhtCs27wPESVL5ra40Kqruv3YmnEIAq2y5E+n0PQuZoOQ4G019CeFyjAIgiCOA2IPM/n+O5gJ51+ZgbxpVeik7l4O0C5Mt4zWdlq1HeoL0GHLWJXqk19o1jualq1G59sSz3VYa7H73xkJivN3dGVTRJfG1ZmSvOH+UQX3UM/f0pZkXjhNVf//emYsW8Vxtio71ZmR7q3X1Uj4dpSOfusl+xxEGf004Vs21/9qj+aWCvfXX3mbl2xqt17GANwbTjadOnTmW320muB6Mrj3R9E53aP3zDNxe3M082lbao0Oh7OoTafzmyld1R69p5zDanumalNlim1jqrdpVSKHcnO61Qf/t85AHa3KkQcut6Zx3Si6KjWXVGlWP0qblJZrg5grD8wU4iP+NxzxdVRlzNRf6AI0jXHcq2ZAXDB/soQn+T11bz45ufF++yFvLVZu1TSAUy4hn/2JMEB1wN9sdXS9FOds52qOjbg19TGTHa7qZuTW52IkOc4fOcrjP1bggKsg/Hb1ajPDaC0vgBArxRgpeO0spRY6zdWSccsi3qHATgGzwIochKAlXgKQLxUA1Cqd7ysnLIIIGg3YGlILT/fVo9CpiQ12o+gVTPIfKdcsLSrVLECIFOpwur0V2k0YVkfMe1KZR7xrf6GPKyyMqeqAHAoEoDmDs8tvfMZWXdCSYalXeWZdlWuwsq4YtWC2VqnsR1LkFIEHu3sK1UCEHbZAfjtMoDy+iKAWmwNQCObhCU+MWcv0eVls9AyAOMFAI5wFNb/zSyjiJ06Zhtm1uvt57PBcxLThNwAOEkGIPtCANS+MwDsw+cBOIfGAKTLGoBKrQHALqsA/ANjsKzIWG2goLK2kgDQrANArcK1v+dFDYBgywIQbJ0+huyUcsxgrFoB0Cxk0c4V02oAeLlT1Si6fADUSB+Ae/EcgPvbdQDTqwKAgYUtAGbhCdDylO9pXACQCgbbl5BPlQBEvU4A2Qc3AdQ2l2CpcYLdBUDpGQBwZvAcgKGxfgAb2QKAQq0OKx3wUxAvBm96B76c7mRc8RxXb+y9Z3T5av+txEb79n79Uu/N3Fr7R1UU3xryl5DZqMRTMCHiks9nVPwP9nJLAuDmdjcv5AB3VFnN7g5lbIJwfVh5UtqvGWIbgeMX4rvH71dsA03v5NwBiWWiwO/q6iNyuDDAL5SOEF0FFPfjTZ0tYhzwtm9ocnrrkNuKsytJAAN+b9DjEHh+eir+9AvjlYML6Ow2+ezF8EwueTu190mLFYuxYvHa1d6VmaSmNZO58tUr0cVfdYoJpudjl98Ze/LZQqVQG7zav7y+Q68qF7VLwd5b64eakW4CPvtKPg/A4ZeQxlhIniqal/3cVs14z+urNe8CuOy40m98ydqqeppfnLddfVSdBdCAA8gH5Mjt7bxLUh9sVAG87Rm6O7UFwGtTx3x+yeBhQhfMVK26ms0+mI8D6PV6Bgfc89V0svpiNH+mAIsgCOLFRuD4X/MPTs7uyJg2THOgz7+2viMqsqnS8ESIJSYzrl+Kdhf3XYv6a3LqYWVH9vdWNSsLxR5HKF7erVRxQCy2eyPS77ZPZ/dI335n1DtVfFqg2ZtLzpGfbO2IBs55gsX1+qPiwbbpNkVKaTtGda0vuFBaePqZAw7HGZftF/Hdx+TAqfVgqtI6e2+5B+/OdKI6n0096wsITU5vGILCZ7TyfC73tKK2nSlvZ54ZCqzlcm9f7Z+6t7fJvtdjGzwbmM0kb8RbT/C7bIO9HqhomEbT1B283Cgbs8tJwzAm47Ez53y11Vq+UL23uvXWd4bmPm/NqWliOpYZfnesVm+ubOzeDeQ4rsodXAT6NL393rVMBcByJQMg0UgDKDRWANi4pRrgE4P9xh2gLZiZHqEViCcaMgBd7wfSPdzgQiXxa76huzNbXps6bvPPzsUeLuwIoKNee/+If7VW2MoVkrmyJAqvjwxoSmMun9hfxTxxKMA6GI9dqTET8EIWgNHljcbLNljJPa0efJFBALb+MwBKnAzgSSIDYDlbBpCoNGAluKgiDyBomLAyk9i/Si0X9UYDll240SWz86wboKwCEFU7rLyrdLkKIFWuAch3VQ6yq49pV0xJYpZRrODOY1MBqCIHQGN+9Kwustkp22n5bJl2WAqWyTNbcB2WJRXL9GIZV1qX2TpTztg7umQRgM+mAgi5HABqiS0A2vYGrPQgloPFzjCTmgzNKtNrpYLZYHlEuTwBAFqjAUBkzROrZVgFmFz3iXK6AZh2BwDR7gYg9wwAcAxfAKD0jQCYjaUBbOTLsDyiXIoEYDTgAdA/OAar7q8WWwUge2IAZIcGQNdNa4DgJR4AL4ntU8fEv1YDSo4HwImN9m9bz5E7JZNMCmUKluTyAtiaTwDYypkAlAQAmMUFAPXyOgBBdACQmlVYDuxBOwdg2O8GUHgyDaAwfRNAeXEOQLNQAMCrKiyFrDZyHoD9zEUAwwNjAOSeXlgZXZ+CeN5xNZTuzsFtzICArl2yc+ciaUn7ssur/dqF3nZ0xcF8/2xktjxvaHvctOpG80LEHV/aHWCd8wRX5na7n/vdtq2nPNrPBT0zpeVDfiK3aLuztsOz4WoguvQoU6sfKhooVTQ5KHTnmzsdOp6qQrvg9UQdKx6x9+kjXHIN/+xJK7r6tUBLXAHgUZUL9sCjh9uzCztUn7Ferz1qux8/lKdrm9vJzTdeiU536Y6cwJ0ZDMgBZSoR37Ti4PODQcHDPcjGYuUCdgZs/WOeXrinnsSXMtnBAY9vk8vmKrfWt958e/jhzRX2HMM0l9b3TrQ6/87Q7dUjy1cAGpIBIOx1rFdzPlXeriUHHY6SvuIR1VpzGkC/EoWx48gbjSwAkXc+yGWcoufTeO6ss++z+cQbgf67U1sXwqH8QmmmuOV1qKNBv2gAhgmRzzXqi9vpqXsbAs+/cSm6qZc284Wp+TgAt2o70+f7CoP/1qAAiyAI4sWmWKkH9nr8UTI5fiXoF1STQ6peuZfeYVM5MRruttz8L2dDU/v6bQrCHoGXu67iqUbL4PB04vugX5o+tPVDhO+fr3X2+F7z989NJ/RDyxUmMOoKPMx1snkq+h52WbFK1SuPFTQT2JFKbxOVBxutf+3Oe0L3reB12Oc1Y83pxT02KDdjOcRyb77ed3vrCPGKYZq3Mluhc44htwccGrqxnM9O1VLtfttnoj7Bzz3IxtqO5f0eh0uWdMNcyRfrTWOjnN9A/vXL/U8eZdZy+b6oOyw6E6nSF1ubb3x3ZP7mWrO5d0g6cDbEh9WvFl0B2KyUAPg99vVmLmRX8zC9sgRAFcSWGc3OyaqJVzaLDwE0uDc0I2XjxppGNpEV+xye+ceZ8WAg+TBnGuabfdHHt9fmH+6IrfvCzvD54ION+Oz0liwJb73afzu2YQLlWn126Wh9ir5lKMA6mEapUM+nYdkpMZg0wsy+mROVHOwBoPYMAOBcPgCrW0kAK7kygLUCy0/qmAy5FQBwy50Vp7u+r8Ga32k1WElFLJUHfCcjipmbF2qsaq8OIFurAyhoTQANwwQgCRws7Urq0q5YcZnCGQBqySSARjELQGciEEt4YtWRig2A6ai3H1G8fnQslJifFoe2nxbfUa3Y905ZAOBWZABeuwKA1xsA6rkULMuoRutrCu10JVkGOm7i7CQ3nR4AzZIbgKDYACiqHWid1FY1DdO6WFtGhxuWmsXMwyRvEICtfwyWdjW1sQ1gJpEHsFqoA6g2WQ6TAEuWcwxGANgGz8LqGGgNtQFAzlcB8CzVLOACoEajAGx9w7BKSgWHB1biXbNShJW61xLqquX294LDDUvHqmgNANWGAaDeBACxlaNqAuB4ppA5AWj2EIAeYYNNFgAAEhJJREFUnwFg3G8HMOxzAIh9dhtAbvImgMz0JoBSlgMgySYAT98aAHdiC1YCHPtcau8QuhLgiBeXx8m9N9RGen2P9GR7h+U/n4lMlR7vf6inK/YmfJGpmT28xTP5Kly7Hyzoh/UxOufs/9V8V3QV2B1dBRz2UbcPNbOh6aLEw84/yqSK2o5MbR9n6/5xT7+KXL1+M7GHtDOqDP6skgSgCKKW0Nlb93vc2mqtUNzPI2B2cuvKld6j6ljJcjlZ3r2TGPQ4okPOL9MbZhYAzvhcZ8JyXEsmtU0Wa/X0SMO2nmxBnN7O3klvjJzx1WPyZr4Q8juiomcrnr+9uhGd8PZy6tJ0TLdqFGRZHDwfrjq42c0Edlq+S7Ig8ny1tq9tBgDA47ZtFUsAFIVHE4LAA2iYpg1I1yuwcYC5WH086Dgr6PMAdHHsVnkdgE0c+N/pXEiO/p+N7IRz9NOFzJgesNvk7Hwp4LCriebDm6set22kx8ez9U4WYvlqbDuXTZRGhnyNiLS0nZ3+cuPahZ75epbd+55nKMAiCIJ4ufC7bEl7qVxrZQJEXfYF7eDUqHhhh+GnXZQKW3vf4dKFSrTHvVXeEVGV9UPZF9kEeaUrZrvsj8zOdALBkMMxavc9monNNndIL36vvWcoMJ/qREvJRLm7hN8m7Ii39sEvO2+utnLhr3mjk2sxAJIguEvSavGAGNHUzfRSgXdwXyc3SJWlS+PBe4XYZjoHIGRXX+lX54qr04Udx9T0xuPSOnj8+vjIF8ul5WK2J+zsl9wbqYJmVy5N9M7OxLYyhS0U1GGl3+/heU5r6rFscTKXRA4AOB5D/QFPyFYwG/FSKV0um9B5juv3eCI2h1HUHy9sm/oeH2RgyLeVqQKAyQFIVzXOhbVS5apNbhh1m/xqtX6/btZ/UtkaVa/WDG29uASYPKfMVUd15FdKoR6V/2w5+7qnf/ZRYqjp4CVJ2NBS6dL1s71Pfvbk8f0dGuGVd8cfJbKx1awSF0cuB5a3M48exs+djdzDkftef8tQgHUwRl1jNYOcwPyu7ECrdIvlGLEGdsxCyRaKAtjIlwAkyjUA6WoDQKFuAKg1TVie6QIHWJlYrWo+RQbQKBdhFZcxYcPQGwB4SQEgsA59vACrgK7W0GHVDFYaOoAa6zZoApaCJXe7bdlVWBZHVZb/lIoBaOYz6Ph76bByywTVgbatlNkxlHLZHACYyU210YCVj8X+HOu6AUDiWc9BCVZKk0tVADTLXW74lRIs5ayVAcYULL0JSynsekIZgK51lTpKMtAS9thpsTKZXO0PwiaISXGszJPVDM5sJgHMJAoAHiQ0AJv5jlbksTG/+DIAn5oF8M7YWQD1dByAUS3Bqvhrltn3MgA5EIHlrWXrOwNACfeh7Q5v6AAa+QwALbkJy8m9mU+jbV5vd6Gd+sZzAByyAMBjB4AZnwDAkxsFoEgeAKatB0BqyAbg7T4DwPU+P4D87JcACtNfANi+swng8ZYEIAUDgA0cgIGMAWCwxm6uHAAIAqyrh4myxClDkUTPgPIo34kVLvTaZooHeFT224N3F3cYDVxx9u5jWDCseHcFWDZhd7HhnozIw58UWvs+w07f5nzJsKSz6z29q7Op6doeWeGZXEWqaFde6bkfbyXXryXyoxcCi4VWyKVrhzVMCvPRh42WJ9Oy1bvm9XDvgy877yvw/Cv9EZHjys3Gw80d5YqZbPniSGRm+6vc+90O5exI4GElwZoUcTD/00h4Q1+fLdYAcOAuet0jLkHkDBPYrvL3MnlN12cLy+P9wWTauZYveV3Ns2pgfiP9hRa7fr03v1GObRdq9eZCfIe1wdBwwBlQl0u52WIaO6sRDNNcy+XWcjkAwVHHWadvfm57l6xVEltXi9bQASRK1YsBV7peDCkjW9XH02X3OVk2zLphNOcrc+yZIu9ca7zxuJwKSNe+2M75GoN9NuHBXPx1f+/yk1S0KhYr9fNu59z/mwPQ2+9ze2x609jcyFbL2uNfPI6eDed8jky27FqruH1KoaI9md9+7bW+yfgB9aQnCwVYBEEQLwuSKIyc9z7I7AiMNmoHNGzhwHE1T7fp7Lg3OPV4v/SXWKwo2vhuI1Cv6F5/hid7m/POgU/nt1ms75QVpLhSrQ6AA94K90/d3bvgjtGo65sPM6EBR9LqHxzmnIvWmOeSRdkj7Opq9zQhxf35amtT9bKn995qDIBDkednOwGTXZHGFe/iZy2/+8vvDE6t7TifLn6PYG7iTERwItesKbxo4yVR5xqa0WgYzaahqqKsCkWu9jCfvJFtFT86ZOnNYftssWUYNuHzDLuSSe1Bsi0j8ngn4qo0z91MpDeqKY/Hfk4KPUnlK0Ly6rno/Sfxu/EYL3Hnr4RcosKzJu4CKkZjJZ+bsdK8Ij5HJOCUbLzOmToMEQKvI5vVlrcyJpAql1PlsrdffdUTmZ9LVKp1AOfOhu8nWlO/uZ23haVqs9En96Trxcc5NWBTFso503z7siNebTwGwHOyIl66W3KuVVN96sT/XM1MOM7dWMlGy+6JcHjq7ubrocj8/Oa427k8udbT57PXK/M/u8OOH+gPhibG1pZTsfnE+LvnMtlyars4fm7ozuoWAK5y2JS+k4Izn+8qxxPnww8/fDIz9fZr12DJISw/qVWqxnQsSYbVB5AJKplyDUC2qgHIa0xbMgAwtVXiASszyatKAPw2BYDXocLyi2+pO3X2x8R0IwmAoNphlcU1IADIV2sACloDloLV0FkFH2BlXzlkEQDrqMgUrGa5AKBZzAHQmRVTrYK29TlTqgT26RRY8o9gc6Jd5uZwAWiCg9XxkBXfMR2LZS3w4ADIYnfdooK2lXk+BUs5Y+35rDHosFKmWqZTVmYSywoSnd72AFrNCjkelgLUKr1kDRyZXRkbDJsmhwtAsd4EEC9WAGwV6wCSZRMAy69gNwVFAgCfAwAGXCKAIa8TgEswAWjpOAC9VGhfEt1uW6ykFIoNQLFWB8AKmliCHbMck1pqVrr98Y16DW0DMKcXgBqOAtgsVAA8yVQArGVMAJkCB8BscgBE1QTQ6zMBXArJAC6E3ACKc18CKDx6BCAeMwFsowFAM3UAEicA8EMCELYZAFxRGwAl0gtA9kdgucnfW9kcHh7+8Y9/DOK55MMPP/wfv/jMNjJ24DNlkfcE1Hh1RwaxxPOKvfosN3ZGRPEvpTttNxVelGti5aBknXDEEat2RKygXa3y+9nEO0SlUBJrVlJ2v+SJpVvRxoDTvR07VApXwO+IN8rswyiSULc3m1az4uGAktSeysff9XIhsJYvA+DAeZpqsVIH0OdyJbc6J61HsWW7eiqrdrmsms0uA89Ir3u9tGO0Yb8j3izuf5J3DMOuyopWaFQBcBw37lbLevwZL+ecQuRJQTNMUxZEseFMVmoAemyuaqFZqu7RxlEUeL/bJshcoakVntF2xiHKPsGeSJdYPTgARRSCNrtZN/OmVu5y549EHFvVgiwIbmejqtf7HTaO2zZhAFB5yS4IJb1ZN5oA5xIjj/JaUPasprU+2Z3N1+QyfKots5br9TmTSymvz17ZSmrlHfvOgiza+8OlQk2UBN2rNpp6sM+zWSoBCIVdW7Xif//uW59++unzuUaRgnUAV65cAeDq6T/SqxxOJ4CBr/SOio1lbe9ROXz37t3x8X6ns9U9huUUuN1PZZMeBrsdAELHswfkOuoQHA4ACEUO89xPP/30vffeO9LRD3wGi9pCfh+AV45y6DZ2355lW3uNxrnvr717lBmXSqXHjx9fv36d/TjqdAEYjR5pgLC9+esAwm/+OoCD773PZhgS+ysgnk/Y7AwPD3+zb3O45ezu3bvj4+PtNer0cHW/Xx59jTpmvhv6tt9x1xp1SN4JAviqt8ZnMzw8/HyuUaRgvUhcu3btH/7hH65du3bSA/lW4biX7iqdnJz8/ve/Pzk5edIDIYijQWvUSwKtUYeBP/gpBEEQBEEQxFGgAIsgCIIgCOKYoQCLIAiCIAjimKEAiyAIgiAI4pgR/uzP/uykx0Acgddee8115Jq9F56TrdA5EVwu12uvvXbSoyCII0Nr1EsCrVEH8tLVPhAEQRAEQXzT0BYhQRAEQRDEMUMBFkEQBEEQxDFDARZBEARBEMQxQwEWQRAEQRDEMUNVhC8Yuq5PTU3duXOnXq+HQiGOtXQ+vSwuLn7xxRcul+sUdjd7Bi/bFBOnjJftAqY16tRP8VfHJF4clpaWrl69CsDr9QJ44403lpeXT3pQ3xS1Wu2DDz4AoKoqgB/84AcnPaJvg5dqionTx0t1AdMadeqn+GtCW4QvEn/0R3+Uy+UWFhay2ezc3Fwqlfq93/u9kx7UN8Wf//mff/LJJzdu3CiXy//4j//4wx/+8N///d9PelDfOC/VFBOnj5fqAqY16tRP8dflpCM84rBUKhWe5//mb/6m/cjHH38MIJVKneCoviGazWZvb+8f//Eftx959913P/jggxMc0rfASzXFxOnjpbqAaY1inOIp/vqQgvXCUCgU/uAP/uD9999vP1IulwE0m82TG9Q3xerqaiwW6/6w77///o0bN05wSN8CL9UUE6ePl+oCpjWKcYqn+OtDTu4vKhsbG++//344HP7Vr3510mM5fm7cuPGd73xncnKSbfYD+Pu///uPPvqoXq+LoniyY/vWON1TTJx6TvcFTGsUTvsUf31IwXoh+Zd/+Zc33nij2Wz+8z//80mP5Rshl8sB6O5o5nK5TNPMZrMnN6hvlVM/xcTp5tRfwLRGnfop/vpQgPX88vOf/1y0+NM//VP24OLi4nvvvffhhx/+zu/8zoMHD4aGhk52kN8QgUAAQLFYbD+Sz+c5jmN1K6ebl2SKiVMArVG0Rp3iKf76vCxK5ovIm2++ef/+ffZ9KBQCcO/evffee+/tt99++PDhyMjIiY7um6WnpwdAPB5vPxKPx0OhkCRJJzeob4OXZ4qJUwCtUbRGnfRwnmsoB+uFwTCM8fHxV1555d/+7d9OvbGbaZqjo6Pf+973/vIv/5I98t3vfrenp+df//VfT3Zg3ygv1RQTp4+X6gKmNerUT/HXhxSsF4bPPvtsYWHhgw8++NGPftT9+O/+7u/abLaTGtU3BMdxf/iHf/gXf/EX3/ve9956662PP/74888//+lPf3rS4/pmeammmDh9vFQXMK1R3Y+fyik+Bk7SI4I4Cn/3d3+35wzGYrGTHto3gq7rH330Ec/zkiQpitLtvHJaedmmmDhlvGwXMK1Rp36Kvya0RUg81xQKhcXFxYsXLyqKctJjIQiC2A2tUcSzoACLIAiCIAjimCGbBoIgCIIgiGOGAiyCIAiCIIhjhgIsgiAIgiCIY4YCLIIgCIIgiGOGAiyCIAiCIIhjhgIsgiAIgiCIY4YCLIIgCIIgiGOGAiyCIAiCIIhjhgIsgiAIgiCIY4YCLIIgCIIgiGOGAiyCIAiCIIhjhgIs4nlkdnb2n/7pn+r1OvuxWCz++Mc/XlpaOtlREQRBtKFlitgfavZMPI+kUqmJiYnf//3f/+EPfwjgo48++tWvfnX37l2bzXbSQyMIggBomSIOggIs4jnlP/7jP37rt37r5s2buVzuN37jN27cuHH9+vWTHhRBEEQHWqaIfaAAi3h++fDDD+/cuVMul7///e//4Ac/OOnhEARB7IaWKeJZUIBFPL/k8/mRkZFQKDQ3NycIwkkPhyAIYje0TBHPgpLcieeXTz75pFwuLyws3L59+6THQhAEsQe0TBHPghQs4jklkUhMTEz8yZ/8yeTk5K1btx48eECpowRBPFfQMkXsAwVYxHPKb/7mb6bT6V/+8pf5fP7ixYu//du//Vd/9VcnPSiCIIgOtEwR+0BbhMTzyI9+9KOf/OQnH3/8Mc/zPp/vb//2b//6r//6888/P+lxEQRBtKBlitgfUrAIgiAIgiCOGVKwCIIgCIIgjhkKsAiCIAiCII4ZCrAIgiAIgiCOGQqwCIIgCIIgjhkKsAiCIAiCII4ZCrAIgiAIgiCOGQqwCIIgCIIgjhkKsAiCIAiCII4ZCrAIgiAIgiCOGQqwCIIgCIIgjhkKsAiCIAiCII4ZCrAIgiAIgiCOGQqwCIIgCIIgjhkKsAiCIAiCII4ZCrAIgiAIgiCOGQqwCIIgCIIgjhkKsAiCIAiCII6Z/w8DnFbzQUI4DQAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "fig = Figure(resolution = (800, 360))\n", + "\n", + "axq = Axis(fig[1, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n", + " aspect = 1,\n", + " limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n", + " )\n", + "\n", + "axψ = Axis(fig[1, 2];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = \"initial streamfunction ψ\",\n", + " aspect = 1,\n", + " limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n", + " )\n", + "\n", + "heatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n", + "\n", + "contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics -- `energy` and `enstrophy` functions are imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\n", + "Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\n", + "diags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "filepath = \".\"\n", + "plotpath = \"./plots_decayingbetaturb\"\n", + "plotname = \"snapshots\"\n", + "filename = joinpath(filepath, \"decayingbetaturb.jld2\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if isfile(filename); rm(filename); end\n", + "if !isdir(plotpath); mkdir(plotpath); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "and then create Output." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n", + "out = Output(prob, filename, (:sol, get_sol))\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We plot the vorticity and streamfunction and their corresponding zonal mean structure." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAALQCAIAAADn94OSAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOy9aawkd3n/+6m19+6zzTlnziye8RpjbMwlNn8CuX8jCEluCLmRBTKBoCBCFBEnEKSQKxIWRXmRkPxRBJaSCBKURVlICOKyXXIJIkAwhgs2m5fxMuNZzpmz9+m99vviqV91z+JhPAyZsef5vCj1VFdX/epXPT013/o+38fKsgxFURRFURTl4mFf6gEoiqIoiqI829AbLEVRFEVRlIuM3mApiqIoiqJcZPQGS1EURVEU5SKjN1iKoiiKoigXGb3BUhRFURRFucjoDZaiKIqiKMpFRm+wFEVRFEVRLjJ6g6UoiqIoinKR0RssRVEURVGUi4zeYCmKoiiKolxk9AZLURRFURTlIqM3WIqiKIqiKBcZvcFSFEVRFEW5yOgNlqIoiqIoykVGb7AURVEURVEuMnqDpSiKoiiKcpHRGyxFURRFUZSLjN5gKYqiKIqiXGTcSz0A5dnATTfdtLq6+qEPfegXf/EXf/jNLglHjhz54he/+Pjjj99222133HFHs9m8gC3PfyeKoijKsxu9wVKeNu985zu/8IUv3HXXXW9729tkzebm5ubmZhAE5/7gaZuduZ+LMpgL4Etf+tLP/MzPDIdD+eMNN9zwla98ZW5u7mltef47URRFUZ716CNC5Wlz6NCh++6778iRI8WaD3/4w//yL//ykpe85NwfPG2zM/dzUQbzdEnT9DWvec1wOPz1X//1T3/60y9+8YsfeeSRs96unWPL89+JoiiKciWgCtaVwgc+8IGvf/3rt99++2/91m/Jmre+9a2bm5t33XXXK1/5yoceeuhDH/rQgw8+2Gw2X/CCF/zmb/5mtVqVzV7/+tcD7373u7/xjW985jOf+bmf+7lDhw4B3/rWt/72b//2DW94A/DJT36y3+8fPHhw7969wL333vt3f/d3hw4d2r1796tf/epXvepVsqvJzf7hH/5hcj/Hjx9/8MEHf/zHf7y4KXn3u9/9xBNP3Hnnned4nnjaTmQwT5f/+q//Wl1drdfr99xzj+M41Wr1pS996Wc+85k4jl3XPc8t77333vPciaIoinJFkClXBh/+8IeBhYWFNE2zLDt27Jh8Ab797W9/9KMfLZVKk9+Kq6++enV1VT4oa97ylrcAs7OzL3zhC4vNnve858k2rVYL+PjHP55l2V/+5V/a9inK6Hve854zNzttP3/yJ38i+4/jOMuyTqfjeR7w9a9//RwnddbBPF0+8IEPAC984Qvlj51OR3Z46NCh89/y/HeiKIqiXAnoI8IrhTvvvNP3/dXV1W984xvA5z73OeDGG288cODAb/zGbwRB8LrXve7YsWP33Xff1Vdf/cQTT7zzne+c/Phf//Vf33nnnb//+7//pS99SSSlu+++++tf//ppR9nc3HzHO96Rpul73vOe5eXl//W//hfwh3/4hxsbG6dtedp+Xvva19q2vbm5+dWvfhX4j//4jyiKrrnmmttuu+0cJ3WOwSRJ8sWzcfLkydN2sr29DdTrdfljo9FwHAdot9vnv+X570RRFEW5EtCHF1cKU1NTP/uzP/uJT3ziU5/61O233y43WHfdddd99923vr5erVb//M//vNFo7N279w/+4A9e//rXf+pTn5r8+Fvf+tY/+qM/ktciUDmO4/v+aUe59957d3Z2Zmdn3/WudzmO89u//dvLy8u9Xm99ff00u7fv+5P72bNnzx133PGFL3zhk5/85E/+5E9+9rOfBV772tee+6RO28nkW8Ph8KUvfemZH/nIRz7yK7/yK6dtCYhgJliWBfT7/dM+e44tz38niqIoypWA3mBdQfzSL/3SJz7xiU9/+tPvec97Pv/5zwN33XXXF77wBeDAgQONRkM2u/nmm4HV1dVer1dIMq94xSvO5xCHDx8G9u/fL/qNZVl/+qd/ep7De/3rXy83WO973/vO8wbrHJTL5X/8x388c/3kU0VBHlwWd0JBEMRxDNRqtfPf8vx3oiiKolwJ6CPCK4if//mfr9fr999//yc+8Ynt7e0XvOAF119/vQhLm5ubxWbyulKpFD534Eyx6qxMT09zoc/F7rzzznK5/PDDD3/84x8/duzYLbfc8pznPOcC9vN0WVxcBIpHhysrK/LiqquuOv8tz38niqIoypWA3mBdQVQqlV/4hV/Isux3fud3gLvuugu49dZbLctaXV396Ec/CqRpes8998j607zqpyEKzWk897nPBQ4fPnzvvfcCR48ebTabruvef//9P3A/zWbzla98JfD2t7+dU+Wrf/u3f/vXf/3Xxx9//PwHMxqNXns2/vM///O0LV/+8pcDjz766Pe//33gYx/7GHDz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0kTUwSInr59++snv97vd7pUrV15wwQUt3RxCSNrcddddmzZtWr16tdFoZEtMJpMkSaFQKNHXCQQCAPR6PXvbYE8lFov169cvEAhMnjx5ypQp7KFeWlrI9vvee+/ZbLbU5UVFRUfd6ZE6VanGjRv36KOP/vzzzxs2bGjbti1LeD/qSVCr1Y1vVqvVhsPhph4kAGDkyJFTpkxZsGDB6tWrzzzzTEpvTxfqYJGTVE1NzeTJk//973+vXbv2hhtu2LBhQ+InhhDSqr3yyivvvvvuokWLUiM9Xbt2BfDzzz9ffvnlbMnixYtzc3MzMzMb2dTKlSs3bNiwfPnyvn37siWVlZVpaWRxcTGAaDTaq1cvtmThwoXLli3r1avX0qVLj3+nnTp16tOnz8yZM9esWXPDDTewPtmxnYRDmu31ejdu3Mjy6wEMHTr08ssvv++++470laysrKFDh37++ecrVqy47bbbmnsg5EgoB4ucpG655ZYuXbpMnTr1pZde8nq9iZQCQkir9tNPP917771333233W7fpvD5fD179hw0aNDdd9+9evXqQCDw8ccfv/XWW/fee2/jW2P/7lq5cmUsFnO5XFOnTt2/f39FRYUoisfZzqKiolGjRt1zzz0rVqwIBAILFy4cPXp0RUVFGnc6bty4jz/+eM2aNTfeeCNb0qyTwPN8ZWVlbW1tIkMLwNChQ0tKSv7yl79s3769trb2qaeeWrx4Mcsza+S7o0eP/vLLLysqKiZOnNisQyCNoA4WORm98847P/zww3vvvadSqTIzM6dPn/7SSy8tXbq0pdtFCDleixYtEkXxmWeeKU7BJrT56KOPWAUmo9E4adKk2267bdq0aY1v7dxzz50yZco999xjMplycnLUavULL7zwxRdf3H///cff1DfffLN79+79+vUzGo3Dhg279NJLX3zxxTTudMyYMT6fb/DgwUVFRYmFTT8JI0eO3Lx5c05OjtvtTixUqVSzZs0SRbFr1645OTlPPvnkK6+80qdPn8a/e8011/A8P2jQoHbt2jXrEEgjuNSeLyGEENKyqqury8vLu3btmkjPOqqKioqqqqri4mKDwQDA4/EYjUae59PSHofDsXv37sLCwtQqoyd6p008CeFwOBAINPgAcf/+/bW1tWeeeeaRtpD6XZfLlZ+f/+abb06aNCkt7SegDhYhhBBymvvPf/7zxBNPHDhwoOmdWnJUlOROCCGEnKbKysouvvji3bt3v/baa9S7Si+KYBFCCCGnKb/f/+6773bv3n3w4MGsIBlJF+pgEUIIIYSkGY0iJIQQQghJM+pgEUIIIYSkGXWwCCGEEELSjDpYhBBCCCFpRh0sQgghhJA0ow4WIYQQQkiaUQeLEEIIISTNqINFCCGEEJJm1MEihBBCCEkz6mARQgghhKQZdbAIIYQQQtKMOliEEEIIIWlGHSxCCCGEkDSjDhYhhBBCSJpRB4sQQgghJM2og0UIIYQQkmbUwSKEEEIISTPqYBFCCCGEpBl1sAghhBBC0ow6WIQQQgghaUYdLEIIIYSQNKMOFiGEEEJImlEHixBCCCEkzaiDRQghhBCSZtTBIoQQQghJM+pgkZYky/Jbb71144033nXXXX/YTrt3726327/66qsTtP0pU6aMHTt2+fLlJ2j7hBBCTn7UwTp9PfTQQ3379n3xxRdbsA0zZsy49dZb33///RkzZpy4vRxypA6Hw+FwhMPhE7S72bNnf/bZZ3v37j1B2yeEEHLyow7W6WvHjh0rV64sKytrwTasW7cOQP/+/U9od+SQI3377be/+OKL/v37n7g9EkIIOc1RB+sUF41G33rrreuvv37IkCE33njjwoUL2fJPPvlkx44dANauXfu///0PwMSJEydOnLhjx46PP/54woQJiS189dVXN95447Bhw6ZNm7Zt27bE8kAg8OKLL44aNWrw4MHjx4+fOXMmWx4Oh9mmtm/f/uCDD1566aXTpk2rra3du3fvnXfeefHFF0+dOrWqqoq1YeXKlQDcbvf06dN9Ph/74oEDB9im3nvvvYkTJ7722mvsLft027ZtL7300lVXXXX99dfPnz8/9WCXL19+++23X3zxxX/605/mzp17pCOdN2/e7Nmzq6ur2Qpbt26dNm3aZZddNnr06H//+9+BQCCxwaPu8ZBD3rdv3yEfPfnkkxMnTpwzZ05TLxghhJBTg0xOadddd90hV/zZZ5+VZblPnz6JJWeffd12ZWkAACAASURBVLYsy+z17bffDsBms7GvT5s2jS1XqVQAjEbjwoULZVkWRXHo0KGHbPm5556TZdnr9bK3bdu2TXzUrVu3/Pz8xNtzzz33kDYAqK2tZS+2bt3K9n7rrbcCGDNmDHvLPj3nnHNSv/X999+zT998803WyIR//OMfDR6p1WoF8NVXX8my/Pnnn2u12tRvdezYsbq6uil7TEgc8rp162RZzs3NBTBjxgxZlgcOHAjg8ccfPzGXlxBCyEmKIlinsv3797PA0g8//OB2u5988kkATz31FICff/555MiRAO68885Vq1YlvvLuu++OGjXqkUceAbBhw4YXXniB47i5c+c6nc477rjD7/dPnTpVkqS1a9cuWrSI5/nvv/++qqqKdcs++eST1L0XFhYuWbKEbWrLli0dO3ZcsmTJgw8+CGDt2rX79u37+eef77zzTgAjR44MBoNNPKhAIPDll1/Onz+f9djYTh0OxwMPPCBJ0j/+8Y/KysrnnnsOwBNPPFFXV3ekIwXg8XjuuOOOcDg8YcKE/fv3r1y5smPHjrt3737ooYeOukdCCCGkEUJLN4CcQKIoshevvfaa0+m8+eabr732WgCSJGk0Ghbv4Xleo9EkvnL33Xc//fTT7PWCBQtkWS4pKcnPz9+5c+cVV1zx+uuvb9myZdOmTR06dFi+fLler+/SpcvmzZudTieAurq61L3//e9/HzBgwNlnn/3EE08k3nbv3p318JxOZ/v27XmeB6BSqXQ6nc/na8pBPfjgg+worrnmmunTp5eXlwNYvny52+222WyPPvooz/P33ntvZWWlz+erra212+0NHimAlStX1tbWGgyG6dOnm83mtm3b/utf/5o4ceLXX3991D0SQgghjaAO1qmsqKhozJgxn3322ezZs2fPns3z/IABA5599tlDHqWlGjZsWOJ1aWkpgI0bN55//vmp6+zatatHjx5z58599dVX169fL0kSx3GHb4o9ImRdqMPfHrNOnTqxF1lZWQBkWQawZ88eAIkeG8dxzz777FE3xQ6wqKjIbDazJSUlJQCqq6t9Pp/JZGpkj4QQQkgjqIN1ivv0008fffTRmTNnzpkzZ926dT/99FO/fv1qampYHtLhUmM8FosFwNChQ++///7UdUpKSr799tubbrpJo9E89NBDl1xyyW+//ZbI1jp+icBbar554zIzMwG4XK5m7chutwNwOByJJey1Xq83GAzN2hQhhBCSinKwTmWff/75xRdf/PTTTz/66KNr165dv369SqWKRCK//fZbYp1YLHakr5911lkAysvLL7nkkssuu6x///67d+/etWuXVqv99ddfAZSUlDz++OMDBgz44Ycfjr+1JpOJRcJ+/PFHAFVVVfPmzWvid1lT9+zZw8p77tu3z2KxCILAykAwhx9pz549OY6rrq7+/PPPAUiS9Oqrr7LljQT5DmcwGFhw65dffolGo4nle/fuZUGydu3aNX1rhBBCTgHUwTqVderUafHixR999FGfPn0mTJhwww03SJJkNBp79OgBJUA1Z86cF154ocGvT5gwoUOHDtu3b7/gggtuueWW3r1733HHHR988IHNZisqKgLw22+/DRw48Pzzz//2228BSJJ0PK3V6XRsvN7UqVOLi4vbtWvn8Xia+N2ePXteeeWVAIYNG3bZZZedc845Xq+3b9++PXv2bORIzzjjjL/85S/sSC+55JIePXrMmjULyjiAplOpVA888ABruclkYsMhb7zxxqKiovLy8m7duo0YMaJZGySEENLaUQfrVHbeeed9/vnnxcXFa9as+eSTT9avX19SUjJ79mz2aGzy5Ml5eXnl5eUffPBBg1/XarULFy4cMmTIb7/99vbbb5eWlk6cOPH777/nOG7SpEnXXHMNgF9++cVoNLKiUxUVFRs2bDieBr/99ttnnHEGgNLS0nHjxk2aNKnp3/3oo49uvPHGWCz23Xffud3u0aNHz5o1i4XEGjnSV1999eGHHzaZTAsXLtyyZUtxcfE333zDais0y9/+9rfFixffdNNNLJYGICsra/jw4S+//PLy5cvZE0xCCCGnD44ydk8HifF0iWzuBI/Ho9fr1Wp1I18PhUI1NTX5+fmHrOZ0OlUqVUZGRnpbe+DAgaysrEPKUzWRJEkVFRW5ubmHDBjE0Y60qqrKZDIlEtuPR15eXnV19YwZM8aOHXv8WyOEENIaUZL7aaGRrgN7fNY4nU7Xvn37w5ezxKO0Sy1J2lwqlepICU+NH2leXt4x75QQQgg5BD0iJIQQQghJM4pgEZJmw4cPr6+vT50piBBCyOmGcrAIIYQQQtKMHhESQgghhKQZPSI8ohdffHH9+vWs4BMhp7mysrKePXvec889Ld0QkkS/UYQknIS/URTBOqL169eXlZW1dCviZFluetXNU4zb7W7pJrQMj8dz8jzBLysrW79+fUu3ghxk9erVbKoA0rJO29+ok0ppaenq1atbuhUHoQjWERUVFRUVFT322GPHs5Evv/yyU6dOrJ44E4vFvvnmmw4dOiQqUjaFJEmVlZWN503Pnz+/Y8eOxcXFiSUul+v9998/Uo9+0aJFPXr0yM7ObnozysrKampqevfuffhHHo/n119/vfzyyw//KBqNzpkz57rrrjv8oyVLlnTt2jU3N7eRne7bty9RJGLFihV5eXnH8E92SZJmzpw5aNCgnJyc5n73cIsWLWrXrl2XLl0OWe71eufNm3fRRRcddW4cURQ///zzsWPHNjhPNlNeXt6mTZtDJu0pLy9fs2bN1VdffcgX6+rqlixZMmrUKPZ2xYoVOTk5HTt2BPD1118PGjSoKSW+Pv3000TtLkmSvvjiizFjxrC3x/kfAjkR2rdv3759e7o0LS71N4q0lHA43NJNOBR1sBrzxprVs994/Xi2UPfTT64lP0d8vqyunQMOp9ZorN+121JUaL/mGkMzewmSJDU+QV7V7Nl1i5fYenSTC3LUFnO0rNyzbrPGbn9fd2jJTQAxn6/08Sc7336/1mZvehtcmzZ4N6zIu3VyAxv0enc+/kT7v07Rdzy4byHLFS+8Ha52PlFXc/i3yl94yT7kcnOnQ3sqqVIPfMtTj+RNmmg+88ymtzlcXe1cviLw++/qDHPubRPVWWkoi+pe9lv1R18ZCgstvXur1GpZFN0b1quDwbqt2zN7FNsObNXmHaXbKoti+VOv3/fWGzmjR+OwPlbM5wvX1mpyctRG4yEfRWrrKt5+J/znSVkD+6qyszQ5tnBVrbSvsnbp6rxLhz1eWw0g4nSWPfNchxtuMxS0i3o9255/omTK/wmGo3SwPHt3ln/36XP7naw9db8u8u7Y8lS9QycIK25u4IoTQgAY/r5AlmWO2xR4uoF/XpLTGXWwGhMWYzXbtkUOVEGWwPOG7t34wyqhN059Qb/sfn3DZWVSKMzv3Sec0Sl/1CghKysKuMOhJrVh337BbOKbMNeKfvhlBUMGe5f8Im7fI1stYX8w+957hKzMBndU/+FHlrPPDRlNoVCTmsFI+QWOz7brgwEc3tXTqPU9eux77q2su/+sKVIibZJU/8J7vKSyTb2zgWaIoqusLMOW425aGwK7touxmNS+XSOnTgoGnXPnCTwvVlbKoXDQ4VAb9LrCtprL+psuOj8AINKM4z2iXt3tXQpd78/0b9ng2bLT0vWMSNAvDO5bcPtYTqsJAaEm7MV895/r/vWq5/kXsu+8/ZCPal55VXJ5ouEQr9HoL+hrHTBAZTTEP7OYsu6dGtq1K7Rte3jBYn1WZtBZr+/XN/fO29Xt2rnDISkYrH7mucwLB0dt2e5QqG7OFxnF5wY4AcGjNGnXrHfNvfu5w2EA3k3rnQu/zZl2jzscioj0K0HIEQWjYks3gZyk6KezMf6ffw2uXKXLtXNareTzHZg7T9DqLNdeYzir++FRhyPiOG2HDgD0xV2btXfvr8ukjZt8+/bJsmwoaKO9qL+x59mNf0Wl1VqHXcxeNxKvEL1ez+YtRdMeblZ7APBGkyxJUjCoOiyyAiDz+lHgVfUvfWC4aoimqCC670DwmyViNJb/8INcQxPURGpqeEFQ6XRN3Htg5S+6ku4N9O0AANHaOud770ed9epMC9e1k/qCnup2+RltclVGfdMPsOl4i8k29QYArONjOGwFORoLrt8SmLcIkWjQUS/odGqzUdu/l3n4QHbzcFpN1gO3VD/4TKy+XkjpQMeczkhNbftpD/N6o3fDb95fFlUu/jlj4EXaXuerc+wAwHG6zp11nTvjqisBmA/eqed/H6vUWnOf/gAgy57NvxeOu+Ooh+Na+7NK4DP7DwEg+ryOeTN1JSWC7YRU6ifkVNJOUzM6c9Hn9UNbuiHkpEMdrMZo+/bMmnh14m0GEFy/1f/lN+6vZmffcZtgs524XfvXb/DMX5Ax5LLCcTfLYqz+lx89X34V2bEz8/pRzejbHYHv12XWM7oIlmN9WCYc8bbJvHak22SSVm32fP+rSqezXH+d/rBEpYRw6R6hoY5ag/zbNwerK3P/0tD0z7Jc8/obYnW1YXBf+6UXcbpjmcQwnWTZ/enXviWrrF0LDRefYzyns5CbJQVCgd92hH9aX7tklWHUpcbeZwPgrWbLgN7eb7/PHDcm8W3fN99nnn8BrzcCMJ99nvns86Iup+fHb6uefc7SrZuq65nmvg3kwAEQ/f66V6cb89tm3/kXdpMEdm3TWay6vKNkh9Qt/8GzcXn+LVM5QZBCwZoP38oYPNB4SbynXvv1/KU9z0vLiSHk1NNOXX1fzozlvmbk1JLTBHWwGsObDw1M6HsW63uc6XjxPf9331vHjztxu46s/s14Xp+MvhcB4HjeNnS49fx+FdOfF/eXZ956M398cxKLu3drOjQvnMbE3C6O41SNzgxtHXYJhl3SlK1FnU7B3lh6e5IkOeZ9qe91TgORMFn2zZ4bq6mxP3y7kH0SRFxk2fHMf0WHs+DpyZp2yYR63mwwD+ppHnh21XOfhb/7mXWwAAjdzgh9PC/5bUnybdqUf8NtqZtUZ2TZrh2fOXxk7byZvjlzYytXoajQPPAiIWWa7eC27d6Zs2RwGVePSQT5wpUVautR/hng3rzKsXJR1iVXCNYMKRKpmP48Z9AZLx4KIFpbG5j3dbCyMu3zeRNCyCmPOljNp1Jl3jq+5qFndXv2sGd/J0Q4bCjslLpAsGQU/vUx9+Lva5553jBkkHXggGPetuT36zt0Ovp6h6lf+pP1nJ5HekjXXHx9vdCpc1PWrJv/ldpqybjyisM/qn7hJbVOnfP/7lPpm/qo8YTyfDALgUD+s7fxhobaw3G5915/4K5Xg+u36nsWA9B0bBf1+ROf+1et0WfZdG0aGC6q0utzR/8JsuzduC7w24raZ1+UJNHUpk3Y6xEDQTEazR0zyXDGQf1mtc0u7TniMH4xHKz48i1EQ21vv09jzxYD/rqP3zF27WK+fhQ4LrBxs+vTT/U9its/82D37t2/+OKLYz4nhBByGqIO1rFQGfXazoX+9RtOXAdLlOXQ5vXGrt0P3rHKOuSyaDji/eY7IRIxDB3CHVNfJxYKS+FIs7/lcXnXrLBe1UAv59gEy/Zmde911NVC+/d6f/8td9rdhz8bDaxcFXM6bf/v/pOkdwVZ9iz7rf1r9zbcuwIAcDwvdC0IrtvMOlicXhdLGV0cXLtO1jf62JTjzD3ONfc4F7IcrjoghYMaZ52hc7Fgthy+Lm+xuvbsMmxeYzn4PEuRcO3SbwM710NnyL/hdt5sjnk9FdOfF7Iysq4fBY5zzf/G9+tS81VDzJcN4Hi+uaeBEEIIdbCOEZdr50LHmwvVCNutN1c9+bQ469Oca8ce8pF9+IiM/oNqP3nHt3yl+ZoRhh4lzd244dyewa0bDU2LHjFSJFI34/2sy4cbB1zU3N01KFpVJYuisUvxUVZzOg78703bhHHqw+pXhUpL3fMX2P9+q8p0eIp5OknBkBQIivVulcmIWEzdJvdIMTzR4xX0OiGrgb5OKiE7U/TGRx5JHp/GlOxRcX5f1hUNFAxrAMdp89sA0BcdMRipb9+hYPJU99czXWt/NnXrFa6t1GTlBEs3hZw1Wps9a9R4Q4fOALzrVrl/+t4y4CLTJUMAuGd9Fdq0KeuOibpuZzSpJYScxpb5S9psnNvSrSAnI+pgNSayeWewfYG2S1FykLxCdvukcENVtkXRu2o19pd71m/g1epoIGAqKIhGIqbhl+q7FTc9GMBpNLbbbq175TXXt3OsQy8/JPdIMFvyb723/tefnB/PCK5YmfnnP6m0zcjsFgrb173/ob5biaFjk/pYUZfzwDuvqkxG46Bjfy55CP/CH7V5BY0n7MuS5Jz1iaawvb7ksARSSXK8+4G+b091m6ZlcR1G8gciZRWxGocUColODyeoZLeXFwTR4VLrdKGqWp7ng3UOKSaCg9ZqESNRjdEYcrlkSeZ1GsvYKw3n9zikpyXHRCkSFd1+3tpYFEqqqJM08TsqWlmduLhSIBiorsnLb6ycbHPpCtppb55aO2+mFHJ6tq/P6NlL6HRG2/F/5s1WAJBl7+pltd/MMQ8eZLpkiCxJjtffiNTUZP/zbt4aH54oRSKRSLPjnYQQcpqjDlZjOD0fmveD1x+yP3rXIWESwRdQn3v+IeuHduwILPgu4vFa+g3InXi+JtMGWY563P6tG2M/Lyv/8GPrlVdYBvRv4t41ebl5Dz9Y99rroQ/eyLvhtsPH7mX2H2wuOde7+Nvap5/Rnn9uRkNV1BtkKCnJuX2K438fhc7rkzX4ssZWleWar2eFtm00X9TfNHTw8Q9gZHwrVvo2bymc9kjjqzlmzeAtxqybbjj8I/cPCw1t86wTRjR315Gy8uDq3yNrNkXcHn1Otkqn4zMzOVGGxQyVTmXLgTGTz8szdItp2rSxCIJgy+IOPvNyJBLYsiW6eEXlR3Oy7pio65oMIAm2zIwBvd2f/5R1y5VHaoAciwW2lNkfvSveni2lxh492OvApk0ZnTpzRx6keWw4ns+5ZgwA6/BrUpcH9+52zP1C0Gvz/v5Xtd0u+nyejz7h9eqcx+9VmY0AIIqer38M/7Jmga0ZlV0JIYSAOliN03UtzBo9uOr+N3y/rrZcNjD5gSx7d+7JueSgrol//QbHR59kXTQkd/ClqR0R3mzRFbQDYNy7u+KDN43n9mz6GECVQZ897Z6aZ553zJ5hu3bC4U+mBKs18+oxqtXLHd/O0eTlG849p6mH1qlj5p//VD39zVjpDr5D54y+F/HGg1oVdTldv/4U3bMr7PXYb/mLrmPass2iNTWer+ebz+uj0jVWocq/daN784a2/3rs8F6dFAp5f1psu+vPzduxJAWWrHJ9sUCTnW0dN07XoejY+oucRmPs2RM9e2LuPOcrH5ovu8h8VbIEjnrA+VWPvawuzDUPO7T/zdS+8pVKpxXs8cJX4TUbDYMGs9eR3zdyLLB0gsXcLsf8WYE9uwxn98i87lpOrRZ9vur/PCdkWez338FuMzkcqXv8NTEQKHz0hmuuuYYmIiSEkGahDtbRaXt0jAUOqoId2rJLn23XtEs+ygnt3u2ZNTt/4s2GI8/6oivsmHnW2f6Vqy1DBzd97xzP59x3b81zL1TPeDd3ws0NrmM9v5++sEP1B2+GyysyRxwxdnIIbccO7f/zVHDbds+cub7Vy2QZGR06BurrdRaLZ1+ZSq1W2+3m60Zmd2lGqtZRBTZvcc34zHbp1aaejaW3R6oOOL/+MvfO21SGBjphntlzrX3P1RY3YyCk5A86nnpDpeJz771b3ejUh02XMeIqY5/eta9Nh8trnjCC9UvUBXl5j9/refXDyPbyrMlXctqUZ7uS5Hz/u+iuyoy74tW8wlt3cRxvvqAvexutPJDzp6uOp0liIMBxnCTGeJ3+0MBbLBbYtT1a7wysXRH1efVndMr7632slGhoxw7vl1+ZB/c1jhjCOp2xWof3zU9NJUXWmy7TqVu6rhghJzEqNEqOhDpYRyfWuWKxg0JHoR+Xw56cbC7mctW9/V5GvwGN9K4YyWiKbtuG5nSwAHBqIXvqHZX/ejJYVnqkjGZNTp512BV1c77IvOqKZlWZ1xd31Rd3hSSFdpXKoqjev18oKrTrhmnbtU3XA8GESHlF/ccz9J2LG+9dAXDM+UxzVjdtQ9M1SqGQe9XqvP+7q+n7lcMR1wvv8kaj/bYpR8pPl2Ox8N69kf3lsbK9alkOVFTyanXY7dYYjRGfz9gmPxIM6XqezZlMpj7nJ3Lp1Lm5eX//W81zL4R2vWL722TWHVTnZWf+fUrVw8/6pzyn79xO6N5ejsRUgYj3l9+hUmX/857442ZZrn/nCyEvn53ncNk+MRzR2Js9F3XUVe9bt9q3doUUi8VCIUGrFSMRWZYBCFqtJIpasznkcskAx3Hm4q6a88+z97+AU5L2QrtKa956xzSwt/Hq5P8h6v7zX3Wu1Xozza1GyFFQoVFyJNTBOgo5Ggtu2Wt7MFn4MVbvCe3Yk/u3BxJL/F8vMLQryhw07Khb44NB1TlNfYqXSmUw2CZNrJ89U3frvZymgcmbAVjO7hVY/nOodI/ujI7N34FK16UzmjifjyQFNm0O/LqUCwT8VdV6u01dXGzs3Uudn9/Il7zLlnu+XpB99Rhjt6MMe/Tv2h6qqym4p+EJXnzLVmT26alu3+bo7QQAyNFo7T9f0djsWTff1MDTxnDYs3iJtGNnoKJS0OlMHTuD16s7npHR7TyNzS4DKo1GikTlcDBYsQ8+n3/5It+33wl5uRnXjlTn5QJQGfS5D/3N+d4H9U+9Yb7pOk2HdgBUJkObl/5PrHe7v/qBPxCIVlTxndpbJ4/Vndkx0cPzLVist9kzb76JvfV8952uqHkXLup0eJd879q0IbNvH/OIK3Vd/j975x0fRbX28TN9Zmd7yaYXAiSQhN5FOoiCgCBNEBQVERWxYe/ee70WFLCCoAhKEaUoXUCQ3jsBQhLSs72Xqe8fyU02m91kg+jrR+f7B5AzZ86c2V1mf3nOc35Pm9DVZ5HjRIYVfF4AwRCOIXJ549u3r/sxeO6c/skZZEg40Hf0DEZg8S9HMs2XkJCQkIgNSWA1hSiK1W+vECEIjau3w3atWA9IElHW7rEKFhW5zp1Pf/a1WIZzXjqn7dEpwhFB8B4/AaEY73RQOTlYnKFxH6p9O/va76t/+DZ+8v3RrgDJaN+ZMzcisGJDCAZ9h444tm2HMJTu34PIbatKMrIVJueKDczly3Hznol2Ims2Ozb+pB4wrFl1BQBw795K9+4VLdfb99tv9NjmtWwtouhashaCUe0D94fLC1F0bNnq3X8QV6qoDl31E+5HZE1t/SNTMwAAmqEjWJvV8vO66g8XyLKzNFPvgTAMQhDdgzNcO3eZ/v2ZZuJIenDvmmshGpV2RmTPBc/eI86fdsc/NbdWbwlCsPi6cWKsWWW83+favdV67LCyU8ekt16PuIcUQlEIRSOusQIABJ/PtXqNt6BQ//SMGlFYh3/bPqJPewiTHg4SEhISN470DG0K/8HzVFyc5l9P17UwxWVsUZnx2doWkePc636MGzMJJpo3uvRdu0xptVRWg2VE3uOxL/+GraqGCZzOSGXMFu+eXwEEy/r0Vg0bEqYJ4h59xLzwE87pQFWRS5cQlAy0vhGL9mYRfD7vwUOOHb8octvqn38YDwkgEW3SDa88Znnpg8C1a2RmhKuzFotj8ZdxI8bKO0fO+25woYA/YLUkzJ4Z8ShTVQUAoHvHGgW0fbICmB1xcx8PWxkMFFzzb98hMpxh/L10m5ZVDcK0uoRpD3Mup3ntcuv8BfSdI6j27QAAyqGDyZz23g0bzbsPySfeQXWMYvHFcd6fdnv2HNZOHF8TAwMA+M5fkBvjm11iBgAAQbD9usN5cK+6V4+kl18IrRIdE6Lou5QvFBbafzug7Nst4bGXITTcOgRvlwkaNUpISEhItAhJYDWFwIryR6fWJdyIDOv47Duyc/02QMePG4MOV0Jux1hGc+7aCqc1KLvrv3LF8e0qxKDVvTwbNegAADIAgCj6jp11f7+Vzc9X3zsF1dbX10MNBiwpyb7jZ8P4qREv4Sq+pooUIfud+K9csSz9ikyKj3ttDpYQIboGYSia19azbQf56CONj9q/XSUgeCzqCgDgOnUUUyphKnLcxb33NyTBEGOtHu9Pu4OXi4xPzQ1bVGXNZsuSpbLW2cap90YeShAC5SWc0+kvv45rdEIwSGfn4jp9aGdUqUp4cI7n4tmqL5fpR46gB/YHEIQnJuCPPGzf9JN98RqvVkUO6kV1ya0zlGIrTMyFK+6f90A4bpz3bF0QFADg2bqNaN2+2Ttynzvl2PEzhKH6mQ800LKCELhWxFrMgTNnZRq1p6CQMhp8lVWKtFRvVbUsNSVoMhNara+0lPP6uEBAPbSv8Y0nQuOyofAY5tvwm2hx4tmpsIwMBNiiTkXNzk1C4p+JZDQqEQ1JYDUF1adzvTWoIDgWLkdktGbM6JoG3uUKnD+f+OBjsQzFmKv9purkObPrWvxXr1q+/Epz/92yng31GQTJenSUdcuzfbzC8dVy7exZoWpDPeFu84cLhGCw8aoQYzVDAMhyckAkOKfTvWcv6vW68y9TcQbG5ZZ17QLkcrp71yZMSjmr3f7dd4LTqXv0XjK3qfgKPaCXd/Haxu2sycRbrEmPP9fEuQ2wmqnevaIerSinx8ZUSdrx+Xfc9Yr4555FlA181QNXCxzfrTZECac5Tx0NnDoeqK4AEKJKThODDOJj/JWlgZNHfQ67vnM3kJCk6t6nrr+8fYf0p1+x//it+fRp7YMzEKUSQJBm9Cj1yBHO7Tvh/LKqNVsgCEAIInB8TY65ZtpUqnXr0Nikc/evsAjphzSVUR4ou+7avY112Ki+fVRDBtW1+y9c9P66l62uFkVR2TkH6BVC62FBiQAAIABJREFUdhrVOhE16mibA9A0XlEl6rRQGQ3SEon2qZpOOYha0cSFAADqMUPx1ASuqMy39TgMI1SS0WKxNH2KhISEhEQYksCKCcEfdH62krM4QtOMHN+uIhJTYtz2Zd+6gW7fri6UwlmtliXLNA9NlHWNsvcEhrWPT7O9/6X96290jzxc14xqNQDDzD//aBw3OewM25b1Ao5H3PrnPXvOvmoNqlGit/dXD+gCExhyvVx0ejw7dzg3b6aystTjxyF0eAYSW11dNX+BLK+t5ol7my1HgycZTdUmLcuGmc671m8kM1ojVKzVbOxnT+l7zIh4SGQYT2m5qk160yOIQca99Hv/5aK4xx4JU1dCIGBZ+hXdLq+xuuJ9Xsvq5UGLWdG+a/ztU1G6/sSaRTjO63JdOmXetoktuKwde0+dKkWVKv29D1d+/Vn1ux/oH52FJyQAACAEUd8xHAAgnzJZCAY5mw3VaiMKWbaqyrV1m3boiGhhOcHvc+7bZT/8G90hzzBzRm1qlCi6Dx5yb98pCgLZPU83825UpwE1EdCGUJ2bD4w1RtYlF3Sp/WRSKNa9e/fNmzffwDgSEhIS/1gkgdU8gfxC91ffwwpV3Lxn6jKv3QcPBcvKU556JZYROIctWFVhfKF246HIcaaFH2vuHh5VXdUAQZo506ufe9d9+IiiV8+6ZtWYO90bfhI5LjQNnHXYmMryuKfnNh7GvXmr6+BB3RPTibb1ZqF4q1QAgHzMUM5kdS7/ofqdd4mMDMXwYXhiIgAACILn8BH7xk3qyaPofjEt7QEYprQa3uWusVaqRRS5qmrjfbOjn9aAQFkJAIDMjJykHywpVbfJgMmmbJkCl4scn31LtcpIfPWlMKkHRNGzZp22e2/VsHCvKZEJWr5bJgpQq4dejlbOCKWV2m79NZ1use7dWDL/7cSHHq/T1hCCJD7wmOfcqer5C9SjRipu6ROqlmCCwKPsrwwUFTm/+dZ412Q6L/LCrjf/gn3Lj7BanfjKS4iqVvN5jx13b9lKGPWKccPovt1uupuGhISEhMTvRxJYTcFWmm1vf+IrqdBPmxpaU5l3u50bf9IOHw1HcUwIw7JxLd4qA5bVxhccm36CKUI25JZmT4QInOzV2bdrd6jAknXo4N6yzbZnu27oiLpG6/cribZtUHV48rv36DHn/gPGt59ENJEtwtE4ne7ZmbzN4Vj+o2nBx9rp02Tts+1btwVOnDC88AgesxsCAIALBtmq6lCB5c+/wrMspo2c69MY19EDZHJStKPeo8cFJGr2FW9zOBavDhSX6abcI+vYoXEHyzcrg1evpT3zauNDpg1rRR6kTHq0WbECoah+8DhAyioWL0h7/i0oREjJ8zpjBqNp1TL/0WP6WTPhRhHBMHzHT1hWrVF2vyWiuhJ53rT6K++1q/oH7qeyayvVcA6Hc9WaQFmZfMxQxeA+Ib1Fprhc8PmDhSVEqxSYJPHM1MZjSkhI3HQko1GJaEgCqynEonJi8GDtg7l12ggAAHjes2qNrt9gZbfoqUIhMOZq3/WipDdqfRwEnz9w5qx23kNh3bhqCyynYTo8uVt119Cq/ceEQAAm6zcqqu+Z5Fq5Cgy+vSZS4jx2iHHa4x97OOxc/5Ur9vUbDM/Piqau6kC0at2TM7yrfubNJgCy6S6d+YsXW6SuAAB0SiJENFCcweIiWWLMpYtFka8oUU69J9pxzOtGhkWo5MhZ7K6vfwiWVNAd8rT3TkcUEXKMgiUlbMG1+KkPRgxQEQJP9hgUeyhIf8vtvLncc/q4okuPBuPEJybPeaH6my9M735A39pX3q9vY9Mykef95y94tu2AeCH54blEQgRBGawsd/y0DtFrEl9/pW7pNlhS4li+AkmKi//gRQjHAABAFH0nzvu37mUtNlEUVa1TeYdLKC6xXS4mNWqQaFTfP67pgF9jBIYBQZZ3ucUgw1aZBbfP7/UfzWr+lwEJiX8mktGoRDQkgdUURNcuil4NvkFFnrcs+oSx2tInRa5a0xjT6q/lfXrV2RHZv/8eS4zDEhpkbgUuFZg/WAojCBGnUz0yBUusPwoROErLvCdOKW7pXT+x1FQ2GLTu2aEbPNx3Nd+ydYP27rGNv8sdq9dSvTtjKU35f9YhBILB6+UCX67o3w+Pj/ebrZbXF6oenhQ21Sbwmy2QyUSG+EQwJWWQEOPZwHXqGOP3hRYgCoU1WxxXCpIeayC/eJvDsXhNoLhU3qWL8emJ0TwLBJ/P/OkXutvH1BSFbIy98KoxI6atoHXg6Tm2XVvDBBYAAEKQ+PtnB6sqzKu/dmzfobylD9m5E6rViAzjLygEZWX2g4coQ5yiVz95XueIEVDe6ylfslDWoYNq6uQ6zec+cND+4wbd7Kl1OVX+s/n2JatxBU30yDKMmIhq65PG1AAEC8qtS342v/Kh8b3no96DKHr2HhVtzuCpC5AgBmx2nmEhCEIpEoIRXC6HCAxRqaG0NONNKi4kISEh8c9BElgtQAgEPKvXknJVwrTZMUY7PBfOojiqHlWb9CPyvP9ivuGVBhsP2Uqza8maxJenke3TzO+uDp66ECqwAAB0u9agkeujvP+t3r2/sVcvBh124+xZREZ6WAffufO4gtZMGR3LPEWGrX7uXWWnjvLRowAAAIKS337Dsekn+wdLVTMnhSZvNQGdnIg0XKPE01ORQLTuDeF5z4E96okTosxPtC9dphl/e12ETPD6HYtXM0WlVG5u4r3TEUXU+tkiw5gXfCxvk61sJIbqSLj3IfOqrwmdkYyLNWjHlV1RD7wt2lEiPjF57ouMxWxZ/51QUOgxVeNyOYwTZOvs1CdewDTaaCcCUXRsXKsZPEg+vN5MNVBY6NmxU/f4NKpDNgAAcJx73bbAiXPqu/upR0aOLRGtkxL/81DFnEXM9XI8LUKQzLXlV/74edbloTp3kvUfgCcn65QKmKYbf7ApFE1LS2vqtZCQkJCQaIQksGLFd+GCbcV3uFafOPOJaHnQYfA+b/W6lfr7ptf1dx84iNCyMP1kfX+JYmAnKq8VAADPy3BvPiof0aBYod9kgVhI3qNBsrly0EDlwAHuw0cIBG6srgAA9jVrlRNjqkso8rxjwdeYSqUYN7auEcJxzd3j/Pm5pncXa0YMlI8Z2uxQ3rJKKt0ausYZvFYEXB7toKhCpA7r9k1Bj9uQE2nLmyA41qxlPG79/7KOOIut+pUPZa0z4559GlU1tfopBALmDz7CdQbD+Hub6EampMtyOxev+FDfqRdqTFVmdYSxqNl1AVO59bfNntJrGeOjrmbWgOsNiQ89AQCIvb5g1dpvguUliQ/VW7pzNpv50y90T9xH5tRW3bb8+zPO5U56dxaiajLNC4bR9Hjnj9sNTzbYlSmynPurde6TF7T3TNJ17CDlyEtISEj8EUgCqylYi9X5yy5QVR0oKhZYzjj5flmrNjGeKwqCff0qRV6eLLdeNEBWKz00POSgnDSS2b4XTBZ5l9ez+YgsNHkZAAAAgRNYpKxtAEGKKJZRnmMnYASh+3RpfqKCYPvXZ4RGq50RnhYGAKCys5Jefcmzao31rU/Us6cg+qZ8w+mURFjboINyYP/gjl3NTiFQVuK7eDb+6ScbHxJZzrxgIa5RxP9nXo0UEPwB0+uLNCNGyPtFyMcKJVhSYl2yjE7P1I+/t1kZobtjtOqWfs4jB7zHd1Xv+gGnaEVKqwDDkMZUPuBFKDpoLicwxH71IqFUIfq4tGdeDd+l+PsRRcFUpZ4wLnQTomfLViqnTZ268v12DAFCwsI5ENH81XFOIPr3DG0R/AHTS/PpVhlJb74WmtUXdUaCwPt8PM+38E4kJP4pSEajEtGQBFZTiNdLoSAn0krDxPuI+MQW/K4vilXLPhV4Jm7mE6HNruMntY+Gm7DLuuW5Vv9cNvtD1uVVDeojH9pAN4gs58y/mnDXuBbN3Ld/P94xO5YJ2z9Zybo8+jlzoCg+TKharX74IcvSr6pf+0g/b2bE9aYavOVVVIottIVs3dq89CuNw46qoyqzYHlJ+dJPdFMmNfB3AAAAwFms1sVLAI4p5kyriwLaP1lJZaQ1ra5ElrV+/Y3/ytW4cffIc2JNrkJVGt2wkWDYSJFlAiXXWYcVFBcKvCdoKZMlp/EQD2fnGbv1pDJaxzhgS3GdPMoxQVlufbYs53C6zpxLnP9izY+Cz29buSH5vUdiUVec3W07ezVxxqS6FsEfsLy2gEpPV02LEM8LFhezJnPw3HmU5wPVJj4QYP1+IIqYTLYxlho+EhISEhIhSAKrKcjczroYlrfCYMwm58/rOK8r7tmnwtwjIRjCkhrlC0OQ8Z153v3Hydy2qCFcZLg2/aLMaotqIhcfjIrPp7i9f7O93Gu3QA5P/LxnoqmrWmBY/9ADvtNnLO98oRw1WB5lZDotGVI3WLCDMFQ7bIhn7w716IkRTwmUXjevXa4aNIDuHG5V4D9/wbJ8hXr87fTgPg2Uot2liKQP6m/q4EH/nn2Ewah/9BlMF6GwT7NAGE5ltqFAG2XX+gBhM/swbwaC3yfv2iDoyJSWavKyYbp2E6vv6BlCo8STYropx2ebNHcMhKnaMJUYZEwvz1d07KioSbP7H5zN7vhxvVhtYrxeRXorVKXBE1PoPlpUpUFpOYRhFIaOHTv27NmzN+MWJSQkJP4pSALrpsG7XZ7881xBvj3/om7c2Pg+vRoHkDi/H2qUrg4AgDBUPjDCYh9ndXh27NdOiqxOosFUVjJuN2rUN93NvXm3c9eBpNdeiWWpCAAg69QR0WqtXy5ji0o1s+5p7DzurzZhqkrQcDWTHtC//JXXOZzU394g3V5gGPvu7fZDe+MenFFTLLkOkePsK1b6rlw1vPAInt4gYMaWVwdtDjw+PuIMRZ53fLfGe/68fuRYRafY/FFvEkIwyFiqvfkXIAgOXssnFUpvdaUsLp5lgmROZ0WHzjDevF2CP/8C3KrBPkfvseMAB3WZVoELV9GMyPcehnPjfveFwsRZ02p+FBnW8tbHRHyiYkz9u8B7PJZPPmetVkVuJ/mYyWRqeky3KiEhISERA5LAukFYh813NZ9zOviKUpjn3OXlMIqgcrlsYP+kCXc1NvysQZWZGbxaTOZlxXIJweN1LViuvuN2umvnFs1N8HiVmelN9wleLfb9csj4xJy6wtW15wYCbFWV7+w5sk0bVKfD4hoES4jUFOOzT5sXLnJ8sEz52NS66EgNsEoh+MM3DUI4rpky2bt5i2lZGZ6dRyQm8x53sOiK+/wZZU77+CceIxruUOOdLtfKbzm/N+6tp1BteNiId3uVGekRlz6FQMD03nxSZ0h98iWEjrqpMAzO7QpWlDEWExAFzmFHZDTnduFx8ZzLhccnCH4fbjDyfh+u1XNeD0rLOa8bghHGbIIxzFdwmZLL3VcuQhAUcDqVKSksz+PtstB2WXBKMs0wMIax165xRZeKt6zX9LxFPXRk05FCKiWNa7gdkshsBXnqV12JthnMb0ebvSnPgXOerUcNLz1ao+ZFlrO8sZBKSVWGbNJ0bt3uP3xEntVeMX0WSjdTnVBCQiIaktGoRDQkgdUSBMFfdt138qjr/BkAQ6RWi7dtDVKTiOwsmUKBxTfvFcRptb7VPxPtWkNoM/sQA/mFlo+WKTp3VgxsfqUvDP/VAs7vb0JisBUm07tfxM18iAixTeddLvemzc6TJ1Vp6QIvcJUmy7UCTKlQ3jky1BgdUciNz89zr99QNe8dw4uzQ12yOEGALObGl6M75NF5ua5fdgfOnwpePMn5/WSXLtqp94QFrgAA/ouXTEu/0o0ZqrpjQEQVFcwv4Pz+xu0ix1X/931Zq9b60ZNiyTzz5p8PnD/tuHgORlE6Lk7AMEyrFVkWkIjI+TlrBedwQF4bY7bwcrnfbMbk8qDdTmq1fptNmZLss1hlrTMFIcintpGlJ1Jt26IadcTryvJyAQAyq8295vuSd1+PnzaTiO68GvR6eEsFGDSgvgmCfOfy6ckja36ie3dxrtvKlJjw1MgbE0VecKzcYdt6JP6NJ7BEIwBADDKWtz6BKZly0sSaoKPIcraly/wlpfGT7qcyMiOOIyEhESOS0ahENCSBFSuBkmL7z+tYr0feu5dm8gS6Q1606rxNoBkzyrxgkf3tT2STR5JZkSruiWLgwlXPD9tEt083aSLdJULsirPbRY7DDFETcfCEeMxpiXZU8Prdn3+nvm0YlVWfuew/f8G8fIW+961pc1+sc2nS8rzr7An7uvXs6TOKSRPqahVDCKK8exzr9TrmL1PPvQ9Lql20orrkwPmlka8KQcqhg8HQ6L/kCYJryzbfyROaaWNlt3aL1gumSDI9vXG79fMlsoSkWNQV53S49+105V8gO+bFz52DJzVvfBVaL7omV18e8mcsoDqt5pGZ4uq15jXLjdNnRasdpOk/tGrpIpFh6jxjFb16en/ZzVaaaoQsLJdp77vb9O+VhucmExnh/rG+swW2TzdSqcnxb86t6c873ZY3P6azs5V3j635uHIOp+nDBfLUDMMTLyKyWCtwS0hISEi0FElgNQ9jMZnXLA867NpxY/Xduvwe3yCYIIzznvGdOWtbsBzGUDwhDm2Tznk8iFbNFZahgaD72nU6MYHIyVP0uzVsAQ4AIHg83mPH7Zu3IhguCLx6+G0R41six3mLyyJ/efK86fUFdHa2atjQujb7hk2+o8eSHniUTGpYwA5BlJ17KPK6OLdtLH/1jfinnsBCHL1106f5Tp2ufmOR5r5xNX4QqFrpvHQ5dtlRPymPx7zoEyEYNLzyaNNVfZiCEgigYQta3pOnA2VlxidfbvatEYLBko/flbXKiH9hHkyFVyX6Y4Eg7eSJ3sNHSj95L2X20xGz73GdHiYp87LlcbNqLTMgHMfSUqzzl8W/+1zN3cl6dxY8vrIXFmt65sBtkvDUOM7i4E1O57YjuFJO9uuluHNQzblMcZnlvSWK7t2UY++qafFduGj9ZqXu1kGq/kMbX11CQkJC4iYiCaymEDnW9N0yb/E11cABuj69wtKVbhhZxw6yDnmBwiLf2XOAxyCLB0JkECnHO3ZJuGtcxKVGURB8h484ft4iS0xOvG8WlZph+3Unf+EiiCSwZO3aOddvEHk+3BBVFN1fr4dRTPW/b1wAgO/CBe+hI4kPPUYYI8dyIBRVjxzHMozruzXaR2eFFuSRde6ktljda7agBi3RJp3MbevBUaasDE+Ouf4gAJ7jJxw/rFcN7EWPGQLQZj6QpFIhqsNXx4TzF7QDb4NjiMe4tm1Qd+6kmDi+8SHB7/fnX2bLK/iSEhRD/VXVGC1nXE5CpWS9PiouLuh0kgkJQZuVSkryVVZRaanBikoyNcVfWoYkJLAWC9mqleD3Ue3aYfHGumhfGHSvnv7z552/bNZPvC9iB/2YSdWrv2Iqq/CE2rigZtJEx5Klvi17ZSMG1LTIh95C5LYJnDjv33NGUCr8FhvVvYP89v7K2/qBmndcELzbf3Ns3KkdP57u3hUAAETR++s+29ZtcWMmySPVlpaQkJCQuLlIAqspnAf3am7pHT9pHqpSNt+7RUAQmdmKzIy0ShiGKHpPnbatXkvFGRPue6SuNrCm78DCf/+icLkQZfjcYDkNE4Tv2Fm6V4MVRtv8ZaLbb3z6SfA/4cWaTNblKxPvfySauqrDMHaydd0K88KP4555KrRdOXQwlppi+eBLzX13y3p1wnLbOtauM8yN6qoVCme1Wr74Egai6t7RYVONRqCoFM9r4GTBmsyOc+fSR0TQTGFUrV3BlBTGv/xi+JiFxa7164PVJkKrJvLaQm2S0VYpChhGVErK44XlNGexwRQhVpgglQIuqeANWpgAvEEuBGhWgYoqEtIQwC7AXlvwSpF45bK7tAKjaapnD9XggY0LROqm3Vv5xtvEuVOKvAi3TKamawfeZvn087gn56BaLQAAoWn1jPur/vuev6RC90itdzyWEIeNHARGDgKNViqZa9fNHyyTp6clvPh8zWYL3u2uevcDUqNJfeJ5VNlCvw8JCYkmkYxGJaIhCaymoLp0VoQEe/5kgsXFzOUr7v0HCKXKMHqCokMDhyQIw5QpqazZ0lhgAQCojh29G36Rdc6pKd4nMqz3243B4vL4558N/cr3bvpZ06svmRxTpTntqInX33/Tc/iIvFcDc3Aqq628dy/vhp1khyzF3cNt73xhfvd99fRpdTGYxvBOp2f3Hu/JU1hakubRKdHiPY3BCBxPbRAeCxYXq7PbN2uCIHIcV1KoHH1nA5sMUfQcOuLauhXPy4qfOy3a6mSNVQSZ0xYAIOvRlG1pTQxNyfG+o6f9236znDmjmHA32aqBjIZwnO7Vg6+uBJEEFgBA0b2Pr/CqZdGnhqfn1gRNEaVCO/Ue98ZN7o9XUpNHoLrIrq1MYan7u02C0yPv2UMzZlTNkqL7yBHvth10qzb6MZOg5gKEjRE5znrs4OHDf6rnhYSEhMTfAElgNQXWyFs8DN7tFvx+VKeLsTph04gMEygs4qxW38HDnMMBRFGRnRM/Neq+MxHDfefORQyDqe8c4QoEql94Tz5miOD2eTb/qurUIeHVl0KljOfwEfeVqxkvTG98ekQgHDeMmWD5aZ28Z4+wbCfNXWNcPG975wv9m3P1r8/x7Ttq+mghZozTTByPJ9VvVBRZznf+gnv7ds7pJJITDK89jmhbFlBxXy+jZQ0K8AUOH8FTm7dWt2zdgOq0YZsGqt+fL/h8uhdmYfE34kcaDQhF6D5d6T5d/ScvmD5bTHfvqpvQIMCGt23j/G6tesgd0UYwTpzu/HVn1Tvvxc15FIuLAwBQ7bLJtm1cGzdVvfA+nZ1J9O9BtsuEZZTIsGyVOXjhivvnPbhCjqRn6Gc9UqOhBZ/PumRZsKIyYdrMG/C4Enneum2j+/Rxdbt2iYmx1sCWkJCQkKhBElgtg3e6vCdPclcLeLvdV1WNyihREASWRXBCOWyorFuX2PO0eI/Hc+wE4Dj24iUMQ92lZSLHYTIZnZFJtsqm22Q1W5IF0+p4ZZSUcARRTpog/rw5sO0A1batrEcPxdjRYV2EqwXa/sMaRzUEv7986SL9yLup9HDpRrfv4N63M3C1gGwbXpNRMepO79v/Zq6X42lJsv490dTkwNHT1sVLgAgIrUYURIFh/FabIj0FzUjUTZ6FyFu8hU1kOZHjUGODHCwoyDQfgRNF7vo1+q4GDua+c+chjjW8+USdT3rohYJXijiLLXjtOkzL+GoLnp7M2V1EmzQhwBAZyTBNIzpVs6qa6pIT9/zD9gXL2YEDQnd94gkJotBMdT/VgKFBq9m04GPD7Fk1Wx0hBFGNvUt2a1/vgYOeVZsdfp/AsgCCEQxTdetK39pPM3xo3c5W74mTtjXfazp1i5/8AEy18KUWRduubb5zJ3CdVjXqTkO/vqmpqc2fJSEhISERgiSwYoKpqvYdO+47eoxngqq8diDFoJgwTJsYV6tORDFYcJ3Zfbj8tZ+Ncx8nUlKaGEoUBNcvu12/7IJRFFMoZW2zodTWVKvWKpUG0+patEWRtVoB3ZQJu2rkCDByRMRDvMfjPHsu/dkIJQ5LP/4vFZdU/e1SRa++usG3hx0lsjt4tm5rLLAgHMdSUhyLV8f962kAAJ6RhGckKe8ezlnsXLWF9/nxRKNapUBUN+5pGbx0DVcowhSh32pVRjLHD8V54gjHslR2dl0L7/HYvl2le3pGmLoSXB7bom+YimpURirapUPBIJakAkECiH7YaYMLOP+VUpGmPKVVAsdBCELF6ViGVYy9jczLgskIy5R4Rop8xEDrF0tCc79gmma83mbvN27cPZ4LZ0wLP1YMHawaUutwgRkM6jGjwZjRAADB72+8F5KzWKs/XCDT6hKmPEi1anHZRF9RgXX9apQiFGNGyTrktfR0CYl/GpLRqEQ0/ikCi+f5c+fOlZaWpqen5+TkwLFZWIksa9+yTbhyOWAyk61SFRNvp3t1jmB/BUFEm3SiTbpIU8zxE00ILM5mq56/gE5M1o8cp+zU7fc4PgAAOKdd0f4G/1dzZos8PiGiVYGyYzfnsYOUMUHevkPjo/IOXdxH90ccUztlsuWjhf7j56hu//tiRhDUqG+2aE+MsGWVVGNhhyBAEJs+0Xf8INZwIdW1cxdh1BGZDUJfIsO6PlkJID75/UfQOA2IVH+wpkUPABBF1upky8zeY/ng+JmKL9doBvUhb++PKMNDmPTg3q4NO5mSUjw15IMR21svz+nIOR2O3TsxpUrWI9weLOztEwXBtXW77/ARWWZW3LgItYyaxXP+tHnjWlmXztrx437nh1OipdzYM0ri/x3JaFQiGv8IgVVUVDRu3LhTp06p1WqHw9GjR481a9akR/KrDMO9b78yNwvt0yl+QM9YEoTpUYOr5v2XGjwIjZR4zlabTAsWqW8ZqO53E37XcZ8/zXjcZKuMGzvdf+kSICMbQWmGjUR0BkWnbhGXwDCtThTEYHEJkR6+bATLZKqpU0yffKYlCSq3beNzfyeB/cflw4aHNeIqFeu0N3GW72p+0G5LnPtYaCNz8RI1ol9YT+s7n5NJurgnxsakLSAI06sxvVrWqQ0AQOH0ejcerHz636pJIxWD+zToCcN4vMF97JiuTmCxLBSzfFH36S9r0656+eeew4fj5jwWrVugsMi+/BsYxRMefBzThita3ufj3c5ARZmyY9dowqt88QLB7Yh7fHZo2pzEn8MNP6MkJCT+svwjfkmaPXu2w+EoKCiw2+0XL160WCz33ntvLCfKh/VVPn6vYsgtMW6/QpRyQq0SG9Xjq8G/8xdFTseboq44p92xbSOZl3vDYQY0Lg6NflPKrj2bSDBCSJKpKIt4iEhNkXXq6FyyJnit5MYmFg2mqFRkOCovJ6wda58tlF1v4kTv4X3yfrdCGBbayHk9sk7hQ4ker2JS5BKBnYDZAAAgAElEQVQ9zYKoaOW0oZrJg6DLRRGOtkkL3efI+3yEogVLpbghzjD5PsHu8O79LWIHz4GD5s++UPS8NXnui2HqinM6nFs3FL/3uv2HVY4dP7uOHYo8wsmjgselnflQA3Ulit4zZyvnf7Ru3brYZytxA9zwM0pCQuIvy99fYPn9/h07djz77LOZmZkAgHbt2r3yyiv79++3Wq3NnttsxcDGCDzHR0qvYcrKHKdOa267s6UDNsZ95kTZp/MVQwbpJk+84UHItFTX9WKRbybVOiKYRsvZHdGO6iZP1Nwz2Tp/qXXxapG7kfEbI3K87ZOV9ID+cEOdBABQDOhvP3uKiVQDEQBg3rw+YDEphw0JbeS9Xp5lYSUd1pn1+H7nuphqSHfn2UuCN7xaohAM8o76V4ypMkFIy4LHZFJqwoOPe37d59j0c4MDolj1znvs0ROJM2Zrbg3X7rZfd1z/6N8IRLaZ9Vry1KeSxz9i27mZtYaXUXKdOW7Zvkn3yEw8sb78TvB6SdlLr/h27JCPGTxuXIRcPYmbxe95RklISPxl+fsLLJfL9dBDDw0eXP/d4/V6AQAcx938i4ki5/Vj+ggpR0xVtbpNW5hoKie9WTwXzlpWLHb8spnsmEff2vf3DIUaDFRivO2n72/gXJyWN71ZkmqXrb5rDGJxmp9/z/n9FiAINzpNAAAQ3F73R18hOBnmv1UDIpcr+vSq/uZzf/G1hqcJzr07vedOyAb0D3M9hXEciKDxrOgO2d5Ve4DYTEZXEwSuleNqJUyFZ7tjAkAN9Z8K0e8jdC3OS0OVannPvrDLFdroPXKUd7kMMx5rvJWStVs9Rw4kj7lf02c4QtEAAEIfjyuUAss06CeK9q2b6L59avwganBu32n9cql8cB/dW3PpTu1jX9CUuAH+1GeUxM2mxmj0oFfaESIRzt8/B8toNH7++ed1P5aVlS1cuLBv375GY4OKND6fz+fzhbawLNvSawUuFyIkgSgjrP4EL19BFTdqoi2KzuOH3Yf3CQE/1bO78eEZN8V2S33/fVX/+S/79Wf6cVNQRQus6l2FBbLkCPV8QpH36A56dPedOx/4dW/1M++gOa1Vo4aghmZ8xcLgnW7Pjv2eXQc1gwaqHxoaLbykHjPazgvWDasFjpNltuUBzJsqOZcD12njn5vX+O2AMAwlCbasGkttUC9Z+eAE2xuLfK8ujX/x3sYiqVk4i9P80ffK8Xc0TnJynzirHlVvkxEsLoaJG6qECMGspT7+JPgDjo0/xU95IKJvfvXyL/S9hsoz2jWYpN8Xtt5t27Md16jVd9RvF3Vu2eY9eEA9czL5v0Q6QRBEUZRk1h/E73lGoSgq/L5fYCRuFtIb8f/LX/AZ9fcXWKGsXr36qaeeoihq5cqVYYc+/vjjd999N7Slc+fOIHwRqRm4ExfItpGTuyGCgITw5a1mEQXB9suW4OULgsgjaalxkybegBl3NGBaZpz3tHP9puvz31a3bitq9YpO3XFjQtNVbhy/bEFllLxnj1guIcvLleXlOn75RbhWaHnrEwBDdPvWnFxG5WXBChrRqgEMQxAkAhFwPG93ikEmWFgCOJ45nQ8zjM9kVXXIVY2+U35Ln6YvpBl3F7hrtPXH9YKM5s0mKCleO/4uIiU5WkI3ajC412/TPnF/aCOEovTU0d4ftpc9+hGRnaoe14/IjCHdWxQDV0odq/cw16ux5MTGNX84iw0CsKxzvQU8HAgi+hZbm/qvF7oO7Kb71+fmwxiKGwz2nZsTHny8cX8+GJRlNsgzE5gAxzCYqoERPFd0lehdHxrkHE7PwYOaEHUlimJFRYXb7VZG2rohcXNp0TMqLy8vJyenoqLiT5ygRFSkN+L/F4/Ho2hJbuufwD9FYF27du2BBx44fPjwY4899vrrr8sbrXDNmzdv3rx5oS2vv/76sdMHYr9E8EqRc9+RxFdfjngUViiE4tIWzFgUzVs3BPMvoAq57I7b6E5NVWi5YRClUjt9qoZh/PmXvbv3OEqLPJWV8vgEnuNhGQ3JFURqhhDw41o967RDMOw+cQRFIf0Tj8VSWbkO9ZAhYAgAgsBUVgYuX4EKC5mSfb7KKgAgLhBAcIxnWEwmEzhWnpzEerxE+3ZoWoa8Z3e90dgCrwEY1t0da6qQdtrU6vfn+46fk3VrENgns1qRLz7ClFX5tu+zLVgfdDjlmSkM4GXdskV/EEvUsyYHZtQErpWjStp74JxMqXBcKqIT4oBBa3jzSUQVYeXUvWaLomvnUA99rqKS6teyBQXL9p9cRw8YHpzRwIEMRXWzZ1W++bb73GlFoxLOhFLpK7umal9v7uC8fIaOM4bm+zOmKm9VZVKIXDZ9tJDqkkuGbAKFICg5OVlSV380N/CMeuGFFwAAyS2prS7xB3Cq5i/pjfj/5a+mrsA/RGCdOnVqwIABvXv3vnTpUkbGDfoaNE3g0jXnktVUbg4S5T0mMjJsv+4zCEIsisG+f3fw3GmOC5K9e6oaJmj/EUA4LuuQV+MqqWEY1mzxX8rnbDbe5RLslYHSUqDTB60WIjkZNmhVY0a1SF3VA8N4UhKelAQGDQQA/P/WHEY1GuWwoc5v1jMXrqqmjg5bcsWT4/EHJgAA2CqL//QFMb9QLHUGCkuB0R4orwJJ8azZBrdNFyka6tbJOHE0atRFuxBzvTx4uUjx6KzQRtbtJuLiop0SBud2OrdtCpaXqEaNaOzvCpOE8rZh9q3rIQyVZzdw4sHb5jiP7lJk5tZl/gUKzqENywP4rxfRGWl1YVGR5XivVzk+3AtD4o/mT3hGSfxBSEajEtH4+wssQRAmTJgwePDgH3744aYv0IqBoP/0Rf+uw4GySsNDD5CtM6P1pNq2xlRK666tuqGRrdVrcJ065j3yGxfwyYffpusebiz5JwDhOJ6UWFObpQZFoz//Hij698NSU/3btpmfew/NbaOeOAKmwrcgYPF6bHh/MLw/ALXLxaF/NlsUiS2vMr/zhebOEXhCfbKX4PdzPh+mi0lgeS9ftG5aiycmGp57JrRKd8MbuRU1xlV/uQyaOI0O0VjawcOdTPD6ivkJo+4j9PHVu350lxWmjp0Qem7wykU4xILVd/EiFadvXDtI4g/lD31GSfzRSEajEtH4+wus/fv3FxQUjBo1aunSpaHtU6ZMoSL5mDcLb3X4zlwSC8sCl6+xHi+uUKKZrRKnT0eaW0NRjBppX7WGTE6j20X4r+i5dI45c9xVWEB27hh/97gmAl1CMBi63iRxw5AZ6eQjs5w7d7HnzlY98x8i3kAO6Em0zbgJ1vOi6N6x37dtn7xbV3nfW0KPsGYzodY06wchcpxl/Wrv1Uvy/v1Uw4c13ZnKzlLfPty66XuIIGUhMSrl0BHuogLT1hV+u51OSEi4bxbScDeDr7RY1aV+sVL0+xs70Uv80dz0Z5SEhMRfgb+/wMrPzwcAzJ8/P6x95MiRLXp4CV6//buN4Hpl0O4kDXq8Y0fF6FxZTvvYN/RR7dshDz9YvfATOi1D2X8oEZ8IY3jQVGXbtQ12OQIuu3zgwMT7pzZOY2fKyu3rfkBFwVdZxTMsjGEwgtBJCbxGq596T+y3EA3WbAkWF7v3HyRbZ7LXr6NJSahOS3fuFG25szH+/MucwyH4fIhCQaSlYVoNiC0ZX+R5tqrKf/kqU1wMebyEnPZcL6E0Gp/FIk9KDDidUEKCvHs3qn275se6UVRDB4Ohg3mny3v6NH/sYvW3m0i9RiAIvGMW0SqFaNsKwluwO4Grsjh+3AZXWlivX33PPVRW+KJe4Oo10tDMHkzn0YOu33ZRrdLj5z2NaOpz0tmqau+Zs0xJKQgEiKw2qMFAd65NvVIOHogmJlQuXRw3drIirzbRHkLR5NlPAwAYiwnXR4iZiRwX+tpCFCUEg7HfrMRN4WY9oyQkJP5S/P0F1syZM2fOnPl7RmBKKnzrtnmvFslSktFu3fT9br3hrXx4cnLSG6/av/+h6tulEABcMEjHx/NAJAf013aPUJrQf/GS4/sfICDCiQZyUG9V21YwTYEa/4IDJ7hfjzq//kY+ZhSivsGMJs7h9G/f7jhxSp2XBTAAaQjRikMBV+DQZc+OnQCC5LfeKu/bp+mkK//lK/ZvVsqS0yAE4YJ+96bNXMAvMxphnRbJyEA0ajwpESZJCEYEJsi7PWxlJWuxisXXRa/HW1VNG+JEBIHlKjQhjcjIJDr0QBUqORMEEASXlwQLr1m/+VbVuSM9amTEyomh8B4PTFE35mGBqJTK/v1A/35qUQxeL3EfPARdLXf+epTz+WAEpVOTWL+fapvhszvwjBSu0owmGNgqMxZvYIpKKb02cLkIJwhXcQmhUIgoSgwaqO/RPeKFBJsVkkdVrpzb6d63y3XuFJGbo6ozkhVF16/7AocPc34/Hm8AFCEqScFU4TpwMLB7D9w6UzPqTgBBsnbZ6lF32rasx9RaMqWBLVZEdSUEA6Iohlqa4Qa9o8oCYssUlLhZ/P5nlISExF+Qv7/A+j2wpVWWVz5kHW7loAEJ4yeiqsbFf1sMTFG6aVOb7RYoLLR/sxKhSMXkO2RdcsO+8BCVQnXHAHHYrY7Fq6o/XBD/0gtwlASdJvAcPWZbu04zYmDiglcgAg+3pBBF/5l84fSlstfekHfsqJ0yOeKqlu37HwJnzsbd8wCVVp+ZKwQDvoLLweoq8WqR32Zx+32szwfDsAgAqVYDCCEzMgVjijy3ozEuvgm1SqW1An0GCAzj2r21/LU3jXMfxxMTwzuJomP7Tv+hw5zfL4oiBESEpPCkRNW4sZjhhlb6IIhITyPS00BNJr4oshYL73JD1woFkoCsHsjJQDYPJtdwVg8iUwMWEmVaNIsgsrISNBpU04zYDeRfoTtEyq4TRfOWDb6zJ4i01PiXXoBltWrSuefXwP4DmFZF3tZX3q976CdBJYqB81fcq362FBWpJk7EEuKV/fpiel35sk+MY++RN9pXGAZjtYRV7MESE1EZ5fxxh+puKc9dQiImaoxG/79nIfFXRBJYTcHkF8pv6a0fNrRxhZY/FNe+/Z6dO8nueep7RjURS4BQRDN7qvW1Bb7jJ+V9erX0Ksyhw8oxQ+k7BkQZHaI6tQOd2uHD+joWLnd+t0o1cULjhT++tEzeqUeougIAwAQpz+koz7k51hIwjquHjw5azf7DR/Cxd4UeElmu6p13YRSm7xpC9+wEEbjI8UxhiXf7b1Xvf6AaNEh529Bow/Iej+/UacZkgnFCZBgiLRUiSaptm/BccgjCDAbMYCBrksH73Vp3pEaStjTxH0EQKjW9QZMoei6ec+zYJAi87uEHibTa4JPI894dO70HD5G9Oqonj4owFgSReVlkThv7l2uqPvwo7rFHidQUqn079ag7rVt+xHR6IrGpfeOcywGT4Xn9ZK9e3j2/4inxVM9afSYEGYZhGp0tISEhIdEUksBqCnm/vurht/3JF3Vs3OQ7dlw5425Zp/ax9Kcn3OFZsbGlAou3231VVQlDHmy2J5YYp3/jCcubi7ivl+sefCDsKEKScJNlc24WmttGVy5dpBx1Z2jEy77sK1lmimLmxDoZCqEI0TaDaJsRLCpzLFwOKeSKPr3DhuJdbusXixmzVZGeAUgKECIc8PGWM35TldXlQkhSkZ3l8/k0I+7AE+J/Z3XCCAgCIq/NNGdtVvvenYFrlxGSVIy7S9a+Xd3lOKvVuvhLCEcMbz1Zl3gu+AO+E+eZguuCy0P16EC2a42oFACGNTMnU2cu2b5cKh9+m6JPb2W/vphGXf7lorhxU+Q5HaJNhLPZ8EZlnVRDBsly25s++cy3aTcslwGG9VdbtuizbvKLICEhIfF3RxJYfy2CJaXeI0d1z8/Ck+NjPIVs39ru9XIWCxqpBmI0GJMJV8hjTN+GCFz7/MOmFz4IlpYSKSmhh9hgEFSWxX7daHiv5rsP7sURxFNeqmqdFRCEuDETIKw+mITrDTCKMhUVRGpqTYv/ypVAebnxv/MiBvmIjGT6rmHeTbsUvXqGdhAFwfXdapik01+Y23h1UhQEpqrCX1IkHj3g/HpFwGFXZ2cxGC7r2hk1GDC97vfrLZZhqr7+lFBrRY71222YXqedcR+Rltqgj9ls//IrJClO++jUmisK/oB3+2++vUcQGQmr5ZAosLsPOr7+QT1ysGxYXwjHyI7tuLHD7CvWExnpeEIClZerHD7M+tP3mFZHJET2o+csVVykDwAWH5/w3LOczRYsLUOUqqS8nDFjxpw+ffp33riEhITEPwpJYP2FEIJB82dfKO8aGru6AgAACJK3SvNfvaZoicDCjPF8sAXrPohCrpx4h3vdj8STT4S2q8fc6Vq9LvZxGmP/bbf78D5CpkCNKXSbDvLOGO9xBs4eqvz0A/mtg5Vd6k3GZcZ41mSuE1i2b1YqJ46AiKjJZ/J+3X2b99h+2qwdfWddo2XJl8DlSXj4yYgVgSAYJhKTicRkda9bAQCc2+UvLGAvnuX2HbAUFYo8j+C4PCkp6HLJUlMCFguZnOyvqJRltvKVlqFJCZzdgSfE8y43qtVwNjvZOlPkOMxggCiyrgR40puvcQ6n/9IlTK/TZ2Y2VoesyWT9fDHeOlU9q3aLaPBqsXvZOojGja9Ox1Pr09U5s8P9zc6KJ9/Wz7mPyMqQ9+uBUKRtyVL9Iw+jBoNq8CDMYCj/cpFh5DhF5wgZ94K5WjZ0UMSXDpbLcbkcT00FANzE6kwSEn8/JKNRiWhIj86/EIErBbhKLh9yS/NdG8KROIhUBst76pTvl914u2xYrVY0dGNCFXI+GOQsdlSvaXxiROhbujq+2+Q7c0bWsT65ikhPZ31e75VLdNsbcVLg3C7H3l90vYfqug8MbVe26+I4e7hq0/fynA51RuSCCASbrfZEq03keLpPl6bHx/LaQiZTaAtbVmEYO6Xpeot1oAqlomMXRccuAAAtACLHBU2VIsehFWWoXMkTpbBWhzFABASMUSggOW8Q97C+8irI5WNKinGrw2eqQnHCZ7MqOuSpJk2oCUehapWid5QlXVF0f78Oy6xXV7zD5fziO6pnO92MO8KnZ1Brnh4vfL3NtXSt7rU5ME1R3TsEjp2zr/jW8NRcAICsQx43aoR1y0aYJOl2DYrzsDart7JCkSIV95CQ+F1IRqMS0ZAE1l8IpqqKbJ0e7ah710E+/xoUb1CNC9/hBRt1kCPcvsi5faf/4CG6Wx+RYdzbdgiVVaq7x9avcCGIqkcP7/Z9qimjY50fDCuH3cqcPB0qsAAEaabeY1/9PfnwkwjdwuLYANh/Wmfo3l/TUF3VoO7Qiy296jiwVzuoNg0OlcnE/zk1eI4dV3bNbXbBju7TxbPsx7ofmeslMILKWkcuyN0sEIqSiSkAACo1AwAgz42cxV+TYKUFAABQo16FYMC66iv7V8s1901r2gHBsvRrwefVP1efG+f87Fs8zdhYXdWhu2+4E4Itb30c959nAASpH5pgev591y+7lEMGAwCUffuS6RnVCz9WZecqBg6r8WsQAgHTqmWqgQNQqcKghISExB+D5HbTAgIF1zxHj/1x44teD2e1Rzvq3fIr63aypy82PiQEGcHlDG3xHD/h3PmLYfID2gFDdUNHJD/6rO/Cpap//1dk2bo+aLt27r1HBbc39hlSfbq4L10SG+4po7LaCihS8fkHvoLLsQ9Vg/d6IZUZtewxbEhiC6/U/ci63UIgUPNvoeAqH6dtdnw03uALiWD58i/jut/t0t5yYILUTpzuvnipbv4R4Z1O/5UrygfG14kw3uXxl1QYnp3U9PiqqYN5vz9wuRAAAGGYavpd7t176ixD8eSkpDdfYwFX+sn7tpWLq5YuKv3oX7zA0f363oybk5CQkJCIgBTBignvydOBAwcZsxmIgL9aoLhr9A0WPG4S1fDbKl57ky6vxpIiOH0rxg33b9lNxhkaH4JpCm5o0cWfPqsfMoJMql0AQuSK1Cdfsv7wrePLr9QP3g9hGACAapelHdjfs/xH5WP3xjhD1KhXZmV6jp1Q3NJga17CS8/7L16yrF6F0XK8VRs8MZlKy0TlCtCc56eqbXtvyRUyrpG7FQAAAEKfwJTVizYYAnU+WEGLVde7QVk9IIq2VZvkA3vjCfVZSrCMglFM8PtrTEohpxPPCLdW91w447twFvK6GbeLat8BUWtV3VrsedEsgetFiuTkpj82ni1bNUP74un1y3bBy4XKNqkQ1tz/UwRR39mb3X+czM4EAJAdshUd27u37VD9L/kMJkndjOlKk4mzO9j8fMPUyZg+aoFqCQkJCYnfjxTBignfoUO8AKU8+XLCg4+7z50PFBb/EVeBSRLVab0/bI94VNajI+Pw+P0RQiC81cl6PHU/iiznvHxZ3qFhfhIMa8dNYV3u6v++XxfHoocO8V4p8v16JPZJChlJzNGjjdup9u3iX3mRHj0yUH7duWd7+efzC956vvT9Nyo/n2/dudlz4WzE0USD0XVqv8BGTrfnfG7GWx9g81vMNUZcvNPJBwKh2WOBSwWuD7707TvmWf5j2CAwivCO2vAeV1EBhVmaiaJ92ybe7VN26qftfbtgtlu3rP8jysX4z50UtE2mu4mi6/RZrE/n0DbOYmNjCzGiafGBK8X1P/bv7tx/QBSE0D5YXByV1VY7epSkriQkbhY1RqMHvVEj8RL/WCSBFRNYYgIeF8/7PM4t69X9bpXlxuRQdQMY584RLA7P9n2ND0Eokvjx64bnHo4wPQJHE+o3HvovXVKlpjWuJAjBcNKspyhjguOrb0SOAwBAOB73xBz76p89+4/HOEPlyEFBsyVw5WqEGWIYlZ0VN/dx48svJL79Ruq7/9HNfpga1J9nPLat66uXLLBsC/c71vYbTGdmlq75FACx8YCsuYKqS80WRdbnq7EzCF4vUbRKr+/H87aPV6Ad0zO+eh4KBr17DocOgivrXwcYgsO8N53HDpFKTer4mfLMXGVWx4QRU3Q5XZx7ImvcG0YMBr2FV1V3jmiiD2uxYjISS2hQ00Yx7FbO5fPnlzR7CQiBybh62US2zZAlGj1HIkhhCQkJCYk/AUlgxQTr9nrPn6r4/EN3aTEd3Rz89wPhuHzsXY4ftnv2tuCrkauoFkM8F/xnz/GyKOafMKwbP4212avf/aAmjoUZ9Pr7pju/3eQ7EpPREYSiSFqie9NPoGF0JEJPBMGMRrprF82kCQmvv4L37uE+ecT81afusydDu6luG8W4beat3wpMg7iRyDH288fQ/6VMsQ47BMM1zuP+qwUsUp/e7r90DZWR6rH9IByjbu/h37E/dBzW5+e9teG9gNUKNcyL9585jqW0AaC+EVIbvPkXYnkpYse64ydEoUA1TUWw2KqqxvnvEIIgqUnV/1rhPd5Mfltg/3mG50Nb0K45wYOHo/WXkJCQkPhDkQRWTBimTUn615sJb72e/O+3bqyWcOyQrTIMD9zv3bDTfzLWr3kMw0KdKnGWlWXlROsMIUjirKcIjd6xZJng9wMAqPbZxjmPOb7+0fPD9mZlEwDA8MyDuF7t2vhTjNMDAAAIkvfulfzvt+DcbOvmH+07N4P/qQGYotOeflUksMIv/+U4d6QmlMX5PFUblsqSkhUdu9Z0C5QUqrJqd/9hTBDvmF03NltepehUm1lF5aYDsUEwDKPIumAeguOIskG2GpHeGghc3Y+BqhL70T2Gyfe14Naag/d53WdOqO4e23Q3Kjub83jFRuZkuiema+fc5/hqW+Wzn7sPnBf58DdIDDL2ZVtdRy5oHp8W2i4f0CtosYgNVZeEhISExJ+DlOT+/wNTUhosLPQdPCxLTAj6fFSf3rIOeXXmTFS7bGH0aOvn32nuv5vu3bnpoQAA/opqeZd6VeEtLdPkRjCWrANCkLh7ZlR9/XnVv/9rfO4ZRC7HkxITXnrBvHCR//RF7dMPIOomd+9DEH3/uIpn/sObqmXDh4e5kDd9onLQQLprV9PCRe6zJxIfegJVqgAAEIpqxkzELpyxbl5v/nUjpdF5LSY6o7Vxar1bgT//gkDWpk8Fiq9TufXVD5lrJQJdq3pFTmDcnpBLgqDLXZeKxHg8QGi4FklRrpN76YwcCABv0QX7qYNEQhJhTIj1jmLAvnUDkZRUW8owOhCGoiqVZ9k6+f3jIJIIPURmt8JfnePde8S2dLNp0Q+KlHgRBkSigTE7YAC5CktJo8H4n3l19aFrgOUyCEWY8vI6a1YJCYmbjmQ0KhENSWD96QiCe9t2x6/7tF17KHr2Q+Ry/tpVbt/B8tVrlYMHKocMrvF2ort0ElnWs3YLTBFUc0UJYQTBQ3KwcFqGqZuzD4Xh+PsfsW3+0bboU9W0KXhSEqJUGF983r7yO8sbi2SDeytGDGzCZQpW0InzX/IfOmlZvASCIFytxlRKnuUgBIFEAQDABxkYRWCZjEdQPKstqtaQWbVBJkSlTHjpBc8vu6uWLJD3HaTuWWsWUFMfmqmuAhCk5nkiocHWQqa8RD1jeu2/nS5len35F7xVKuqqNSD1Hb6o6tVAkgocj2prDR1Qkgyr5azpO1B0OSs2LiOVKhHHk2bNxXQR9mneMO7TxwKlxYann4yls/HZZ6xLvqye91/5sL5El/ZYYv17CstIxe39Fbf3F4MMU1bJFJaJFAHUViIvK0GvRTSRBTGhVoUn9UtISNxUJKNRiWhIAutPRRSE6nc/gHg+de6LqKL2S1HevgMAQHbtsmX9msDpM5qpU7CEeACAvGd3RC43f/q1ZvpY+pauTQwbsDkgvD7mEXQ4hYC/+dlAkHbkONvu7VXzFxgfe4TIyIBgWDttKlNeUb3wY+HcFWrqaDwlaiwHpil6yC30kFt4uzN4tVhkWBBkIBQBAAAIRmlS9AcFfwBY7OzpU7aCQjohAU5LU4++E0JRAMPyYUMgg9668juYY5V9BtSJOdwYoUxQoPR60DGlSaMAACAASURBVOMhkpIAAEAUeZbBjPV2VhAEfGcL1ACILOfeeoQeU58kJwYZkedhovbF4fx+kWMbjg20d4zR3jGm+Zer5QQry6s3rNWMuyssthQNCEP1s2cxZeWOtd87Nu0iNCpUr0VyWqM6DZnTGpbTAACIwInMNCIzrdnR2PIqX7VZ0WhJUUJCQkLiT0ASWH8qnp83YzhhnPFY40QuWWZW6lMvmzd9b138pfqeiWSbNgAAKqedduJ497rNME01HcdC6HqDJTo1NcwLtAm0g24jklJsX6+gBw5QDOgHAMCTElPe+Zf3yFHzvz5R9e5K/R975x3X1PX//3NHcm9ys0OAsBEQAUVwD0QtWnfrXrXuaoet1dptW+227adLra17Vlvrtu6tuHFvZG8C2esmuff+/sBCEpIQ0Kq/b+/zr3LuWTf4IK++z/u83oOeQWRiHzMgUjG/g2dP81rENG3OukEeOVv55dfc5GTp4OcAAERqCt4sWrdmveHqxcCxUzgSr8ah5tNHZYMG1uSAUyYTlyCcC+QJenU17Dqi/X6zVWPgx0QKunesfWQvVxFOsT2OQOBnkZyHhywtVm1apRg3lp+a0qiB3LDQwNlvAoaxFhSQOblMfrnl9GXduu0MRRFhSpqDIvFRDAzjLWIABHHDle7VGBnGXlJuu52j235QPmYUN8xzpWcWFhYWln8VVmA9Psj8Al3mmYjZc72mycOwYvAo4/UrFb8uk78whmiTCgAQtG+HisWVvyyXTRvNb+fZaoWmHM5zkmYzk5vNdy0OSFvMVTs3I1aLvrhI8dxwQcuU2qAREZ/Ikb5c9Mt3kI0UPNsbAAAgiOjUkZecrP9rS9n738hfn8Br2cTyMrWvxm+fzG+fbLl6W7v8T6i6WjR2NMzjIWKx9JVp6nW/l/zyP3n/IcKUdvWHWvJztNl3w8aPqfnRUVVNu2biQwginT6W1htBdh7eJ935kfVmNuXU2WE2UxYLKva3/CIAgCZJ4+3rlNFgK8jhKIJJdbWwZQoqluBhEV6PUBnGePlC+Y4/Jf36NFZd1QFBeFQUHhVV20DpDbaSErKgAGitdFGR9eo9Q0ERhCAMTaMYl6ZpTCS0arS03QFgSJyUJB09it862dv0dpXKXlZuvnARwzFLUTEmlTooitMiXtC5E8zzK97GwsLCwuIDVmA9PgxbtwX0ex7hN1CwT9AqhWFo7Y5daGAgFhYKAMCbx0kG9tev347KJdzo8PpDYJTDOBy12UW8zh2huzlufcx5OY6KckmPIYJURpe5T3NoT/DElznSB85J3MCgqDkfV29cpSkplY4fV+PADvN5kvHjkNNnDSs2M8P78n0eU/oJr3UC/sOHhrXbyz77UvHay9zQUIjDkU+eYL55s3rDJkfOHX7XZ7DguuwrW0VZxcbV8nFja9+OoSlBmLvzO69VcwAA0dW99rP95n20WV12OS6VQrC/l0ANN66Yzhy3VlagQiGR0IIWEbQYB3rGcf961a3bMIeD8AlB+y7cICUeGlETUaNJ0nzvlvboPg7BV749m6t8lMnyiEjIE7XgJdRdn6zRiYzdwdjtlNkEQRDE4cICwkeUjrZYtLv+hlUqQ36BKCEOkhBMXCSvbTzM5VB5xaCksOST/cLUVNGwIbBrshoLC4tHaoxGn/QuWJ5GWIH1mLDm51vKyoNTO/jTWZjchjYaVYuXKOe+X1NBWdSjO8Ljq75ZFvz5LETuIQBDGY21qdzciIiKv7aKB410DmtZcrMhBCWimgMABJHNy/f/UfLL98453YhAGDB+euGPXzIrVstemlwbnhF26YQ3iy777n+0ySJ49hFUr4NQVDR5OBobUfHTooApk3jxzQEA/KQk3vxPjIcPFy35XtY8npLIuUFKMu++8fYNYbc0fqu6BFJ7WTmp1bmbqHqEYWz5RdJu3WsbSIPBYdBxAz1UInLGeOu6dv9OykbyOrZXvvxSTQaVs7EYAQCl0xnOnKPVZWX7djIMAyMIzOHYzWZBWBjeqaOoR/rD23nYVSrLrdt0aTmtUkEI7DAY8cBAm9WCRkXSNMNPbsmRB8AEH+KgEAf1M82r6udFNKAFw/uFJE9222HNGTSuUuuW/VH1408Bb7xe4zrGwsLCwtIEWIH1mLDfy5Z3Sfc/AUjcJd1855px2w7xuLE1LUTH9tZbt7Q/r5V9+CrEdbkaJkmIs5WV1Qms4CBxbKzx1jVhq7r7dJJOaUWXz1NWM4LzAQQF9x3NC29WvOT7sBlv1yY/wRgWOfvDqg0rdFu2Ofs2cYKDgt+aVf3rUqxVPEfp3yU7h8NerrJmFzAWEm/RDFUGuB088dM7MAhSvXJ1wPSpeLNmAACIgwr79hFkZJhv3rSeOIVygJ00hcx9HxG7ZIAhIhE/wq+8IvJ+AS6X8xPrjkqJ4CCY4yswY1dX6w7sJMtLsY7tJc/28nGPEhGLJX2fBQAIRgxjaNquUqECAcTjPZIcL1thkfn4CePN2/yQUE5UDEem5MgDaKuFYQCjVgGLgykpNN3NNpaWEMHBNI4R3dPx+Oa1ufzeMN+8BSOw/JM3fIg/VCGTv/9y9ZdLtBt+l02Z/PDvwsLCwvLfhBVYjwnjmbPSDF+VUuoTNHZqwXfz8cLCWh8j+cTxVYt+0S5eJ53l8s1nMpvA3gP8pDpzUUoZpNrxp9Ap0YoTEMgLCavYtylk8IOx4qQOtqqK8hWLw9/6qHYgxOHKR03M/3YekErEGc/UtnOVSn7Hjur/rQj69l0fsqOWyi9/oVQaYVw4Q1H6k2dJrVH5/YcwzyUiQnRti0hElT8vDZ49s/Y0DeKgREprIqU1cA0a1WJXVZElZf6U2jZu3guHukgxS7Waq67GI6I89jfn3Cv/fSXeLFrx7hyoMQdkEAxzgxqIivkPZTSWL1wsbNEyYtYHvg+UA2maLCsxXrtkP3latXqtvHs61rkTx1M58Br0W7fx+nZrOLQGQbI5U8tmf0nk5mHNohvozMLCwsLiCdbJ/TGBICge6dlqsmLrRlP2nfrtMI7Luve2n3WqmQNBsimTbAWlZE6Bc0/JyAGQqy+DdOAAUXSUIculinPQuJcok0Z9/khtiyJ9IIeLW/JdErZgHi902kzz8ZMOrda5XdyvD6Bp46FM329aA19ABL41UvbhCwEfjw9Z9Ka8d3vj0k31beLxpDjpmIGqhYspnd6faQEAWHgY7rtqMgAAAEd5FVWlkQ518V8QhIUhfA/ajKHp6l2bK/9Yo5g2VfHytEapK/+hTCbjhazKb77Trl1nvnYdOBweu5m37wzo2j1w5Ise1BXDUOa62s8QDOOh4QH9ng8Y/3LUnI9hBi3/9n/Gw0cZL3b8gqioBixka2fGuJLUJIdG49eLsbD8hwnnVr4VtDGcW/mkN8Ly1MFGsB4TVq3WYzTCYdQbrlw0XM2SpmfIM/q5PRW065T/zXz+84NqT39gPp8TG6NZtC74h7m13bjNwh1mi+n6daLVP9cMIQgf0L/y58V4bHPnE0DpkDHFv/7AGLWSLv0QnAcggAgl6gN/h057w3ldLDiEFxuvWbVWMcupHYLEI4ar128gund0O6Osj/Zenn2Lg7E7sNhQRMBDEsKNhy5Ax84Kn+ni1pPo0YmqVFf88KPy47l+na9BwJBX6KXU4j8wjGrBr9yICLdTM3NlJVRVCdzuV9ps5SsXARgEvTsHlUhcHlmtpjNnzWfOAoqyarW4SETRtLBjBzg0hEhO9ieSV4s1+37Fr0uFcVF4RkdA2jV/bjaFhipecS/dbb5+w3D7TsScT9zatScPm7LOWTQaAAHAMBweX5zSDg4KEaU+uHeJCkXijP5Eu86qTat1x0+EfOLhsqpFo4Hv5PDb+uWIaDUYmRs3ibbu9wZYWFicYY1GWbzBCqzHBE8qpUxGmOtu9YQKRIGDR/GiYzlSDy5QCI/PDww0XcgSptXpkoBxL1T97wfrnRy8RUxto2T6aNOGXfz4+NroCxYeJs7oUbr05/A3P6i9EYYFh0S/+6n+yL77v86Tt2hNmgwQRCsnTKu/tLzf4Pxv5tlVVRxFnaUnPynR0aqVZe9x/vO9fL9v8KezLRev6dcfsVRW0TY7RySQvTYeT4rz2Fk0oh8oU+l37RE/P9D3tAAALDqaIm200VRjvOkR884j/MAgyYTxbu1EaAjq6rZFmU2qdUsBigTMnOEi72jasP+A9sgxSdtWvL5peMt4VCqiDCZbYSmVW6TbstWy/yAcHS0ZNKDhTHCGUf++kcy+r5g1GU+MrWnD2ydXf7aINpth14ia9d49XkS0s8uXTVWh/XsLsNqlnftGxCTBXIyhHNbKUmPOTe3B3WTWGTQxWdrlQSI/KpYqX5pZsfY349btwhHD3DbCT+tK37nRwG7/eX1HSYV82kt+dWZhYWFhqQd7RPiYoBwOc+49j49EbTp4VFc1MEKx9fp1lyYY5qam6ldvdW7jtYpnuEjFjz+7zNy3DxaqLF++kHE6jYJ5PMmAIZGz50KxsQ7GIR87BcY8SAQY5+HKUN3e/W7txMD+6t1HLFkNfE+jgTJh/x6y+TNDl3wWvuLr4B/melNXAAAAQfiwZ7UnTthKy31PCwCAEATl8w0HTnnroNuyT7v/uGjCi84ypQZTSaldU137I2MjixcuQJtFKt583VldUQZD+VcLrLdvBc6bSUwbJejRCQ2QAgRBJCJecgvB4N7BP35ETBziKC0q+Xiedut2xsthXw3qlaus2dmyt6fWqisAACqXoMpAzZZtbp3tRSUM7nIboGLDCsoBQka/Lk5oA3MxAACEoDxlhCKtX8z0T4iWXbVH91f9taFuAAwrxk4xXr+hO3jIbXJe8zjN5Zv160l72vNm2uHgBD+yxDIWFhaW/xqswHpMCPv1sd+80oSBgsRkvjzArVGYnkaZzLTR5Nwof2c6AkOm02ecG2XTpnKDFSVL/kfbSOd2RCAUtekQMvk1H3ZH4m4ZmN29sAwiEkmHPG9Yv8OWX9yE1/EGN0wpG5RBnj3rT2fFq9OtJy44VGr3BzRt2nbAeuKifMJ4RODhFJEnl9eabDF2e8Xa37iBgeKhQ5wP+xiK0m/YiCqk8o9n+LgyicVGBnw0I3DeTFvufdWCb3WHjzAUVb+b5veNjNEQ+OUcjjLQ7ZFwZH+qqAgwLsWnEZnMzYWfw+EGZQzzfHgKQeLENjEvzXWUl2qO7KtthrlcxfBxphOn3JLeYIFAmpRoPn/V20vVYL2ZbbuRLZ800Xc3FhYWFhYfsALrMcFv20aXm2PIOt9wV1do0mrKcXcNhbhcREBo/tzj3AgL+OIZ49Tbduj2HajrCcPiF8ZwghTFP31t19ZTJD7BQiO0dzxk3wvTuopHjqj88hf9ln3+hEP8BO/RUXP6jJvg8AgnKIjfJlX12ULrjXsP+tO0+cK10jc+tV65G/je285unM4YCgsZ+oEMKl3+Mywk5DNeceujXrXGQVpksycDPxLCOMGKgE/fFE4dYc7MLPnwY2tOrvPT6lWrLXfuCqaNhHEPBgrc6DCb0Wi8kOXcCAsIWueSWm6qqkRxX3cJEZwfOODF6uOHbFWq2kZedCwEwfpjx906Q0mJ+r/2+fiQjSfOV/28Rj5pAhYd5WNRFhaWGmqMRk+bPJfZYPkvwwqsxwSEIMFvvak/edBw6VzDvV0H8pt7OFwjuqZBhe4HamigXPbqOFNmpkscC0VlUyYJ0tOKfl5gvHbJ/6VhDPOWdc5LSgyYOAEu15bN/kK3eIPx2Dl7cXn9S4KNAubjAAA/M8fFzz+Ht0q2/rW/dMb86g/+V/zKR/aDZ6VDBivefKPGmrU+NEnSdjs/Og4AYCnMo4wGyfhxbi9ouXfPmpsrfWOCP+qqFiwuKui796XTR6uWLjP8vtFeUQkAsObmOkpKAz+dxQnyGgbDE+PshS4XQkU9ezh0GudrgNKEltrrDQT2MHlwQGIKWVrkMlW3DFilcuspaNcWRlDT7qMeZmEY897jxr/2yUcOx6JZdwYWFhaWh4JNcn98cENCpNOmlH37PXn/jqTv86hI0vAYAAyXzkMycf3jLmG3rvr9+80Xr7sVKOS1bsH56DXVp4tMF7MUM16tFRDCXs9gLeLVK1apD+1RTnrVR9ZXLbSNpD0de9XAb5kEWibhRUWW+7n2k5fMu46SOh2Hz8cUMljABxIRQ+Cc0CCYz+NGhSFiYYOSxXLtTiNcOiFIPmoEAIDIzYMJQi4WNZhsrjtyDMV5EIoChilft4xo26a+HYN++04sNQn28Hk3DK91QsiPH5mPnCn//geKtAEIEg3sCYt8BZ84CTHW/S7JZKhUAlBEf+GMuGPXmhYoPKrq0F5xy/aowFfJbTuEmi+dFybXXfoj4hOLFu0WjBrp0g+CAme9UfbVAoaPCzLqbk6Q2fnqxetRHi/o7TmI2C8rBxYWFhYWH7ACyxcMzRgvZtlLy4DVwlA01iKeG6LkPISlJCcoKPSTuZZTpwt+/EqenMpJSCaaJ/iI2Tj0OoemOmD4YA/PIEjUrx999iqoVwEaDZAp5r5mWL1F++tSwcjhnIAHKVzcsNCg997W7dxdtuwnTBkmf34kKvL1nW28miVt10D9QW54ODc8HPTsDgCgLRZKo7FXVjkMBkd1NVxtpAquWXU6vdFkM5kxkQDicnmRoTaaQpuFA5rhhgfTZiuEY2R2PlJQps/OU0yf6nu5+jTCCbOwiNcyBQBgzrlLKIOl9S7ZMTabQ6eTj/Jwdc5eXK7ff4LfPpkTGozKvSpjCOMS/boT/bqbdxy2Xr5tO3XJBGDi+Qxv4pKfkmDeeditUTJyuGHLdlGb9hCHCwCQdk6HKarkz1+Cn5+Myb3+2+M4SNy1EBNHKoMRhLZY3Dz0EbE48PUZFQsXUeeu0cFyDo6ZL9+CIFickUF06QRxGjDgYGFhYWHxB1Zg+UJ/6LAwJBSWKyChmLFb7afOVhfkCePjiQF9uSHu9Yb9BBEKBf368Lunmy9mVe34o4Ik+SGheFIKrgzDQsOdL77Z1dUV65cJUlp7y4YRdOpQvGs3dOYy0TnV7REaKJe+/ZJh64HSrxYEjB1T62YEYZhkxDDhs720m7cW/vw1VyyR9RvMaxZXP3Rkune76uDfgdOm+P9qMI8H83gcT58MQ1EOtcZeWeHQ6KCyMrhYYy8vs9/IJTUaPEBOmS14zx5hEyb+Sw6fAADAMKbc3NA+gwEA2kN7OIkekrQMmadRocDd/YFhND+tttzP5zcPp4+dKbt2T/7yWH49UetM9TfLbIWlwR+8yzioiu9/MJ+7inVJJXp2RITugTFEKnZYLA61BnWyTuUlJOg5fxcv/Sn81Tk14luc1pO2WnLXfBfcY6C4Vef61X70d69V3b3ebOhIt3YIQcmiYl69I2ZuaEjY55+SuXnGU5m0KEA0fBivefOHL57IwvIfJJxbOVJ6+E9NxpPeCMtTByuwfCHu0EUxYKhzi1Sv0x49oFr4S8D0qVhUVJNnhvk8QXqaID3NVlZmPHeeri6rOH6QslphLpcnkztIK2O320wmYbu24mFDvE0CoaggrYt5+0F++2QIrfftCEHCYX04SbGm9TtNx0/Ip05GRA+OfhCxWD51klin0+8/aMo8XL5xlSw+wUoDXrNYh0EPw7D5xmUYgQPGj+PFxzf5HV32giAcRYCzpdZjhiwo5MnlXLkCAMDhcHgtkzx0stnwlES3NvPZK7bCkvAfX0ekQgAA58xN/e/7ea3iIcyzFiTv5lLlKsWbr9dcY1TO/cBy85b52PHKg6f48c2w3l3xeBdDf35wIG2xAODiTS+fNkW/dr1m73Zpv8E1Gkvaqz+veaLp1OHs43vk8S0pvoSIjAM0bTfojLcvAAcZ+NwIGHev98wh+KjEc5ASQlG8eRzuKb3PGYamtYcOH01kE3hZWDzDGo2yeIMVWL6Aee4JNKhIHPD8CH5Sq4olS6VjRhMpyQ+5BFeplA1+HgAgBCMATdvKygFFOXR6TlCgj6JytUgHDazKzdMu3SR99QWPHfAWMdwPXzH+ta/0i6/4qanyUSNqTyRRsVg2cjgAQKDR2IpL6HPnab2KzM/HWrTAO3UUpqfV95HyBcNY7+c4VFW24iKItMEURdMULBBSCIJFR6EyKRYZ2Sjr80eL4eAhNPBBaM1YXiYgPBTMIW/fQVu7Cw7T30eFz3WpUVcAAEHnJPOBi5pVf8leHlt/Bsbu0C7dJOjdixv4wJQB5nKJ1BQiNYUyGrU7dup+26RxOPjd2uHtWmERIQCC7EaTraycG+oS9kOlUsnL0yq//d5w91botJkIIQAA4BFR+NgpErPJcO2S/e5Nk67cVFkujGkOBwUrBg3zEH9iGKtG07APqnfspWVVS5cLgkNatmx5/Lj7hUQWFhYWFh+wAqsp8GNbiLv21G/f4Y/AooxGy+27nAAZY7Nzw8NgT7XwHgDDNV+0jTonk4wfV/XTQuPx84LuHTx2gHm46MXBWLuWhg071QsX4RkZ/CSXOA0qlaJSKb9VS+ClvrJvyPx84997raVlCIfLCwpGJDJIKIe5GExTtNWKGA32M+f15WW0w4EFBOBdO+Nxcai84RT7RwnD0BWVohEPjN1hCIY93TTEpRIoJNitkcvD8RaRzi2clBim0gI8oflpDT8yStilc/1HiEAgf2EsoCj9yVOQWq39aa3dYkZ5PI5MSqS2rt8fxjDFm68b9x0oWfwtkdJO1mtAzTEuwicknbqBTt0AAL4/RHNuNqFU1oYtG4u9okK15DeieULo8BcUioa1PgsLCwuLM6zAaiKyHr1Nl84Zz54XdPIsawAAhuMn1Lt2oxiGYBgvKMBUXMbQNEXaeIoAKChImJ6GRUU1yg7AI6hUKujbV/P7Vl7rBEQi9NYNS4jFPptlOnmxes1ac0S4bNJEjyKjUdAmU8lnX3L5BJHaXtZ/BDfA19ewQ6c13btlv3qjbMs2PCxUOHAAHuO5+vUjx3TlKmW3YyFhD3ZiIz3mG1krVZjB6N5YpRHYXNxW7YWVtNGDdbvl0k1LTr58/ie+AnUIIurRHQAgHDqEcThsxSWcQIW35CdEIBAPH8pNTDAfOJT/1VxBcltZr34Iz7tAd4Zhqndvwduk+NW5HmRevurXpYGDhhOt2z7BuCMLCwvL/7+wAqupQJCgeQuaJD0+pMzm6iW/Iigif2k0v12rmq+oGu1DVWut93Kt56+Zdu2qKC6TdGjHadWK1+KhUp0EnTrQlRXG5X+KZ0/ypdggiEhvz2uTZNq6v+TTz2WDnyc6dmiywqNJUrtitaR1W1n/If5Mgool4vZdQPsuUpNRc/xg1dIVkvQ0onfGv5jY/g+Wy1fw8KjaH70JGjxYCeoVseYnxNgKKnhJD+4qMnaH/VaBcNJwt26Mg7LsPCx97jnI7yM5CEWxqMgGu/ESE3iJCcZz522Xrxb98AUmkws6d+c3i0OEXkNTtMWi2b4JAEb0TE8/N+MMY3eo164XtG5HtG7gDikLC0uN0eiT3gXL0wgrsJqOnWao+zmgezf3BwxTvfhXWIBL5kyp/12OyCVE5zZE5zYAAEFFlfXSTc3vGzUMI5s4Ho+JcZ/Kb0SDBlZ+90Pl54sDP37dd09YwBeOH4L16Gj9c2/h1u3BM2dww8KasGLZF1/zQsJlA4Y2NsKBEIKA/kOk6b20e7cXffBR8OyZTb6S6Sd0pYrXtu7YjqFpxkFB9XSdzWZjcgqItHYurTHh2s0HBV1aIhIBAEC1aBsaIMMTYt3GVv+8BsX5gq4eDgcbheXuPUqv57dq6ZY7JejYAXTsQBmNxvMXyDtXK7f/weETqFRGpLRH+AQWFAxjOG232Sor7MX51aeOyXp2D5o6vhG+Ys7vsmIlLzhUMcjdxoKFhYWFxX9YgdV0OBwOJFfWbzedPgOjkHTWpAbvvaNBAYJ+3QV90w1HzqiWrhCndRUN7N/EExkIkowbo/51mfXKbTwlocHu3IgQ7pwpzLYD1ctW4ElJkmFDGntLH6JpuXd1Zbx93Zp7Hxj1tM3GiYrBgkP5cS5ROkQglI94ETlxWLtyjeyV6f9qVhYMAC+y7jiSw+czDjsA7nfu0GbRcFWZW6OwW3vHvfzSt5fgSVFMidpcUa348FW3Pra8YvJenvTt2Q+zScut29YTJ61lpVypRLN5C1ckxBNaIKGhRNs2td5UiEAgfqYneAaIaNp87Zo1O4cuy9Nn34c5HKtGw5NI7CQp7NRBMniQIC2tadugSZIsKg6Y/ubDvAsLCwsLCyuwmo4lN5vf2937xHL7TvXW7cFfvAXVO2zyCgQJM7rw27XSL1qnWrhY8caMpu2Hq1RKJ01Q/fpbwPuvcMM9KL/6iIc8K+jRUf39yrJ5n8lfmoxFRPi5FmUwUCSJSqQen5Ys/o42m3kRcdyASMZhp4pLqk4fgzhY0IsvcRUuNY8l6RkQDJV+tSDs8/kPc9/NN+aqqiCZk0MEw1Babf3sbyw0RHvqpHtiGpcrfeUFW36xbss+0ZjnJLHudyEZB6VZuFY2cjjHNRPcmHXJfvee6fp1TCiyWywcuRxv345om+rtNfV79zE8TuC370MoIqUoMrfIcv6q/XSmdtsOiMsRDxrIT0yCBQ8SsCAYJlJSiJQU0KR7CT7QHTzEUwRxpPJHOisLCwvLfw5WYDURh05L6rTyRPdYke30aWFGFzSw0d9PiFgofmty+VtfGS9cELRv37RdYVGRvJQUzQ+rAhe8A3H8+uUiUrHis1mGv49WLvolYOpkXvPmfo3i8yEEoSzm+jnXxlvXILsteuoHEFK3gUCaLt/7e/mqX8Jmvg9jLpWPxWnP2IsLzKdOC3o948/SjYXS6Tk8nvOiPHkA7alGNdYs2mGy0CYzXM/EgRsVpnjLs8u8aet+XBlMOFneU0ajefcew/UbwtT2AQOHYSERtspyW0WZ9eRp88FD/Iyewq5d6metIYEKiu5P0QAAIABJREFUCDge+JkhCBYXhcVFAQBoo9lwONN+5VLx5i3SlNYgIkLYtfPD343wBkRRSDhbiJCFxV9Yo1EWb7DFnptI1b4dHKkE5rscM+kOH7GWl4tG9GvanDCOSyYOM+7d/zAbk48eyYuKUn+/slGjhAN6yl+foN2wUbP5L78GIAiC49pTR+o/0R7dh0iVzuoKAADBsHLAOFFMYsXa3+oPEfceqD14iDabG7VnP7FkZ6OES5SHQTnW+zn1e0IoygsOMh4/7//kpjOXtYcyRS/UeWJZ8/JKPvkURnkRb30k6/OcMLktN0AhSGwl6/lsyGtzAkZNtJzILP3sS9pqdZuKn5LqKHI/oAQAwAK++Pne4jlTQr7/gAqXWzJPlX4yv+LHn2iTyf99+g9doWKYhyrazcLyn6LGaDScU/GkN8Ly1MEKrKZAW622wjzxUBePddpoNB09Tgx99mFKjvDbJNkMBsbuwQXAf0QjhjFqnX7z3kaNwpPipDMnGs5dsJd6+Jr30L9dW6aspH47VxlGG9UAMPUfEQltYU/VozlyBU8mt6uqGrVhP6HLK7AIl5AMogyDvYg5ODKSPHPZ35mNJvO2A9Khg2tM2wEAjupq3fqN8p59JH2eg+oVtAEA4GERoa+/yw+L1Pzym0Orc3kUF2PXGRhPobUHeyP4ooHPBHz5lvTVF1ABXv7VN9Wr1jxyVQoFByGOh/rnx8LCwsICWIHVNKq2beTFxuJxLlfJNBv/QIPk/I5NdB56AIJwCIIsKfbRpezzr0o++Kji0y8qF/3isQNMEKKxY4xHzxiOnGnU4tyoUNnEoaolv9F2e4OdJf36mMtLDTeuuLUHDh7NMFTF0e31h9i0atrLlzciEFrv3m3Ubv3EfOkyL8nFyROPirXe8byWuO+z9iqNvcSP/xmladX8hfyU1FpbUcpoLP36W1GXHpLuvXwNhCDFiBchjF/l+uuDcRwPVBhPX2pwZSy+mXT2FPkHL0OQo+yLryp+XgToRxZzwpvHmrNvP6rZWFhYWP6zsAKr0RhvXTflZhN9ezs32kpKycJCyRT3artNgLbbUe/u24zN5tDrQ6fPkvYfAumNxj37PHbDo6Oko0aZdh62XG3clyW/S1uGcgA/BBaEIIJeGboDu+0atcsDGJYMHGq6f6No/femguwH26YpzZXT1Sd38bxYK8EwhEgkjdqqP5ivXYcBxI9y8b/gRTWzGwyUpyM2mMcTtE4mGxSmDGP6fRcAsKDvs7Vtph27RPGJog5dG94WBAW9MAWBEdOVq87NaGwsVOhX+BAAwAlWSN6YIJ81GVhM2t+WOTQaPwf6Bo+Joew2srz0kczGwsLC8p+FFViNgzKZqnf9JerdixPodBuOoqpXrBSN7I8GP2wxY1tBCQAAlXn1LDDfvMWTyTkyORGfFDRlhunS5cqFiz32JFJbiwYNVC/ZYDh4yv8N0BYrTVF+RkSE3buhYSHla35l7C4HW/yo2NAZ7/Dbd1Id3nxv4QeFqxfcX/yx5f5lYdeekm6eMtkZxlhS7I/rZmPRbt2GJbV2SwmHuVyeMlS7x/MRqmjwc4ZzV8jsfB/TVv+42pZbEvTOW7XlGnV79pGFRQHDPFeE9ACCSAcN1/21lbHVfXT8Du2Nl274OwMAAABus3DF57Phls1Kv/xau+vvRo31CMThEGldtHu2PfxULCz/BWqMRk+b2ILoLO6wAqsxMIx292Y8JlqU4WKQrT9wiKEpfpc2Dz+/fu02Xqy7iaUzqETssFoAwwAAED4RMGSsvayC8aKHBO3bycaMtuw7qVm83kdyT+3q5gvXKt7+moiL81Uw0RX5pAmcwIDK1Uts1SrndhjDRO27hL75QcSbH0iHjlFOflUx+TVpmmdjccO1SxyBwEWzPgost+8gECLr8Wz9R3BQCCiv9DgK5vN5rVrplv3h8RNjbHbj6q1kbqF4/Ljam4mU0ag/ekzce1CjymPzomIQDDecrouWcZXBMIraPaW6+wKCBAN6BsyabL540XzteuPGeoLo3MlcUWa4mvXwU7GwsLD8Z2EFViMoXb7QXF4qHT/OuZEsKDCcOBnw/isPWbKNsdnVP6+BbJRktK9zRiw6mmEY/aUHN93wiChMLDJd8PpdSKSmyGe8CozWyve+rfp5taO63kESTdvuF+q27i+b+ZltX6Z0zGjZ1MmNcAGAYfm0qUAhK1v6s/7SufrPEUKAh0VgylBvE9gqK6p2bRGNGeXviv7BkKR24x+y54bDnkrxSDqnW8vLvY2VjRrBj2teNX8hbXJJITdfvF4+5ytgpUM/+cg5yqhZtVbWMY2IT3Sbx3T3Vu6n7+Z9/kHe5+9X7fNQTIOXlGK76iKJ0KBg7YYd/rygG3iLGOmr46rWrdfu2t2E4c4gQqGo77Pq/Tspo3tlRhYWFhYWP2F9sPxFd3gPY7MqZs5wuSTIMOa9+3hdUlFF043IrTfvOW7n6I+c4YWGSqZOgXnuDuNuYC3i1Qd2AYYRte3IMIzDYkFEvswmOXK5/JWXzdeuGw8eqv7sF5qmBBGhNoMRk0qM+UUUaYMRWJCYyO/SWdqvb1NkIgTJXhynz8xU7/3bcum8uN9gPDTcz6FkWYnqj9VYZDgW6a/HqZ9Ur1yNiqT82BYen3JkcgiCHNVqzw7yMCwaOdy+bEX52wvEXdo4hAREUeTFGxADsIRE0djRzn2tubl2lSpo1OT605DZt8VJ7QK7D6o4vhtYPKR8EYnJ1hsuWe1EtzTdX5sBTTfB6QqLi5S/MVG3dJO4fz+3q6yOqmrL9evG4ydQDCP1BlGrJKR5c6JNqrdVROndHPdzdbs3y0ZNbOw2WFhYWFgAK7D8gbHbSpcvpK3mwDmz3c7O1H9tsZaVBc+Z1Ng57SXl1ts5lmPngIWkbDZhp05Bb81yswL3hmzMKPszPTUrVmqP7MXEUpQgeAkN18bhJ7fiJ7cCDEMWFTMkCfILOBHh0s4UHhPzSMoti7p2FbRrZz53oWL9MpRP4AnJ4g5dUJHYW3/aYqnctdl895Z8zCh+6sNdvayH+dp1W0lp2KtzfPQhIqKMWVmSZ3t7fgxB8mlTbWVl1us3HJdvclu0wNu2E2X0dK/uR1HVK1cHDBjmURZbc7KlXQcwFGXXqFBlcP0OWGCQVadzllO8pATTPoHh+Hlhz07+vasLvKQ4a4DMcCpT1D29poU2GjVr1pnzC8Rd2wlfeI4brmSspO1+gf7vPaZjx+WvTEcId+/6GqQTX6xc8J1lyXcxr/n6GFlY/uOwRqMs3mAFlk9oWn/1ovHkEVhIyGe87KauaKvVeu2GeMpw/4MN9nKVYdPfkEZvrlCJE+KRwCDpgAGootGp8ZygwMD33nFUV5NFxYhI2IiREIRFhAMA3DwmHgkwhgnS0/idOxpPnyEvZBWeOc6TyRGpDFGGIzjOkcgoq4Wx221lxZC2Wl+Qz4+JkU8cz6/nhv/wWI8eF7brjAi9XsYEAICAIKjCcxpWLVylkqtUAm8iDADThYsIFxO09CwQOaHhZXvWQwjCFQjxsA71OzAMUz9kiLZqRZ29ApoksKw3s0lVNe50C9V8+w5tsyp/nAvz6kr0cCJCiB4d1QvXqr7/ST59GifQw79ACIYD33qz+rdlRSsWl0x8xAe4LCz/Z6gxGj1jbPmkN8Ly1MEKLF9oM48SSiU3OUk8oL+Hp39sFqQm8pI9H0K5YTpzyfjXPghAnIgIwYgR8vCwh8zZAjCMKhSof0GvxwnM4Yi6p4Pu6QxNW+/cIQuLKXWVo1BrgyDKbOYGBTpomt+zW0j42PrVAB8J+iPHaKtV9kxf390E8UnqHZseZiGHXq/b/Xfw+Je9dVAMf0Gq7Y+KxN4kuK2sFJdI3J6Ke2VUnDlrPnOZ3zm1UfsxHDyl27w36LVXsOiouiUuX+F2SHZWVw+AYdnMidrfNmrWrAmcM9vjv0aIyw14/TXb2XM5OR6M71lYWFhYfMAKLF8Iu6dLBw3w+MheXW26dTto3usNTuKoVGt+XAkcNJaYJB06+GF83v//AoJhXmIiL9E99fvfxnTyJL9F6wb1K0cRaNVqH2Yhy8lMPCjUR/4+AMBbPewaNEf2AqF7/hwEw2hUtH7zHrx1C7daTN4wX7ph3Pg3jKLSoUOc1RUAAHA4UKnK4ygAgOSlUaoPvzdlXXKupeiGOK1renr6kSMeyiKxsLCwsHiDFVi+8FEvWb9jFy82Ag1qIICk3biTPHeNl5oqfm7g/0lpZcy6RBuNEIqiMhkWGeG/v8O/BG2xUGaLLKOB8BUAoKZMNW2xNHirwCO2klLN0WMRM99vwtga9BfP2qsrA2fPrP8oYMI4467dmm+Wyd6bDuFY/Q41MDa7bs9R26lLHIGA16Wz+Jme9WWlZOzoyq+/gc9d8VxjAIZFk4drf9nAS0ryEOViYWFhYWkqrMBqEjRtzcmRz/JwcawOhjFtPWA6cVExfSrerJnbcPP1m7TVYr5xgxsaSukN/NQUvFn0/3cKzJp9X791G5HY3K7T26xkVbkK5nB4QQogk3FjY9GgQCwy0j0r/F/GXqni8Pm1DlW+gWCYttmaJrAsh48IE1pyfAaovEHbbFU7/zRn3xENGoCIPd8DEAwcYPz2dsV73wr7d8dSEtFAeU0746DsxWWWG/fg/FLd9TtEiBJLTZUO7O8tYgdjGL9Hd/WKzWiAjBvj4aomFhdFU5Qp65IwrUsT3oWF5T9OjdHok94Fy9MIK7CagunadVwu4zbzbkbgcFQtWMqB0dCPP4SdbmmRhYXaP/6iDQbAAHGLBBRwYTNFV2utu/aoSkuIxATJqBHebnU9bRgvXDTs2i19fTzW/EEpZSkAlFpruXWfKq+yXb1srKyy6QyYRMyLjCAdlKBLJywi8t8OkzAUheL+Cibabm/ap23NyzfdvRf+5oeNHUiZTZXb/rCXFeHhYYoZr3BDQrx2haDgd94m8/PNBw9rtx0EDANzOYCmHaSNCFQwGMbr2kXZfyAnoOEbEqLu6ahUqlm0Tjx1JJ4UV78D0SHZUfWvVNpmYWFh+c/CCqymYLt7lwnzbjvOMIbVW+0qtWLuB7UOCIzdrl69lswv4ASFBI2eXBP5cI5dyLRq1ZbfVT/8JH9pCico6F/d/yOBvHsXaxlXq65qQGQSQVq72h9pi9VeVE7ez6Mv3TLu2KmqVAnCwmiBgN+5IxYRgQgbc//RPyAUJfU6f3o69FqYw2mU93ot1lOZ/LgWMO6vWKQMelP2HePZE6RGjYpEkrGjefHN/RmIRUVhL02RAkBbrQ6NFhWLIYzbhEgnP7mVvbik6qfV0rGDiB7u9xNpmmGMhsbOycLCwsLiA1ZgNQlVFa9/mreH6p9WozYm5KMPIQ6npoXMyzf8tQXi4mGvv4sQnk1BUYlMOWVG5V/rtes3Kma90QSfyceMIL2bbsPvvvvAPBxrHoU1jwL9ewIAGJudvJNjvXbHdvJE1f18UVSEDcMl/fpww8Ie1a6wiHAIhq3FhXhYA86lxlvXRP6pHDcovV5/9Vrk7LkN9qRJsnL3Fq7dqr13VxTfHO/aWd42tWknkjCOcz05afmPuH9fXutkw5+bLcfPC8c+j8X9U/mRYex3c/lduz3M5CwsLCwsbrACqylYKit5Ms+pM6a/9lvu5YfO/7hWXdkrKyt/+VXUrnNA/8ENzhw47IXiH78w37nDf+yX7xoLFh5uN5nJnELMU2aPRyAuB09ugSe3AAAIHQ7rjXvknuNVvy4l0tPFz/Z6VBuDBALDycP4mAbcX8mb1+DYaN99PGK5dYcnD0B9mmyRZSXq3X+RVSqIy8X6Phs24YVH4ub6kHBDQ2Svv1a56Bft4nUIn4e1jHPQNMguoK02PyNqLCwsbrBGoyzeYAVWk6BpROJBYOk377Vfuxsy9/3aJGt7eYV62YqAvs+JOnT1a2YIEnZIs1249PQLLABB4r59rNsPYW/5TPb3NhpFeSmJvJRE691c7S8bgMUifn7QI9lX4MwZlQu+M966JkhM9tbHeOcGqa4K7ufVwsoHjrIyXrxXU0H9pfO64wchwHBbJgVNnYQ2ygb23wdC0aA332Bo2nAqk7HZ6exs/jMZ8kftpM/C8t+BNRpl8QYrsJoCTVHA7nBrNB07qztwMuT9dxDBP4eAFKVeuYobFu2srmiLxXDlgubYQUFgEGk2ywePwsMjnefBIqJ1p49J/uVXeCQQHdoX79yNnrlEdG7T5Enw+Gay2ZOrFvz2qAQWjOO8bmmq7X9AHC4R58EGljKb1Lu2oOFhTbu2SVVWwgoPZ5qUxVy5fplNXU107ybq2cNHdhdjszk0GgjDEJHoMd+yrAGCYVF6NwAA6PXM41+dhYWF5b8AK7CagiA0xFZawZPXqSDD7iPW4xeUs990vtWl370HgtDAYWNqW3TnT1ft3a5o2VbZfyyC8U15d1QbV4m6ZYg712XAcAODKJJ8PC/iG9pqBTQDENib6wHE5Yr7Pms7cPphBBYAwFZYKmr+KI+oxM/0AHZ79baN9s7pkm4uoXu7Vl29abWwS0dB3z5NmxwJDwdGm1uj5tRR0/lT3KhI5WsvQ5iH00B7RaV2/wHMZtPfz6EdDgTjQjBsN5r4ymBOQqIwrTMibYrjAwsLCwvL0wkrsJqCA8NBZhavVTwAADCMYcdh3d9HlO/M4QTVXS10aHW6zNNhL9cVIbHk3Vcf2BU+dCoR+UBM8EIiiWYtCjYuIpKSa+siQxwuZbcDT1XqHieMzVby8XwERR02mygqCm7dStilc/2Qj6hnj9LjJyxZN3htmxghpw0m07aDeLLX47ymIe7Tm5/csvzHhaasc3jzBE6gkqEourxEc/0yJ0Aub6q6AgBAGGY+f1HeZ1DNRQSGovRH96szjykmT+R5qqtIW63qlauthUXcYAXUq0vQ5MGI5J/8LZq23s7Rrd1mv5+tmOXBcZSFhYWF5f9TWIHVFGQvvqBa8K3hwEmYz7OduAhDiPLdOZxAF+MG09975Gk9uIoHjQ5Nddn65WFDphIRLlWWecpIQXCYJS9H2PpBEIg2mzh8/pNVVwAAw+Gj0oSW0uHjGIoy3b2pPfS3/dx5fr++vCTX5DAIko4eZdiyA2/dommWB8bdRzhyuXRowzcAGgtHqQz/+guysMh07Dh1T8U4HFBAQMgH7yHih6qBKOrejbyYVfX7CmHGAEveff3pY0SzqLD5H8OeLLW0Bw7Zzp/nNAsPmv4WIq23LgzjSXHYF7M18xcZz50XdPRQEJqFheVphjUaZfEGK7CaAozjaPN43Zb9guhISCKTjB3tlknjUKu1WZeavfdpbYv22AFBeIybuvpnNr61OL9WYJGVFU8kL8cN65Urws7PAAAgBBEkJgsSk3XnM1UrV0t6pIsGDXTuyUtoof59k3bDDumEYY1dxV5WaThxIfC1xiWbW+7cpUmSzM0lUlOwyEhfYhSCsMgIbMKLjd2YDyAUVbw9W718ZdGv3xMR4URGD1G3NI97IPPy9AcOSKeOIjq09j0h2rm15VQmK7BYWFhY/s/ACqwmIh8zUj5mpLenptNn5G3aw7y6wnz2osLAfi947Aw57PzmdWEha2GusPUjPi9rArzYWJo0O7eIO3QlElpVb1ql2/C7eNRI4BSvCpg0QbNuPWMlfRTOqw9tMGp/WiMfNgSL8NfoAQBgKyurWrFKmpJEG43Gv3IqVdWizh35nTs9TndWCIbl06bKffZxqNWadRvkr4zjpTZ8IRTCcV6Yr6LRjcJ8+y6Vl2c4c4YfoDBXVYlbJlohWNitK1epfFRLsLCwsLD45slHSv5PYjp7nptQJ5IcBp1Fp8GDPHyDOkwGbVEu4mQ+abl+mapXn85RXU0WFNkrKmibe3q1G4zdTpaUUHoDQ1EP8QbARtNkzj23RlQoUox/2XjrjmbDRud2rFk0zOcb9h5v1BL69TspiuZ3aN+4UYeO4C2b818ZI3v7JemnMxXvTKMNmrJv/qdbtdpWXNKoqf5VdJu3oOFKf9QVAMBx5baVbOA36yfW+/dVy5YjdhAweIyo7xDFsHFwcDSVX1T548KKLxdY7tx9JKuwsLCwsPiGjWA9ehxqNQxBzgYBEARzcB4AHk6R1Cd2BnbvhYU9cGogS4oYh13Us7tLJ4qqWrwE5qB2kxlLSgoYM8rb0tb7OYYt2+wGIwCAAbTyw/eb5hsOABCmddGv21i/HcawiJkflC/7yXQhi2jftrZdPGqkbt168HwvPz3oLZdv2nOLgt+a1diNoTIp41Sihhsdxn1tnIi0mY+fr1z0CxEdyevdy7269mOHoShzTq7ifb+OPi1Z1+2llYHvvv3w61Imk37TZuULU4jmLun2ojYdGIdDc+qoefsuA9gpHjEMi3nCHxELy/8NWKNRFm+wEaxHj+nyFVQkdknKgRGb2eQwuZd7qzpzQJdzS5BW50VUsXEVEhnhfFnPXl2t/m0pwDgBX76Ft28F6bwW2tNt31mx5Ddhx/TId+dHvjsfUwTptmxr8ltwQ0JMlRX2yor6j2AeT9J/SPWfm+2VdRWCsYhwB0nq95/yZ3KHRqde9gfRtw/M5zfc221sldpRVunWCGFc4tk05c8foa3jKhb/qvltqa2srLEzP0Isd++hfB43suFTP3uZSrPyL05MjDcvjEah23cAFgjd1FUNEIrKevQOeuUtTmikaulyy42bD78cCwtLjdFoOMfDn0qW/ziswPoXoBleTLxzA8LnB3Tupr1wqK6LjVQf2665dCJkygz4nyIq+otnuUJC/kKdbxZtNlf9tAgKkgV+NgtAEJYUh/E8Fxg2X7tGXr8R+fq7wrYda1oUI8Zb7tyltFpv23So1eptOyx37torPP1pgCBp2zam3GyPY/mx8YLYeNOhQ86NvPbtmdv3vS3njGnzXn50tKB9O7d2Mjevav3v2r37VWvWkYVFHsfyWiXhiOfIK4SixLPdwhbPR1OaV/60SLNsua30ycgsCIKIiIbVlSkzS/3NUtmwoc6/9IeBwzC8lqm+NgbDgYNHKSe9UrVug/H4yUeyKAsLCwtLff5DAisnJ2ffvn0VHsXEI8WWk2szmdwaBZ27q7Iyy/5YVLJjVfWBjdm/fGxSlUTMmssNepB3bC0urNqzTTBsaK3ZAZmXr/rhJ06kUjxpWM25G4yghty8+itabt2qWrshYOQEjrzO5hQVirDgUM1WT0EsmtZs+rPs628cBbn206dKF3xnOnwEMIxbLyZQYc464+01AwYO01+6TDt5ooqf7WW4k0NbrN4/GwAAsN0vMF25JZ043rnRfP1G6dyPq5athIwWmASI1aFa8lvJBx+Refluw2GCMNzyLPtqgLgconda8LfvIfER5f/7QbNmLWU0+t7SI8ehVlsqVD46UAajafNezZqtRK9e/HZtffRsFJZsvwQuHhoRNn2WZvffT0qAsnjksf2NYmFheQz8J3KwSJIcOXLkzp07cRy3Wq1z58797LPP/BloPn2GvnePEUtEffs4m4j6hhseBlPuHywiFMV88o21ME+TeRxqHh/atTumDKnbYUV56eol0mFDseioBy1Fxaply4W9uwqf7103c2wkbbd7eMHjJyWd07EQ9/otgnadNPs9GLQYj58gc3OCv3obkYoBADyt3rT8z8qLlxSzZ9bWqAYACLt0Lj18lKEojyVlEJFYGp9gvnFT0PaBwQSMYdLEFtab2fx2rbx9OAAAy5b90qFD607EaFq/Y5f1+g1Zn+eEKS4J74arWZrV6/DEeMnIEbVHrnhsjMNqpU0WmPCVXgYTPMHAZ/AubcgDmeVffM1v20Y8sD+Me47/PXKIdm11O3d7vFbJ2Ozm4+d02w8SzeNC531UV1jpkawbFooK/Kp+yFUEKgYMNfzxp/yNGcBHySCa1p45m9XJv0qaLE2lyX+jWFhYnlr+ExGs+fPnHz169PTp0yaTaeXKlV988cWOHTv8Gcht25LbNw2REeX/+95w9qyfy9l1OltRfv12CIZ5UTEhL0wWJrdxVleWgtzS5T9L+vURdHpgg6Q7eLhy4WLx6IHO6goAABM8mqIcGpdTP3tZuTG/QJbRr/6KRFwLm8HgFppibDb1nn2ymRNq1BUAAJGIRLMnU5Rdu3mL63IEwuWas297e1NaIrecdEm6shECy1FfH5Ru9xFjfrFzdrxm3QbDhazgl2a6qSsAgLB1W+X0N42Xr+r/3lvbCCEIwuGSd3N9rFILKpMQowfI3pxIVZaVf/GVNcdD/O/fAMYwwOFoF62jjf9YXdC05fIt46a/S16fZzmRFfjG69JJEx+tugIAmKuqyVJ/r1IK23SwVKg0Bw5568A4HNWLl+iOHJGyZXz+ZZr8N4rliVNjNHra5Ov/Kln+mzzVAuv8+fPbt2+3e4rZ+A9FUatXr54+fXrnzp1hGJ40aVJ6evrKlSv9GYuICH67VqIXnhM+39t2xl+BJUrvBox6Pzsbr2aVrflNOnyosMeDm4OmI0fNp07KZ7xIpLmnKAEAJC1i7a7p29a792RtOngMMkFcDBMKHa558ebrNyStWqBK14AcDAe8O816545DrXFuFrRr6zHP/cHTlq05rncGiTapGOw9HMIw9OXbslF14SjzteuOopLwme8hXuIuqFAU/sZ7lqzLzv4Cok4dHBVVHvt7BIuLkr03nde1jXr1amuuX8rs4Qmd/zEWGlHx3jf671ZUffC/spmf6ddtZ6yM8t23A99+i6sM/jcWxRLiYY7fYWkIkg8Ygno/kKr+dSnDgcK+nNPsSd/KfGp54n+jWFhYnlqeaoFVVFQ0dOhQpVI5Y8aM8+fPN22SgoKCsrKyjIy6O7QZGRmnT59u1CSCHh1NJaWApv3pzA0NMaurLfkNfJHTFkvp0p+q9m4Pmv0m0a4tAICx2yu++U53/ETAvJl4S8/Fj62AMV286NxiPn2Gkci8rcIwDJlX4NxiOnJpXDspAAAgAElEQVSUCvNw3IlIxdyEGO3GTS6bFApNVy54m5wjlRuKip1b0AC5LttrlMh48oJNoyNSU2p+tJWUVK1ZJx85HuF7KDJTN6dQJB04tHLZctpiebArPkFmZvkY4hHxyAGSaaMrl/xWO8+/CoQgggH9pWPGYOnd+RkZwe/MUc77WDx0sHM58FoYm8106Yoh84zh7Dkyv6B+Bz+hbDar94hjfQQJrTQ3bjKezNUYmjbnF0hefcGjdmep4en5G8XCwvK08VQLrGHDhuXn58+ZM+fEiRMdO3ZMSEj46quvioo8Xy7zRnl5OQAgyMnmOzg4uLq62uFw+D+JLadQGBHup8MTgCDpkMFVW9bTNtLjc4ai1If2lPzyLSIVKee+XxPMoHQ6zZLfsBBF4JdzELHXNBr+M50x169DXCTEw6O89RdFNYMQl22jKMJr47kws2hEP2thEeP0v+NEagpFek9ah2HE1VwAEYkYmqqfL18DdDtX2LdPbfiKzDwjbt0WU9bdtjPn3C1d8r3uz7XFP31tvn+ndh6ieaK0ZYr5xIPjSEH7dpTR7G0VH+BJcaIWccaz5xo7sMnwWyXxWrQQtG+H1DOPBQDQFovx3HnV198Wf/ix9fBR6sp1+tLVqqXL9Zv+tJWUNmW55GS0MXoIxjBRWLit1MNajmo1L0AGC3xpX5an528UCwvL08bTnuQeERHx3nvvvffee9euXduwYcOSJUvmzp3bs2fP8ePHDxs2jPBUXtcNrVYLABAK6ySLUChkGEaj0SgUitrGefPmzZ8/33lg9+7dgeRBxrf+zz0M1IjvLUHH9pasrOKfv1YMHctrFlfbbteqNSeOmK5lIQJCNmkCFvmgRIytuLjsh5/EvbuJRvb3PTMWG1m6cK3A7oD+OQkylJT6SOQxV1fDeXn85Lr8AGNJmUgu8dgZkUkAAlvu3uW3fKDAUInYbjaT5SVYsAfTAZq0Uq5qrybaQdvsMMZ172yxarKuhw0ZXvMjpdFqzl+Ifmf+P1OR5Wt+tVWpxK27YMoIIAlRb99cYSMjZ31Y45UqyuhX+PMCfo90GMMQschB2mwl5dywRtd+sdIUfeq0qGePxg58xDCM6dz56s1b+CFhou59guMT4X+uF8isFtW2Pyp+XhT21eeNrUrJCQ6qKCoMoGn/Bzpoxph1GYuKcmsn8/IcNjsAgGGYwsJCnU4n9qQRWZ7g36i0tLTk5OTCwsJH9zYsjabWaJT9RTxZ9Hq9SCR60rtw4WkXWLXExMS0b98+Ly9vy5YtJ06cyMzMnDFjxoIFC1555RXfA+VyOQDAYKgz+dTpdBAESSQuImPevHnz5s1za7lyJRMAYDqUyUFQ2WuvNmK7EKR47RXThYtlv6/k4DjMxXgymb6wEOFyEKkk8PXXuE6F5wynMk0HDwe8Mo7XJqnBiWEeLoqJtNy+XauZxDHNaNLrmRcRHulwPZOCORwft8YkrRMZu8v/NwsiIuxVKo8Cy66uFtfLzoFg2OO3u+nEeV5gYO09PvPlywHtO9cazesO7oJoEPvyJxDKAQAIY1sGdMpQHfpLvXmdfOxkCEU5UrmsZbI565KgS2cAgDS5lb3YXWBpV2xGraRNo8N6dSE6ebaDwkUCJijE46PHhkOtrlr8K4fHD5s2s/7dTxjnBY2ZWL1xpen0GUFa467vwTguUCpt5aX1p/UGHteC4ng4+8abNbNwUAAABEERERGsumqQx/836v333wcARDSmlCfLI6fGaPSMsSX7i3iyPG3qCjzlR4QAAKPRuGnTpmHDhikUirFjxxoMhuXLl1dUVJSVlc2dO/e11147duyY7xmCg4PBP0H4GsrLyxUKBcfJj8AbDEVrl/+p+XOPeMJ4iOsekmkQon278AVfBsx6g9e9G6f3M/JpU4PnfaR48w1ndaU/cFCzfado+ihndWW9mW3avKfopfcrZn+hW/I7ed8lKccKGP3BuptfVrPFdNurK7e5vNTN64hxOBjvOblWrc6a7eIyRUslxsue07CM1y+TlOspBsMwFA3BHooCWc9chqOja380HDmGNnuQZ2a4cUV39XLY8Ok16uofIEXGcMpqK1/za83PnOYt9Xv31/w3iSDWky65aICijGcvox1jsfaxmlVbvB0gWu/lcYL+lQRzP7HmF5R99Y24U3rwtDd9yCBBz76anbsZT2l/mp278998q/SjTyq+/oapd4pEcTm6C17dy+rjMJlsntyzUJnUUq1xlPly82IBT/pvFAsLy1PLUy2wdu/erVAoXnzxRaPRuHDhwvLy8r17906aNEkqlUokknfeeadZs2Y3btzwPUlERER0dPQhJ8/xQ4cOpaen+7MB85EzKEkFz3wdlXnNIm8QVCIRpnXBY2Pw6EiX+jkAaP/cTF6+FPzVHLxFzIMmmjbtPa7+ZT1gyPAFLwe+N4bBgWHZJkpbdy1RMnog6lTImd+tK2rxaqTJkwe4nf4QIUpK4/WSIy6XYa5BKaJtG8zLxTSO2Uikd3Nuoa1WBON6iJAxDGMwizN6POhmNjMUxf+noov9WlZgxmCYW8+kCoJChky1lBbbqlQAAEFSMmWz2auqAQBEh3Yc2lVCwTBD06KeqdLhPTARQWk81BRyVKkZO0W09eV13mQYh4PSNXB7lCZJ9fKVsp7Pijp1c/vH4AYWHEIEB9dPeKdMJvLy5eCPZig+eQOPDDFs+tNNShLd0xGDBvgNVxHED/Ok82BYkJJc9fWvusOZbDKQN5743ygWFpanlqf6iFAqlS5cuHDIkCE1IfT6HDp0yDlHwSMQBE2bNu3zzz8fMmRIp06dVq1alZmZeeiQV+8fZ/DWyaJRIxu9b//QrF1vuns38OPXUfk/JkMMUzb7C0wmCvthBip/EO0MfGOYbuNh1WeLgr99rybLnhsRYq1W20pKuaEhAABei/jiDZvEpBXGPLhoGgvyeJEuJ2IOh8N67Q43wvMxmeHmPWGEi8DiKAKq72fX90GiSav63p2wCWNdJtdoPUaOyOx8irTV6lT9seMAgmpOEi3372nu3YnvN9HjfmAMF8W2VP+9NXjCdADDfGWI4fgJ2bAhWFhYZU6B8P+xd97xUVTr/z/T2/aWzaYHCBASQui9SkdpCihdQCk2sHP16le999q9NkQFQaRX6UXpLfTeQyC9bu87OzO/PwLJZrObbADL/THvP3y5Z86ZObvJK/vheZ7zeQJNUCEIgmF/uQXVyHmO997Mp1XBpWa2FVvwhPgqr/z7R/D7Ldt2YHab8dQZCIYABKMEjkdHK54cHVKUm37+hYpNUHSLqC8sTzLWrdvJ52vkpk0/LcabJeNJcQAAydOPl7/9hee773Uzq7tKU01T8hYvUTgdCBORyZa3tJizlIUsFFKNG+srKvbu2rV58+ZIbvUQ8pf/jRIREfnb8rcWWF26dOnSpa4alMRalbkhee21127fvt2jRw8EQWAY/vbbb3v37l3/MgDQP6zuxLH/AFtUqP9gDhxwYNC18yClV2vfnQjVjBjJx/R2Hr1sXb9T/vhAAACAIHnnNt7s7EqBBVOUrHlT096dmgFDaz8IEniyaY3GiFT7dsAU2vqIM1v9DifTsoZjHqrRCDwn+P1BusR+4awqPT2oRTHv8UhDdTj2lxsV6dVHFyGSUrS+46rKedzqxs3r8AJQtulR/tuqO5vPaCeU5QEAIBxHacp7/RbZvHHVTDq1cdEbP5CpCYRKQbcNPinJO5zszTztSy+GeIYg+AoL2ZJSRCaDcJxITAi3mUDsR456DhzkEQgd2EM/vBem1wIAfPnFzm37zT8sUE6bgtb60kWcLlm/ED+mkFCNm7I3L9fYJutny8oUM8ZUvoQwVDVnStn/femvMKKaO8+CCELdsb3z9HFZt4h+yTESR5o0CXcVN0TLp04ZPnz4uXPnItz2Q8Vf/jdK5C+n0mj0r96FyN+Rv3WK8EEBw/D8+fPNZvOxY8esVmu9Nad/NM6zZ42btshnjQtUV2x+sfnXXao5j0O183EQJHmsk+d4wDdcosF5oLpTL96xg/XYYb8tuK+z3253m0yYukYohWzRwnL0tOALUYZlXbSWbtYUCuonA0EwhvlKazat43nTjo3+Wu2DvDm3vE4XqIXn6FlPQGEWe+kyy92pLnJcOusT6vo9JKNiXcYK1mQEABB6g+Xc+cpx3GBwHT0TOFM1+2nN3JmczYsP7FE7AVfxyY+wQoGqagTj2NLSim++y33ldcuiX9y793m27ar4YWHB63MrflgY2GaxNuYNGy0bNzHjHtO+P5vp3LpSXQEA8Lho5bNjqP5di/79kbfmcX2eZe0FBURMXB23DQTX6V01TWUtv/3Ocxyiqtb9qE5Ft0k3L1seOA3r2MF44HeBDeFuVRv39SsAFZ2u/mL+bn+jRERE7p+HQmBVIpPJMjMzCSK4N9yfDc979+5XTRuNxUQFDntvF6g6pqPq0DEzSac0zumuqrahO7TiXG7+bktpukWqqn8/09plQkBtFgDAdmQvZYgOsu/CNGp5i1RXrYY27uPnhAqrYkyIlKjEEB1859PHmPg4Rf++QTMhHKdSkkAtCBSl06sDY5RaScbeOXGDa/WEus6qcwiS6g28xw0AIPQGnmUrS7+ptm1IX3BtEKpTq1+ZRrcJDl/5y02CxaGZPLFqROB50+Jfyv77NZ2YkvDc6zEvzY2e+Yp2ynOJb74fPelZDMEqPv7MFqBiA/EVF3vOntW9/RyZ2jjkBLpHe9nAHs4NGwM/NxjDIASJ0K4WAICpNShW42gFwjDyTq2DpsmfepS32bwBR8SJ+HhZWpr9yP56HyGwPtZul7QPblIk8pfwd/kbJSIi8iB4iATW3wTz9u1+1se0zwga9xw97aPDZmxhhgQQ8OXfiWdAOIapFdY9e6smSB7pzfrc+V9/7LffqbN2ZV+1HDusnPJ07buRjzxiWrPNsetg5dc/73TZfvm14oeV8onjkVC2PV6ny1tS7UXJezwV2zcyw4bWjhJ5c3I89hAV97brOViAj6Izr6DKTp21mLzl9bTPY90ub0khAABCUQhB2ZJSAACRnGQ+F6lrueWbX6jWmcjdnnqc3VH20aeQzRH34pvyHo8EuauTsYmaURMV/YdaNm11njkbfC+eL/3ya8njAzBDVPClAGTD+/EQb1q8JHAQRlFvWXG4JUHAOOmx1aia91275q0Vl4JIguzVofy7HwKr3ZlHB5Xt2VnH8dJKjL9tQ+UyOAKvJhERERGRBiEKrD8bGEKw1qm1x+nenYXrRXW4k0MQhAYYhMLJcXyg/wIEqadNoZo3Kfz2k7JF84xLvi9dtUQ9cTyqCBESww3R+hdmCRdvFb/wXsXrHxfN/hfihw2vvYJHh/btpDQaVFZ9n4rNa2QtWlRWgAVBqJRoXPA4b3dCMBKYm6P0+qrmg1TjFL+5LNy7vvPmAKhyq6fvFjahKhUmYfxlxrrXAgCcB08IHp98yB0TV4HjTD8sQCQy3YRn66gEZ5qnRY180r3rtyBXC+/tXIymmS5twi28u2lI/tx4d3a242R1Vx9Zepo3P9JOODCGBjmKkTIpnhyiPkw6oDuhUjjPVieREblcN3WKccsa59WwGstTkGs/fUwyoF+E+xEREalNHF72ctSKOLyeP2IiDyGiwPqz8eXmclZ77XG6TZrXbDct+y3kKn+FlfP4YIauGpH27+a+fTtwDqJQKB4fqZk1A2raCOvRRTvjWTotrHMpkZgon/q0btZM1YwZse+/Kx05AtOHjce4y8v9d9tXG7dvdN28TvV/JPS7KyrmzcGlYM6sMwhFBoa7vDart/hO1IpJaeG2mHzWsDqJcztcZiOmvlPk5HM5/SZT5f+jUpnz0MlwCysRvD7L8k10t67QXVch4/c/IhgRPXF6HYarlUjSWsG01FgzCmXfsxdrFlHzY0QuVU4dZd2wsdqtKinRnhU67RgCCOZr+iO4azYyqgaGmaeGWNas5T3VfY2o1GaqKZNLVi4uX7nYb61h3MD7vMZdW4sWfaeeNIFu2TLS/YiIiNSi0mg0DgvbNF3koUUUWH82soED2PPX2JJa/o0QpJg1zrH/fPk/F3mya3RQZkvNpe8uZjJrxL2waB0EQbwruKIcN0Qr+vej0lpU9eGpAzw2BlUpq+zUwwEDQMUmAAB85aXOC6c106fh+tBVU2iMIVAFViLk5GM1nZaw5OSq3zyEJFVdepr3bgAgdPTOevqgslXbqlgOiuPY3XPveFoq6qinc7Nr3U55y5bSu35d1l2/s2UVmtET6rahqkLWva8n+2ZgZBEXBCIzRAwSAMA7gzdDZbZgGic49x2ofClp09rvdnkKI+1VB9fcJKGQY7rQdgBk88ZMZgvTjwtrzE+IN7zxKhKtzfvyw9L5n5f8+JVlw4qibz7O+/Q9780r6idHU82bRbgTEREREZEG8be2afj/EiIxQdq7V/n732jmPI03qpHuIZLj9Z++6Tp8quS9JTCKUAl6VC33FZa78kuVIwfSfToF3QqVMO5rN5jM4HKuBwvncLjKy/Uana+sJP+7z5UD+xNxYc/B8Rwv5NQoqOJtDtvpSzFvzw0cFBDEfuK48pGBlS8VfQYWff1xwbofY4ZPgeAaUSXrpeOlWbsT57x1d6XgNplUsjvpRbxRI9OixcyEYeH2Y9950HnktP6f/7izGZfL9vtu3eNjEbo6M8i7XfZL5/w52azZSLfvTCenoPLqVCyV3BglKdf583TGnc/ZlnNLO65Gy0je7ix542MEx1inG6VJvEUT5bhhEHXnMCY97rGSNz9FkxLIRo0gDMNiY8y7NkdPrr/zksBxQZLTU2Gk3WF7b0vHDy194xPzipXKJ8dUDaJarXTIIMmgAWxxifP0GWCIJpPj1JmZtXWwiIiIiMgDRBRY9cD7fJzVKrg9EEVi9RkGRoikW1dfhck6fyWqUUomDMOiA8wOYJju1o7u0sZ98brvxm2eoRGNTjW0P9UihFMRRlOoMnTb5geI8bvvlZntAQCWTasVj/SR9qnLnodumeZYdy1wxL11n7xta6RmlyhJh/aO/Qd4nw/GcQAABMPqkU8ZN6zMW/wxmdBMkpIOwQhrMVpPH4AgIfrJSVWKx1OQS2m1VSE3MiGe93o5sw1RhuhCxZmtzq176Z49qhsg7t2nSMuQNK8+z8iajeVLF8AIxjRvg+sS2fPnC7ZtNDzzIq6t/qFIUpr7TXdTbILA+Xyoptr5grM5bF/8JOmQqhz7CCJnHCevOTYetnzyo3TW+MqaOVStZFq3YE+dJhs1AgConni87L9f8x4PTIYwhq2BwMM1GzQRSgUsCSuMIBxXv/aM9ZulltVrFaMer3EJhvEYQ8iyORERERGRPwJRYNWF88hR++69KEmiJOWxWsiYGO0LsyJMLdUFDKtGDhMeHWRetcb4n/kQTUmfGEi1CjDbhGGqZTOqZZ3pG553lVVI6T8yDiEI5tVrOadbMWhY4Y9fYnKprL6CaDIpqcJo8VzJrvT/dB48YTlwzPDPt4KmoSolqdVaDuxW3Q1ikbHxMc+/5r6Vbd293XGyzFaYr2qRjsTHawcOCzQ4tezdhcQHxM9gGJXLrFv2qMYHB7EE1l/+/jfyPr2ZXj0rR9iSUvP+g/EvVcfS7OdOlm9aq+/5mDyj852h1t2oyycLv/9vzPTZuOaunlZpfGfPg149AQCcwwEjcPVPiueLX/1QO7KHdOSdxiaSds0k7ZrZt2aVvPmJ9pUpREoyAEA+fnjxK/8munTFY6JRrYaMNVTs3KQbWk+TAJ5lg1oN+uwO2Bhc4hYIptcqX51a/u6Xvs/y1dOfCXkmVERE5AEiGo2KhEMUWHWBafRRT4xDJVIAAOdyli6aZ167XvnEyAdycwjHVePHclabectW7resoh9Xydqkwc0b0W3TIbI+IxxBMM9bhsnlmO7BBNVqw5aWGX9YQMjkuicn+c0m1mxSTRhb/zIIopo2NX29RJqRyrs9ntxCSceOIb/m6UH9bctXy9p1ROUBpwuTGlNTnwcAVAaIgqJS7twc1+2bUSNqWLHLHn3UuXUrEIRA4SuwftPHPxBaXZW6AgDYduyk4xJQafVdPedOy5pmVquryhumtnXlXjdtXKWf8tydXcUn+i7fNWvgeTRA1Hpv5lFqeZW6qkI6uKM3t9i/O6tSYMEMJWmX4b1wHo+JBgCQ3bu6t+6s/ZkEAcEwEhTB0mhAmL6QVSByqe4/rzpWbyv6vw8UA/oxnTvVHyqrE4Flfb6IPEtFRERERKoQi9zrgkxIRu+6CSA0I+vV333+woN9BCKXacY+KZ85XT/7JdiQ4Np6oHj2v4pfet/601r7b4e82bl8oDG6IPjLjPZdB8vmfgbZXJpnpz3Yzdx5CMuWfvFl2VffSDLa6SbNJA1x5asWy/v3reOYYSDqyROi35rLkxJBoda/NVc5PHRnGLp5c7pD+/xvPvGVR3S82XHtYsnSBZppTwd5SdDpaQCCbVuqLcF4p7vszU8wqUI5eVL1m+I495WryoBuQu5b2c6CPP0jIeSypusgZ34e771T7YRpdc7SO0eEeLcn8GSfc9dBPC0x5IbV0x513rztOHD8zj77d7PuP1hZLE+npnqsFuflen6XBF7ga54Z9Pv9bH5J3asAADBJyCYM186dDsxlBW+9U/7l147jJ4R7EkkCy9569/2NGzfew1oRERGRhxkxgtUAEJohlbW7Hj8YsOgoLDpK2q2r4PNZ9+yFAGCzzvsPnHJVVHA+FsExACDO6yVkMtKgx5KTlSOGV/kOPEC8t2471q5HEEz39CxcpwcA+O021mHXdulc79oqEIlEOTxs4XkVssEDeD9bsuhbPDpW3q03GZ8UZPsEAOA9HsfFM/7rly03byiGPkqlpNS+DzNwoGX1akQpw+IN7PVbtk27qaQkxcTxgTEtX14eqVIT+uoiJL/NKk9oFLLxMypVUEq132qp/AQQihF4XmD9EIZCBIEELMERBG0covciAADCULpvG+hGLujeHgCAxUQhOO69nUskJQIIwg3R7pzrTGp6yLWVwBgalI+GdDoAR5qhxuNj8Mkj8SE9XYdO2XfstKz/FZMwVKtWsE7HZKRDkdmFO3/fI4mJe+KJJy5dqsezVEREREQkEFFgNQDLsUP+B5QrYYuK/Q675+p1TB/Fu9xEYgKq1VSm0iAcVwzoDwAAA/oDANQAAEHgnE4IQer1U7hPLJu32vYfiBr+pKRlZvXgob10YsIfIeYABCmGPSbp3tW2fZft9y1FhYUSXZSfZaWxcY7iIlIms+XnC0BASEI6aFDslAkhxRAAgG6Z5snOBqevm1ZvY5KTNdOm1raocBzJwvQ1Srw9BXlQ+AguguOegtxKgVX5krNYUK0GxlDWXe3F4Cs3oVCI1kCVyHq3zn/hK2byyMpuRbBS4jhxkkhKBABIevW0r/u1zk8HQAjK1YxgQQTO5RWEmx8STKuWD+8nH95P8Pqcx84Cs83x2y7L+g0wQSjHj6UaN6pjred6tvXAwSYvB5fQiYiIVBGHl41S7l5t7vNXb0Tkb4cosCJF4HmhrFh637bX9kNHhMtXrNnZiqRGvNcL21yeogLuzDlHURFKkSjD4ClNEH0U2TQFVd09qgZBiCSs4fiDwnMzx338hGHSdCohwEVTEBznT8kGDfjjnouqVKqxYwAACq/XbzR68/J5isLjorH4eA2GEnFxoFZYqzaqEcMAANLwEzAA4KgauUUyNs5TeDTcfAhAiKz6hCZG0wLPAQBghhH8nMBxlXXuqFohsFy4m6BKKc+yVVEotEkSzN6pjicSE4zOED2FauwBwyAIqoycVY7AFOUurD9FGPpuBC7p3h4AIBn6CO9yW5ZvsvyylOvXVxI+NunIyqISq7PkIiIitak0Gj3qCO5/KiIiCqxIMe3agjAM0zoz3ATB5/MVFlXGJ8Jh/GGh53auevDwpFGTq06iVfag0QHgt1mcVy5yTqfnwGH7tp2cnyVUSthgoFu1JJs0gWrWOz9Y/DZb2bz50eOn1VBXAFhPZqEEIe3U8Y97dBUwQeAGA274Q6wE/GYLoa5xZ0laZsWW9Y68G5L42hYYgtNYqg4QZIIAOJsdi4oCEISQBFduQvVaAACvUXnPZYP+oZslc043BCPVaT6O4213+nPDNM37/bzXDRN1RSURDOesFvRuq0Qqtblj955I33N4YJpSTR3tL6ko//c8b84t9fjQxxe4gkK6U4/7f5yIiIjIQ4gosCLCW1biOHtCOf6pkFfd1647tmz1VlQAAUji4+BmzWS9e4aYdv6Cv6Qk7vlXEUkI0yYAACpTyDt0BQCA3v0rH+q6dtl7O9u94/fyRUsorRaLj0MbJTOZrR54ws5fXsFERdGNgiucvBdOkZ07PgBnir8aSKsWakaMIAShm6SWbF4SM3wqZajh+GrM+g2CESTgvCFK4FV9dSitxn9XYFEZzY1fZQUGmQJxHrzIBHjJQhY7pLh76pPngSBASD0/R1wq4T3eqpeYWu33eMI9rqGgeo1y+lOOxRvCTYAhiIiODXdVRERERKQORIFVPwLLli75nkxNpZoFG1PxPp9pyVJfXj7Vo52y/1SYJJzHz1kWrcMT4slGNUJBnN1evmRpzJRZ4dRVbQidntDpQbfeAACt1+MtKrSfP8UePlawdj2mUMiGPkq3CN2w5R5gi4thMjiUYj1x1Ge3RQU4HfwZCALncLDlFTCG+W02VCYT/ByqVSMMcz86j2zVyr56nbLfkMDBqFHjnNcuF65fgGsM2m6DCI2Oc7srju9237ocM2N24Ezez1U1AYS0OvfZy2R6UwAA0TSJjI8t/2qd7uXRQU/kbC7L6j2qV6pPerpv3FYMvWMH7ysrR0kqXFVZFQhB+kpK8Ni7dfQIgstkvlv5RErYwq8GQaY2tnF+99WrtX+3AQCcxwMh4kFjERERkXtBFFj1wfPmXxULRJEAACAASURBVFfg0XrVU8HfoLzXa1mwkLVa1K9NxQx3LAyYjpn+Kzns2bNBAstzI1sSE0fGJgTdBAiC5dgh3ufz5VwntHqvx0MnNyYMcYQuKlBPwARJJTWikhoBAFR2m/ngHtvqtU6ZVDV1CiKPVLHVAarVOsrLA92keK/HvHubpHfPSEqg7hOB41znL7gPH4F8XkdhMSGV8Jyf0mndFSZKo3KVlMEoyjqcklgDByCmX186tXlDxRbVKNnC+Y1bN6gHDw8cZ5qmghFP2k8cKf9tldtsxGgGIIh65FhMWaPlHwRBVabqaGKi7+TxqkuyScMtX/5smrdROWUQRNyJSLkv3674Yg3eJAmPv5OX9OXkwRBMZ9w5Nug+f57U16gJCwnKSIPsFQi1mjPV5TXaUAidmg/TfgelaT5kb2kREZG7iEajIuEQBVZdCByb/9WHMElo57wY9I3OFhZV/LhQ2jZNMWZqkARhHutd9s//Mo8OCexz4j1+Ek8JDjiZ9uzwXDgj8IKkUSquNCCEDDLl8lcvl+zYBCAIk8vxxs00jwwKejQqlWkHDRMGPGY/tKf0o0/I1pmqx0fc5zulmqZYUaRi+0bNoGEAAMHvL1nwjSyzVd2NcR4IpqXLnecvyBolQIlRTOc2ilh9VVxHHvBfwe9nC0tdWWe9e/cYlyxVDBks7dalAY9BUfXUycb5P8IKhbJLr8ArTNNUpmk9sUDO64XwO+JJ0rZ13voN0pLyyiwhGqVV/WOm8T/zHTM+FxBYkZnivJoHeEEyrD/Tvbo2y77kV2m/R6pyu64jWdKOwfakteFxXDCZagwpld7sXLpj2FrAhsI53XCY8j6IIDy3c0By4wf1LBEREZGHB1Fg1YXzzAkiLlY1pbogvRLe47EsXwHrlPRTj9ZehaqVhFLhu51LplRXT/M2G2GoUc7Ce9zmg3v0fUYoWgaXkGsB8Dts5Ud3+W9cK7hwRtK+i6JLz2BLJBiWdX9EwHDz3p1sty5YVEQuoHUgf2q0bcXqcrsVjTK4LpyGJbR0RP1eVveJ82iWL+emevYksmldfgEAAAhF8YQYPCEGACD8usubldUwgQUAHhsrGzncum6DLydbM/IphG5AGxm/1wPfPUwHEYS0ZZp32wH06TsmpTBDaz+Yw1lsZZ8t5AyxZEwc061dYJmUZdmvvNtHd2hf+dKTkwN4Xt6ufmsxCMV4vkbHZ0ghR6wVke+8bniHy2M0KQyhY2mCXOY4fohtE7qEX0RERESkDsQCi7rAEhPUz0wNVldud/l/vyLTGmvfmB52YdMk19mzgSOswxGUdTLt2qpqllFbXVWCSmTRfR+PGzdH2aEve/Vy/mcfmPbsqD1N3qm7ZuAw4/wfeZe79tUGQTVpon1ljs/t4BEWy0hTz5rxRycHrXv3mTZsVL32TL3qKgjF0L48xzqOn2zoE5nMVrpX52B6TcFXHxb/8mOVV3vdCKyP8/lQWbVbgWLMaMeFq66sM4HTEIUs+v3Zkj6dJb071VRXGz3HLignjYcrw1c8b1u1RtX/sXBxo6CHB6VCMX0UX2EOPbfhmH9eL23eHA1jn6uZPFHap9ft777Iysp6UE8UEREReUgQBVZdYDEhLAMsy1bwvJ8ZNaiOhVC0FjbXKJTh/cEnvwSXE5KpQX0o0jsYRs2SNG9jO3bIbw1RfCPJbIfSEuuu3+q9Vb3ANKV7fqZs0EDl4EFBsjIcvsJCzlGPn1M4hNx8umd7VFf/hxAMBOEx0X6zqf6ZtUDlcumIYYoxTwCvK+/zD0qXLfAW1WPd6c67TWnUNUviCEnvXubF69znrtSxkLPYjP/+jj17Tf3MVDzmTqG68edfBB6SpEeW4/N5gxpTIoyEu28xXYn70EnvpRtYRss65jDdujId29vt9gfyRBGR//+Iw8tejloRh0fU8kvkoUJMETYMy4aNgsOme2923UXWeFKsY8+xwBEEw3lfjXphLCHJf+NGhM/VdRuEUVT50gXRM+bUDiwxnbpZf98Ghj0W4d0eCGxFhePXTc7smwhByB57lGnT4KogT+5t5cjJ9/Z0we4g0vX3thYAQKen0+npbEmp6/iJspWLBI4nE5MkbTrRybU9sYDzVBbRqlXQoLRHdyzaYF+5zr5+l2LSCDwxtvpXQhB8OfnWFZu5chPdooVsyjSYutNu2bp9B5ubp588K8Iifc5iprp2CBxBlArO7Q03P0IEr6/iy8WQyRb1ymzsrslWOLRDBvft2/fw4cP3+VARkf8vEY1GRcIhCqwG4L582XHsmPrVZ6rqncMBk4THVCOPAxM4Z7cCjbZqhEpsVLBrC354h6pj30jCRRCMcmFSWrKWbSo2reWczspmO0E4z5w1LV9JKOS8IGhmTq82iL8/jPN/gJUy/advOA+dtG/ZSrdMb6g5E+t0IYp7OQLJe7zO/CImSncPawPB9FHyx4bIhwzy3r5t3bytfO1SGEEwpYpskYnJFZhGx3vcrotnbVcu6vs/X3s5mdIYn/NS2TfzHAvXekxmaWKc12rDGcaeX0SplADHdS++gGqq43PW7Tuch45oR43HVBEF7QSWdZaVympW10EIwvnu/WQfW1xmX7uDvZkHkaRy8sR61ZWIiIiIyL0hCqxI4X0+67pfJf26Ekn1Wy/CNB2kmQi93lNcSCVVH8giomMSZv/DtmPjrQUfUAnNmOTmhEaP4ASE4jCKCoIgcH4AIL/dwvs8lksnnTcvGp59KXRdFAQxUXpvzi06PfhfUbzLZd+0WTVtNJYQ4zl2tvzLr8nWmcqh9xvrcl+9BnhO8/ozAIal/bp59p8wrlqlGRfaEDwcGENzVgfM0A19un3T79KmKXj0vUewagDDRHKy7sXnAAC+wiLX+Qtc8W3H0dsQDLMul7xLJ930Z/DY0D90mCD0L88GAPiKigWvBy4qwWNjJDJpcFUTz5uXLvfczNGNnlTptREJpgO7SbWqVoEUFGH2tgqB9btOnfddvuk9fw1GUTwuVvPcTEx3v/JURERERKQORIEVKY7DRxGGlA2LqBeh4Hbzfn/gCCeRQMXBtT6oTK4aNQE+esBz+bzxwA0Ew9wWM4yinNcHwTAAAoygEIKQcjkPQdIOXTBF6GJkAACE45zFWnvceeYsqpBRbdMBAJIhveEojXnhGrJpU6pZ00jeSDg8t24T8TFVag9t3gjYG9wGG5VKfTdzMUPDvun9Rov99yPqsU829HG+wiLOYhF4HpHJ8LhYKJRUxWMMeIwBANDQwBpuiAYAEEkh/D/ZkhLjgkUQgGJmvozQEfeUFATv1QtIrWbMnM0ORxApFFi/K+uMUGF2HjrJuT0wTuDxccrRo6iGW4iJiIiIiNwDosCKCM7hcOzZo351Wv1TAQAAsEaLpGaBvKRzR+OPC0NmhhSduoNO9Vsi1Q0MQYgsRFNe/9mzZL9qOwO6XUtEIbN8uxSaOJ5s1LCzezUeRxIgsPjaz0J0XT31QoK3ae3ctp/p1hAXAJ63zVumHjSAyQwuiqqD8h8X8qVlfo+b0mmAIPisdp/NTqpVWHIy0aI5nfZHFU/4iootq9dwRrOsc3dF54ZZtpoP7oEJTDVyeNC4Ny+XTgwbQ+Wdbtu2vezZK36rHSYISccOskcfpdNa/KGNLEVEHmZEo1GRcIgCKyKsW7ZBJI7FRpqTYrNzBaLG4S88xsB5vfazJ6Wt2v4BGwTuinK85nEzAAAQBPut3OjmNYI9RJNEslOrigWLYj74v4Ymm6pAaMZxLUfi5yAU4cxW98mLdJsGvy+6VYZ1+05vdi7RuJbBfSgEjjP9Zz7v8TE9G9CB2HXpki83Vzn9SbJ546rgjeDzeW/kOrbudS4/xyYnI60zJeHbeDcYnvdk37Tv2MWWlGBR0Ybps1GZvEE3cOfmWA/uVjw5qna0iT19GmqWWHuJ5+J1Luuc+fhZUh9FZLbRdu0C1yd5ea/Xm5cneLzuq1cxGPHl5aE44Xc6sPR0+cD+DdqwiIiIiEgQosCKCD6/QDZ2aAPmX86mevepMQRBuhefq/h2PqpSU/EhEkmC38/7vH6rFSYJ3utDGBomqMiskoCvrFTw+6mU4FbNfrMZpajakS356CGgqNy6eaviXg8eSjq0c+7bZ37/GzgtxX/msrJf3waJnkpQuVz91Bj7gtXYO89XnbMLB+90Wb9ZCgFENydMIVrIVR6vfd2vyulPkqk1jgdCOE62aEK2aCL4/fZt++wbN/lPnyG6dKaah2jJVz+C4Csudl267C8sInnBfPWqxBCD62N1oyaiTIiwYt34zaaKtUuZTh2ZjIygS+bNW70mk/7xGYGD7tOXvL8fcecXyfv3i31/GEyF1lWc1WrdsxeVSH2XLqMwbC8oAACgBCmJjYMBBBli6fR2qFLFOR3u44dMubnyMaMRRcN0oYiIiIhIFaLAqh/O6XSXl6nSguVLOHy5ha7CUkWtBBweHU23a1u06Dtl4xTW7ye1Old+Hk5R9sJ8wPN+nw+lacDzGEWxHg8MI6zbBSMISlGUTg+kCswQS6c0r12GxbvdFWt/AQxdO9rhN5pgPPSPmHy0l/HzRfJBA+45eRT12iuOEyetm7bg0dH3oK4qoVumO3fvKX/3K83cGYg8rBbxXLph+m4ZaTCon5sZsnYqHN5btwACBamrQCAUlT32iHRgT9P3y+2Ll+hmPEMkJkZ0a5637tkHO52OU6c5nw8IAq5QIWoNltE6fsAIVHqPDSJ95aXlKxbhCfGKocFNAlznzruOHJVPGB6oL53Hz5kXrJL3fcTwzLO1PxmB9dv270fMFsvJUyhB8jwnbdmaSEqhGqUoFSpUrgi5B2l6Zt5XH/LbtmueGnNv70JERERERBRY9ePNzpEmJ0QaNeF5+0/rlMOHwmSIkIxi6KOSHt3Y0jLf+QucQY8qJXhSkpbAUY02ZEKH93h8RUWcxeq5ek3IvmjZsx0IAm2IASotIlOiDON3OdxnjtOZGZJBA2svhykKDbUNAADROFGSlmLbu1/ev29E76s2ECRp307S/n77qGhfeM66aYvxva+xDq0UI/vXyFoKgvPYWdfWfTDHK0cMY9o2PLsKw3gEYRgIQ9XPTXBfuGZcuJhu314xpC4XWQCA6/wFz+49rN0pad9FNWQkndwEJuqJwEWC+/bN8jW/kM2bKZ8M7ixuWrHSdeGi5vVnqrpHAwCcR087Vm/XzZpB1iqu9xUVWddt8JeVwwQp7dQ95tkXcW2kCW4IRZU9+/myL97PexEReUiIw8tGKXevNvepf6rIQ4YosOrHm5/Po5HWKjmWbfRUmLThZQeqUKAKBdU0dDxM4Dje5eJsNpiiYZqCSZJMTgYAMK0zAQAKAPwWi+vcea6iwnnuGMQLiFRKZGZIBocWBBCKBtlxBQKnp3i27AP3LLAeFAgiHz4Ua5RsWrnKe/gUrlESTZLcpeUMSZrPXUEpEm3cWD36iaoO0A2D5zzlxggTXVR6U370YMvitZKOHQL9q2pj37yFSW8b1SuiI6URYj64x3Lgd2n3bvJBAwLH2eIS+4ZfPWWlurefR6MCdiUI9tXbZYMGBqsrQbBu2+44fBTTRhmefQmVhz15WgeYUmXNLxAThCIi9SIajYqEQxRY9YMwNKIKnUwJwvrTWqGoPOadtxp2El4QHCdPeo6fhD1ee1ERxlCAF2AcZ+0OBMdwpRJNTMSbNaXTWgAAUIVC1iPSI4eYPgolCLakAtOH8JNk2mdYlmwQfGy9vql/AnTLdLplut9scWRlCRQFoXaQ2lLbpTsRH38/t6WaNTP7OX+ZMcKGPEynTOB0WZevUD83M2zMUhB8FquhU7f72VggnNtl3rHRk5ujemo03bJG4xrboUPOXb/jzRtFvfpG0IkE57FzAuuX3G0gXQnv9tiWr/QUFBimvYgHuNo2FFSuhO/1AISIiIiICBAFViRwThdfWlH3HN7tcfy01nHxesw7b4VMDoaDLS0rnzcf8BzZMZNqly5PiAn0Q+esdve5K9zNPNPSZXaZjOnVk27TOsLK90oQpdJ96AT2eIgEIkTgKEP7SorvU8Q8QFClQjFwQP3zIgeCMK3WtSdLNmZwhCuYPp2dOw85T59h2rYJOYH3eDi/HwgPZoOunBvla5ZCFBn16pzA3xze4zEvXuLKyVHPmUKmhDgV4Tt/lQgyMxME00+LBLcv9oU3gwJ+Asd5S4ocF89iag3vcstatUHqPtjIc6z7wXQ8FBEREXk4EQVW/UjatjGfP1fHBMfhU851OyQZGbEfvNegdjHmXzd6zpyVDunF9OkccgIil0q6twfd28snjfRcvuFYtc2x6zfJgP5BcYs6UDz1ZMU330oG9QxZ44XLJBD2P+mQ5Csutu0/iDOMNy+PaN5c0rljOF2rGDum/MuvmUHdQ/qEhQCCqP7drFu2hhNYMEWpMlrazp9SdOh6z/sHAHiLC01b1vptVuVTo6nU5oGXbPv2u/btZ9q1VLw0Plx8EbHYiZ69a6z6bbe/whT7whuB6sqVfZW9drniZJY0KpqHENLNuopu2w7vxaQyee8BTGp6yJv77XZG/4CM8kVEREQeSkSBVT9YlM5nc4S0a+LMVsfqbc7zVyXdu0kbGHrxFRTaDx3RzZ2JJ8ZUjggcZ1m2EbPabVduViYZmYQYqEki1bk1FqUhW6SQ76V4Lt0wfvOL79Jl1eSJkSQiMa0GUSgqPvpB987ztXNeXrNVYO+9sd1fgvfWbcuKlazVRmh0oGkLTGPwHj9p3bFTOXJ4SN2JaTQQQVq+WaqeO6P21ZBIe3e0r9/hr6hAw7TqE+Li7If2ytt0vLfKML/Naty8xpmTLclspZo+LVD7Cjzv3PWbde8+6dC+zIC6csH2nFzJ6Oo2hbzXa/19t2HyzJrq6lrRLwt0HXo1fubtKsMIJQCCny3Zu9G4dV04geW8eY3luHt4ayIiDxui0ahIOESBFQEQJOnUwfztL8oZY4nKZI0guC9cZ0+cd567QsTEGN55u0FpwUrc23con3q0Sl3Zdx9h9x+HaBzr3zZ2xmAYxzin25tT7Np1smLvUUmbdLJvF8wQRbZoov/wVcf8FbblK6WRlX5rpj9r/mmR7aslkilPwNLqbtBsfhHv9xNx9bdW/JvguX7DunY9zAtMq3aKzj0grDq047x+2bR5LfD7JV1CxAL1r79i+e5755Y9zJDeta+GAIZlHTJd5y7I+vQKeV3epxdcVGTeuUk1eESD3oI795Z17w5PcSGT0VL/yhxMV6NMyldQaPllKURg+o9eR2R1NdXhrHYEJ1BldWmg8+AhVVoGGVud7XVlXzNuWJkwehYdG5xhhFBM32dE9tXTnNuJUCEahPuuX8ZaikW7IiIiIveOKLAiQjH0MUSlKv9sIaGUYwztLjcKHE81bqR/7RVEFsbxSBA8N3PsR45KO3cikhKDKpT9FqstO9vw0rjKl5zFZlm5WTtjmKxHdQcYmCExnVLSMdVvtpd9tNzx8Q9R78+BpQwil8pmTy6d+6lv4WLNs1Pr3TxMkaoZz1Z8933Jax/JR/anuraFScJfZrR8u4xpkfo/0ZmO93jMS5a6snMUnbsre/arbUDPpKRiE6bnf/uJIAjSrl2CrkIYJh0/rujfH/odLvmYIRE9Uadkj5wGYQQWAIAe9ljBu+8jJCnrNaBeay7ObnNcvWg/ss9ns0k7ddSPG40Et3AG1u07bXv3yQb2kD7Wp94fivfG7aBSPMfBw8r+NWxjS1cu1vUeUVtdVSL4WUEAvtISKjHYsI01G90V5apuwR+jiIiIiEjkiAIrUqTdutKZrXxFRRAMMyhGJNbV3cV+8LBly1ZJlB6hJd5tO8vz8/SvzMGiqrsac3abJCa6Sii4t+3XDukaqK4CQZVSw4fPWlfttX7xk/S58ahKAeGY5tVpxn99x5aXY9r6D4tBMKydNcNz65bv0OHClVtwCcO6PerhQ5nOnRryGfwF8D6fdfsO75lzuEaX+MrbMEWHm4lrdYanZ5SvWkI2boTVqh9ClYqoWTPtq1c7f/mVHjM4MPoVEkm3dqVb9wOeD3eWEJFKY997x7FqTcGX/1YNGsE0Ta09x1OQaz9zAraaLTdvyFObSwYPoNPTawcd/aWlzu07fWUlqhljqYyIrOT95SYmvUX1S6PJ73JJW1Q7v7MVZTCCKNLC2oWU7V6nTMuora4AALadm1QD+iOSiPtSi4iIiIjUQhRYDQCRSGq3owmCd7tNPyxgjabosVOopMZ3RjetMf+0WPfGq1WRCba41Gd3VK2yHjge+/H0uu8sH93LfuySef5y7dyZAAA0SoM1jrdt3aGeND7C/ZNJSWRSkmzcWM7p5N0eTBu6wOjvg99kNv2wgHU4oidOJ/SGeudT8cl0aobxh4VRb75WW0IRifHYi8+XfPSp48xl5fPj8aS4Om4FSxgIgd3ZN6mUsC7wCMPIJ08Utu8o37CijOOUKc28bg+h0XqKCzAMs+behmCYSojH2reLmzIhnGO++/KVisVLyEYJqndfiLyiiz1zmQ/MBl64gCuUNRzer13BmNCxVYHnLcd/t1w5EzdjTu2r5RtWOHKyYyaNi3AnIiIPOaLRqEg4RIH1IOHdbstPP0MQGjf7rcAvS82jj1f88r3j4CFJ9zvmSWSTRo4dfNUEjCZhSf1VXFFvjC2Zu0DwcxCKAADILq2Fow2324YgRCL5m8cnBJZ1Zh0zb9qi7TtY2ilS3y8AgGbQsMLcHOuqNYpxT9W+ChOE4Z//cJ46bfpiMZEYI504HFWH9eGU9OjAXr9Rh8ACAAAIUgwaqBg00Hs7l7Pb+YsX+WgNzGB4Skq0Tosq6rJP42w287IV/rJSzZyniVBGDGERBM5oUT4Z8Aa9PknNcnVpZlvT79t4rwsmasT8XIU5JVuWUtHRia/8E5HUPFYpCJbft/oKbuuen9mgw7AiIg8zotGoSDjEP6MPEtOCRTCM6ic9E1xDA0HSAcPzv/2Eap1ZqWxQhYK1OziTpdLC1O9j2XIrIq9H9GA6JYTA7nNX6DZpAACYpi03shvcTPh/AdOyFVxpeczU5wlDA2vwISj66Zl5n/8LO36CCeOnz7RpTTRKdu7cVTL3M0mHDPm4YSGtECCN0rzsV1l9bXMqqUwZ0+mR/pG17tln37mLbtlM/cwsRNkwy3Tn8bM+hxNVV1uneq9eww01ctYIzVCxcbk/f8Y0bUXq432WCoj1Wi+f8ntcyj4DFR27Bf2KekuLy5Yv5DlO//orMB02DysiIiIiEiGiwHpgOM+c8RQWJb72TsgKZUIXpe3Q2X3oiGRAPwAAgCBFxw7uo2ckg3sBAOS9O3uPXSUbx9T7FCZWBzN3v/8EXhJXV57rfxWeZ2/djhr/DB4VfQ+rYZKKfnpm8aJ5gCSZlqFtCFCFQj56FNmxo/v33yve/BRvnyEb0Tcoq8h0b+fddciXl4c/UCNW19WrvoOHvGVliskj6fYZ9S+oBX/sgrJmcyRKocDig2Ng0VOec+fdMm1dj/odzqJCOrWlot8QSVpGUEm+326r2LDCV1os7dNL0rULEA3cRURERB4EosB6YNi3bFf06l+HbyfRqn3Rgq/p7l0rIwRIs6bGn5fQvTvDFIFlNi/7z3y6dyssup6OLo68EqnTVfn/3uu3WZstqNDGtv+A5/BRwe/3ezyytm2gWIOkfaSupH8T3Neve202tqL83gQWAIDQG2Qdupl+WYbXPFsQPC0hnpjytOvSJfvmLWXHz8mfHkm2qFljF6e3bdioefH5e9tGEILP59z1m2nvftnAHtrZEyJtH14TV9Zp+7WcmPETAwcdeXnypBDV8VR8UsyMlwEAIcOcvrJS07b1ztxb0hapujkvInUmNEVEREREGsS9/IkXCQlGEExKXUfASEOsukMXx9btlS/pFqlUXKxn10EAAJ4UJ+mUafl2k8D667iD32gDAqAz7xxYQy12KvAYIM87duz0HDgs7donatKM6EkzAUTYt2y3LVzkuX7jPt/dnwnVrJn+xedt+3cW//gV57Df201Uvfvrho4yfve9Nze37pl0ixZRb7xOd+5smrfMtf9Y4CXllCcgjnWeOn1ve6hGEJxnzha+8x5rKjN8/g/ZiP73pq7cZ69Yl27SzZoeZFQhiYtF6BB2VqH3wnGOi+cKvvxP6ZL5iF5jmPuGcvJEUV2JiNwblUajR5yhg+UiDzOiwHpguIxGweute460Rz/z0SzPjezKl4rx48zb9nlv5gEAFJNG+jmh+LX5nNkWbnnZZ6sgCXPnu5nnLcfOEImJVVfLFy6yHjisn/aCLLMdplQT0QbVI4Pi5ryN6BNKv//ReeTofb/FPw8iMUE950VYKbv92fv5n39g2feb48JZvr6PNwhJRhuycbPSb+ezJaX1Tpb37RM15yX7r79XfPRD1SCEosSwRyqWreAcjjrW1g1ntxe//y/bpi3qFybInxsf6PXakLtwjm37Td8tk/bvj8cG16W5yis8hfn13EEQHBfPWnb8evP9NxxH99A9u0W9PVfxxOOoKmyZv4iIiIjIPSOmCB8Y8n6PVGxYEfPca3XMgUky+snJ1jXr8JdfggkCVSg0kycaP1+oeXUanhirfuNZ05c/F7/+g2JCP0nXlkFrrav3wV5eOXty5Uv77iNMdDRuuJNE81us/rz8mBmzEaZGpTyEIIrufZi0jIpVi93nLmimT/ufcBYFAEAYppo8UeH1Ok+d5i0W065N5ZtWQzCsaJrqg2AmtSUeFY0p6hEH2qGjqKQmFfPmK8aMCur3VxtMq9W+8Jxx3nzXgeN09zt5VbpVqjCwp2vzZumTT97Du7DtP+jat4/pkCEZ0Q/cU18d3uN1HTzh3nUYYFj066+imhBJZKpLJ/hWQejlPp8754btyH6/qYIXeEnXLjFz30DVqnvYiYiIiIhI5IgC64Eh7d7Ntnuveet65cBhdSSAmGYtHMcOln/+EfabjwAAIABJREFUX92rL0MoSqU2l3brWvHxD+qXpxKN4lWzJ3tv5lV8sdC8eCfdOgVtGguTOGe2uX4/4zPb9f959U78QxCc2/dTGdXGpOafl1CNm2KK0F+cmEqjmzij8LvPTT//opo04UG/9T8QmCCknTsBAKSDBgKe997OZU0m7vQZz+kjJdevIxiGSWVUk2aIJkqSmh4yTSZpmcmayssX/RxdZz1WJaharZ4xvfjjT5FoHdEksXKQfrR3ycv/hs+cYzIbVpNuWbPWfvKUasZYqmVE9qGBCD7WeeQ0d+6q/fINUqtRjHuKSApr5UA2alS0dj1EUkSLDIRifKYKzmF3nj+NCZzlZrayeTMoWqN56gm0pvOZ32S2Hz6Cej2uK1cFjvPabBAEIxTJtEiVDRsKUyG6g4uIiIiIRIgosB4YEIZF/+MN+y/LC77+KPqZF5HwnuO6cdOKF3xtW/yLbMJYCMflgwbiiYkVn/woG9RT+mhvolG84Zv/890ucGzbC53IcZVWoHot2bebKrNFVXbJdewsqVQqh91pjeLNzWXLjfqxz9axPYRmYme9UvLjV86Tp5i2bR7gG//zgGEiOYlITpK0bQMAkAHAWW2uy5d5m919/IBp5yZSqaQyO8rbdw4qUVL27IcpVOYFP6lmzUAV9XgioBq1vO8jlh9W6T58pfI+EI5Jh/fzHj3aIIFlWbXaX5Af/fEbDcoJ8m6P+/xVdt9x5618SUKcYDDEvPUEIg/TjukuWJQu5p9veQ4dLl48n5DLWZdLnpoKpBTRuVN8/NM1PE4FwXnmrFBUZD2aBaMoHqXh0lIkbYfisdGwXAJ4gS0q8x04Xvz+v2RDBkv/9kb/IiJ/OaLRqEg4RIH1IEEYRvHMFPOKVflf/Fs9eIQ0o3XIaRCCGKa9UL7658J33tM9NwOPiaFSm+tfnm35ZWnJ3qOKp0eR6Sl4Yqxq5ngAQG1rLN7mMC/ZoJ0yuSrZZ1n/K6bVwQRR9/ZgklI+9kThT/Oo5s1g5p4qgf5mIHKZtFNHAADo31fw+exHstjLF3N2bVZ26q7o2S+wW5+kVVvbyazyb+ZFv/VmvbeVPdLbc+685cvFyjlTKkeIZsnm5RtV4TvnBGHZsdNx9pzunRciV1eeyzfY4xesh09S0XqqS2fZU+PQ+nRVIKhCLhkySBLg2hX0YM5mt2zY6Ll2FSCIpEd71eyniaTY4HwxAvAEAz5+GNwowbxkvbRTx/+VhLKIyF+FaDQqEg5RYD1oYFg59kni4qWKpcsFm0XWtVforygY1o6eBP+2zfj9AqZje1n/fliUTvvybPOmLY5fNrpkDNmvK90uvfZazmo3ffg9nZJCNrnrMC4IkMOpGTctkt1RCcma9p1dBw9JBvS/r7f59wPCcVnP7qBnd+LqVfbk6bxP/0/Woauq94CqzzDqyUkFX38kcFztXtG17gVpnp9pnveded4y+YRhAIIcP62TpqVFevRPELiLl1TPT0B19ZhuVOK+cM2//4Tzxi0yrYXh7bl1+7/fA76iYsvKVX6TiUiMVb8yFU+s37uV7pzpWL/Db7U+8M2IiIiIPCSIAusPgU5rQcx93ThvvvVkVuwLr4f+Rocgdb/Bsvadin/61nnshHLCOLJRsnLoo8KQQZbNW73bDph+Wi3tkIm3bIonxsByKWe0OI+eduw8qOzXV9K7V9Vt3Ndu+D0eXFNPdVEVTJee+V99xPTuFa473v86VLNmVLNm2LXrzs1b886cUA0ZKWnWAgCAMBIIQV3nLzCZoZtqBwIThGzcWNuatUUv/wcIvKJLZ9nwYRFuwHHylM/hUDYL0Uc5CN7tsS/b5Dh5XtK5c/TbT4X7iXBWm+fWLe+t26jP5yspoeRyl9VKd+tKNmmMSOty8uccjvIvv+acLqpjhmrEFJhuQFkVhKLuq9ekHTtEvkREREREpApRYP1RIDKZdvaLpvk/WjatVg4bEy7VgilU8XPetp87ZVzwE5OcTA8ZhEfrK4urqAsX2cIi59qdNrfb53BiEoaKjZEPGyqpTIrdhXc55Sn1nI8LeqKiSVPXxUtM68yQE3iXq+zz/2Ik6TGapOlpUONG0jat/+cMvqmmKVSTxubNW8zb1ntOHiFatsGjogEQ6LRII/mYVqueOUPpcHqLi6kmjetfcBdELmPi6m9N7csvNn/xExFtMLw1F5EFZwMFjnMcP+G/ctWbm+f3eqVx8QDB4IRkUqpB5Eqioow/caZ49VrD//0zXGrYcTTLues3rEmCZuIImKq/02Xwu0AQMrkhHRJFRERERAIQBdYfCEQQqpnTK778yrPo2+inn6tjpjSjjaRFhv3k0ZLPvqATEpQTxiFyGZ2eBtLTQGVrnfC4Ll2CPWzDNhaT4Nj5WziBVfbFl0STeHpQT8bP+bJzHTt22jZtUU8cTzZEZPwtgGHl0MeEQYPMGze6ThwqKyhgWqQ2tI0xLGEapK5A5QHA/KK6+0pa1mxz7j6iHjOarvVT4L1ey5p1jrPnpLFxcEx81MTBuDZ0eNK/dIFp6XLNlMm1L5mWrXCeP695ZRrRKLjPj/PgCZBXbNqfhVIkEWeQjRuK6rXBe3B5XGUVanVEKU4RkYeZSqPRv3oXIn9HRIH1IBAEb14B7/NyZhPTqlVgogfCUNWz00r+87H7VjaVVNf3NISiso7dmJaZjqyDRf/6j7xTB+ngQZFk8ej0dP54w6zGpa3amPbuDFuNxLKSJwYhChkAAE+IkfTp7Dx2tmLRYmmLVOnjI+stpf+7AWGo6vGRAAAly0J/Ssk2ldrcKgj+ChOqCe2a4dp/zHvolGrsk3RG8LFE67btziNZ0pRm0eOn0clNQi6vflDL1v6bl2uPu0+f8eflRn3wMqquUUHlOnXRv/eou6hMOrB9zLuTAC9YNx3xbNkrmToq6A7OfVny1Gb1F6uJiIiIiIRBFFj3C1tSWj7vO4HjmNhor8VmXrsBxnHdczMwvb5yAiKVKkc/Ubrq58TX36v3TBZCS+S9B5ItWrmP7i+Y+7biiZHSDvV0EiSbNC5atkJqMdfrulkFKlPgEqnr7HmmTa3wCct67Q5EViP+wnRoRbdKda3ZXvD2u7qpU8iUvyiUJQje/HyB9ftyc/GEBBjH8diYyI+5BfVy/uOAYJiIi7Ot3aGa/lTtq8avl7DZebqXXkBrxocEjqv4ep7gcGiGj2FSUiN5EEyQ9pycoFCZ+8rVsmUrot+fE6SurEt/dRw6qZkySNNrfNWHhicb8p75FL14nUyr0YTRsfMg07lzJHsQEREREQmJKLDqQWBZEP672XHylHnNOsXI/kyfzpVfWoLLbd91qGLefKJRsmrCnW8yOqOld/9Bx+ULkhbB/ux+q9m0dxfdqCmV3LjKhJ2IiiaGjQH6GPu2HbDTxfTqUYeMQBhGktmqZOHXhhkvR96QTpKWwZeX1x6HMYzWanwFJXh8jSoiiMCZcUP9JGFetkzx5BiqWdMIH/RA8OTcsm34lbfb/V6vNDHOa3MIN6478gogAGFqFd2tG9Mm8966+/1BSAb2L/9uPu/ywHSN4if3kdP+nHz1pAnB6ornK778GgKwfvrLkccIYRyndcHZPTYrSzVyAKqv4SnquXrTe+pSzEfT8dia8zkeEgBeM43ouXgdZxh5v0ci3IaIiIiISG1EgVUXrqPHbLv3QhBkeOvNEGXILGtZu141bTTVukXVIERTsmF96e7tjB9+b/xhgfrZO+4JeOeOxo3rggTW7Y/egQSBiorxnz9ze/0KWh8dNfFZmLxz1EvRsZskNb3oh68cp05HvTqnjn0qnxrj2Lq94OuP1INHSNLqPyIHAMDjk0zbf5WGKvBCoqIc2/aFjL7IHx9AZjQr/3SBtFNH5YhIT9XdD7zXW/jOe6RSjmY0lfTpUhmVqTw4JwWAs9ode7PYk8fzVq9RDhks7dHtT9hSJOAxMahMbvlxperFSVWD9p0HHFv26l56AdMGqyLj/B9RlNBOeLZBWTlvcSHrcgeOuM5ftGff1M8aU2Mex5V/tiD6zXHB6gqAioVbCZ06sARe4DjrorWyQYPE/KCISCSIRqMi4fgb/aP/bwgWE5/w4puKjt2sPy0WfL6gq85TpyUpSYHqqgpUpdC8PYu3W+3791eOMK0zeb/fV1bddZj3+XivN3nqP2JGPqt9dHKTGe9Q2pj8//7HlXOj+j4yRcysVwWHw1cQutNcFZLBA+lOHY1b11s2r2GNFfW+NTolFfA8WxqiC7K0fz/32St+oznkQqJJoub5Cd6LF10nTtb7lPvHuW4DnZKo/mC2YtTgoJwXAACRS+XD+spenyYfPcRzPMu88CfOFrZV9p+MeurT7K0CtqCk8iVbUGLftFvSt29tdeW+cpUtKVGPmtBQTSN4PVjj5MAR/mY206sTVLPpIed0YwxNZwQndh37z7pPXqeH9Q0ctP6wElepA73+BZ7neb5BGxMReXioNBqNw+rvKC/ysCEKrLogogyoXKHqO5jjQMnn/w26at+xC+vZLtxaRCqRzxxr2rjFl58PAAAwTKc2N+/ZUTXBee0SIZXB+J18EELS2keeULbtUbr8J9ZsrL4PRUnbd7UsX1nvbhWDB+rfnsvCfN43H1dsXse5nHVMhhCEbNTUsm5D7UuYIVqa2cry9RIgCCHXkmkpylemGNeuM61cVe+u7gfzlm2u27cUM8fVW2gl7d1R9fZzHM8Wf/QpZ7P/obuKEFSlYnr2NM9bCgDw5ReX/3ueevQoec/utWealq+k0zKDunRHgufaJUhZXXgn+P2mw0fpHsG/k5zVxvtYzuaqGvGbbEVvLTD/skv71nNkRrXHh/PwKdeF6/Ixo6s+cN7rzX3/3wsXLmzo3kREREQeckSBFRGK3gNIsoZJI+d08j4vlV5XE19Ur1X06ew9eabyJd2+LbCZqq4iEgkhDe6Lp27fR9GslevM8cBBKrkJikSUzIUJQjFmVNQLs3iPLe/zD2xZBwWOC/umevT13LrtKyysfUk2YhgCY66dh8KtxfRa9QsTfNdvuE417ABjg4AJgmzZFMIjKk6HcEz18hRpt7bGb+f5jcb6F/zxSLt3Zc025/yVtkXrJJmtqFYhWhlyVivE8+p+Qxp6c4FlPUYjHXBP763bhEKKqoPPOuAxejxGX/jSN2UfLbct3lH00jdFL3+H4JTypacDS7U8V7Ida3eonhpT1ROaczisP/4kiU+aPDmEE4SIiIiISB2IAisiyNgEe0FBYETHunsvhGH12m/Sg3tZjh7l7HYAANmkibO01Ge8U1oOo7jLFKLMXNmhr/HQfp6ttrbi/azP3oCoDBEfr3x6UtTsFzw5V279a67j4rmQ0zCVWjNkpPHHn3i3O+gSTBDySRNM63fYfwurscjmTZQvP21cvda0Zl3ke2sQvM/rLypr0BLpqEFwtLb82/nhwm9/JhCKaiZNgJs0QwwxkkdC14xb9+yjYuLuoeDJdHAPjKGovFqjOw8cxNNDHT6AYc0/ZmrffcHPIaxESfbqHPXx68rZT+MJMVVTPFeyK/67SNKnN90yvXKE93hK/v0RRDDRj49FUbFYU0RERKRhiH83IwImSRhFebenqtkITJJ0ZojqqyAQmUTaNNlz/QbTpjWAYVmjZF9RAa7WAgCIqGi/2y1wLITUiNBgchUEQUCornrxWyxUbEzQna07d/E3sj1l5ZzPS8jlsFRKdupINGmM3i3Gx/R65bPTsKxjlt+2OE4djRo3rfa3uKx1ezYvp+TDT6Jeexn5f+zdZ1wU19oA8DMz22d7gaUKCCIqNmzYFWvsvXttMc303u7Nzb15k2t6TFOjSWzRqLHF3rB3UBGxgI0Ou2yv094PKGXZMkhTOf8P9xdmz+yc3XVnn3vOc55TfftnjlyunjXDtPkvQZs4bliw11fHDQlSzJ9kWbfDEd9K+OCHuR6JuySVnjpNmT3LRvinXDSz7L8/2k6dwXv28N+StlrtmVnEvXuMwYgGaWiGEca3wiQSbmhIfaV4CxNaAwDwrl18NcAoEo2ofcF0hiGzsyRPDat2pKBQNmqKzwspZOoXZ3t9yLzjoOPgKeWY0eLevcqP0A6H6ZdfJfFtVOOmwf2eIcgPWGgU8gUGWGyhHA5pKOOJ7gc61O07SIyWzYlIm5aOo8fwpM4AADo42HbpgjixEwAA4fFQHteUlS5vV73SFUNTJIFUmRO0Z1xAwiuvRZnN+qXLAU3xU5JV7eNRoZAs1rmy77rPndZv2IjHt5KOGcVV35/lEffoLmzb1rRmbd53n4W/+DZSYyhCNXYqsmNj8WefB738IkddrXaAqEN7QFEl//0+6F8vcWsU+77fpksiJ0hV+tnP4jt3FaNrPc/lHzc4GG/btmzJKs37z9fiNBSVzJtY+smPgtatMKX3Up8AAIYgCj9bLJAredFxTFAYQxBomd6dd8RWVEC6XBiPJ9RoXFYr3qkjSZGixHZctbrmStK6I3LzRYkhtT3LcOwQ4XIqq2wUaLt4mWEoXmyLWj0P7XAavv2dKCxRzJwhjL9fCouyWgv/+6mkFYyuIAiCHh4MsNji8HgVCekAAA6GoiGs9lfmt42z77k/0caPbem6fbfiIWmXZDIvG1QPsCzZmZLQsMoRFIZxlxQpRgy9/xdN639aBsQC1evzKuq882IieDERYEhvUV6h9a/9xV98rZw0QZTUufxRTCJWPruw7Odluo2rNdO8JNMoR00CfEHh/z7XPPO0ILbaFsWizp3s5y841u/ivjzb128tLzJUOmGYbftBUftEflTtfuADwocNtXz+hf10uqiH9419vOKGa7kapeXIcfm40b7a2PYfxMMiNTOf9jiuBoChKMKgJ8r06I0sQKIgN991N6/k3l1pZAQllyumTKrHcvZckQgViWp1iltXYj5xWD5lYtVPhDh3TtA7yc9ZnhjGfjLNsGYbHherfOetivFLd0GBadVaWWJH5WjP8u4QBEEQezAHiy3C6QRo5e+ZW69Dhax+ZXkhQW6LmXa5AACCmBhLXm5FepC8b0rZjQxXaUHV9mUndgu7VhbRtmRcRDgcfov7pSDLfl/NkePqd57xuosONzxE8dJs9TvP2A4cKPj3f5iK1fUIIp021XrrpjXTez6Wcsgo7bS5ZSt/N+7c5fGQasE8ymI3rtzo5zVKUnrKFkwuXbrcnnHFT7OHwFHIg158wbh6m+PytVqdKJ483Hklw9ejtvSLpmPHlWOnen0UwTCeOghvlaAZOV6VMjx4zvPquS/EfPAp3m8YYrIW/ef/LCdP1e5l+EaRJGn0XhHDK4aiStauELZJqLrNjuX4CUtOjmQku0o8DGM7fr7gxY/cqeeDnn9WuWBeRXRlPXuu+Jslwvh2MLqCIAiqIxhgscMwlNuNSarOECHlu/UFhmFckai8jBYqEmJcLvHgBxXlC6TtO5svpFa0LbtwFCCMOLFzxRHLqVTsQXTluJntyrklnj3e/8QNLzJU8cELXLnU+ldlFQaOXCbu0Z24ne3rLFFca82kmdajx22nz1Q9jqCoZMJ4+4VMUlfm61wAgDAxXtChtXXHToao3c7TAfFCQqRDh5T9sIbILQjcuqI/CbFus6U8rq3JdTmDHxGFiSXsnxDBMFFMXPCc55RDRhq3bKNqs+zAD1SlYEjW7xhFlW1ew1UpFNMrQ0PSaLIePCSbNhrhBM4bc165UfT6p659JyUDByoXPV8RuDMUpf9tlfXv3eoR4xWDnqr964CgZiqCV/J68B8RvNotx4GaAxhgseLWlWA8XtV6AYTViggFfk7xQD+ouC0ICrLn3Kg4rhw+1nAj4+7qr6y3rub++aPu5B7ZsNHog515SKPBWVKsHDum/E/j2nWCXp05wZWZUo4LV3SfLzd89nPxO4vtZy/RDmf5cVTIV771tPPu7ZIffqpojPdKNmWk++mkKDY+/PnXzbv2mHbvqXqcFx4miIww/7HD/2tULpzKjwnT/1L/NZOk/fsqp07Wf77clXM3cOtyGCZQKZw3bnh9kMzLlyV7KUnFhqRTN0Xnbmwqk7EiV5D5uWwaMhSVv/QbR3GhYuGCin2BKJut5KuvJYN7ifv6LMlWznXjTuFLHzvW75IMHaJ+/VXZoJSKMN1y7lzxJ5+hFrt23vPSzgH2voQgqCpYaBTyBQZYrNiuX+UpqpURpwkCk7Dd+I+maOzB8kNMo6Zs1oqHEC63xZsfccMjivZuQETCyFffx+MqCz9aM9LFcbGoRAwAcOfmAQDkEx8sHGMY+56j5tVbUCmP36s1v10L4tCJkncWu+/cr/mO8HmSWeNc93Ip6/3LcTUawDBVr14TV6lWj5tmOni4/HIVJE8NJ27nB6x9gE8d6c4vsF/JDPym1BKe1BlP7qn7/JeKFxgQT62k7Z4VKMq5zWZ+aPhDd0bQoQut9zeexx4vLJRx+PtEytEOm27dL5hIEPT6qxX5ebTNZvxlJaaQiYb63SOIYYy/bjb+tFbQob3qjdckyT0q64g6ndZt202btwnj2wbNeY6r8r6UAYIgCKotmOTOivN6Jiemyp4kNE25iYqSDQEQBOVyouL7hQYYhZwqqlbbE+XzNWMmgTGTPE+kKNPJVPWz97Owzdu24wN7VFTeKvnXNyhNhSx+hqOqUgnpzFX91yt5rWOVz00HAPBiW0i7dzRt3qL8x6zyBjyp1JWfK2qVAHwTxcYHPTXW8Nuq4A/erfgl5ke1QDHMcfm6sIO/2qqoVCzo08W8ZZuoXeAaFrUlGzGco1GXfbVSOmusqKvnttk1MTwOWeYlvYk0GABA2G+MXZMgJMyh1wOKClgILfBTtYzRr1oDaNrPZtXuksLiVcsxtUr9wrPIg2buvPzSn5dKB/RQjPOyoWQlmtb990fG7tS8/BJHWa0GqWn/QfP+A/K2HSJfex8T1i7RHoIgCPIPjmAFRjudruJCcZ/eFUcoq40jFLBcwe66VyhQqioac1QqlPDc1tAr240snkzKCw8HADButzMvT9jz/jIxorCUNlmC/zu/anQFAMC7t1E+M8p55Tptuz9yw0vuRNy7V9GAIxZTPtKSqpJ0SUY5XPvVq1UP8sLCyCIvlVE9yMcPpVxOQhd4P8SHgHfrKh46uOyXPx3nLgdsjHC5XstZ0U4XF69bPIEg9VXGFBWJMD6ftJh8NbDduFr028/89u00Lz5fEV0RpTrT76u4UWG4/+gKAOvuowjFBL31RtXoiiGI0iU/OE+f0Yybqhw/DUZXEARB9a65BFgURV28eHHHjh0ZGRm13blWf3A3HhfHDaqcPSGKirkStqUv7Scv8OMqax9w1Sq3ycjmxNJtf3IerBQzHz8pahGOKe+HU9Z122XDu2MSL7+L4u5tZD3amtduK/+T3yqKdDjdRfe3HEa4HMoeeEIKIIik7yDbrmqZWECppB5sXewPhuGd2lgOHQ7c8qFI+/QJfv5Z87odpkA5YYzL7X2EiSQAqFN5J0JXysPxug9flRNoNPZb3hcf6Pfu0G1ZL+rTWzFhXMVB2/kLxV9+JRw9UP3afP/P7Mq+a9y2XzF3TtX6Z0RxcennX3F5wpBnX5O061gvLwGqu7rco6AmVF5o9KSt/istQ4+7ZhFg3b59u2vXrp06dZo9e3b79u2Tk5Pv3LnD8lza7XJkXuT1qJb5S+hKOQrPbQR9PsP1O9zY2Io/UbGYdNj9tC/nuHsL5WDylAHlfzovpJHyyiVvzjt5wl7tfJ3L751I3n6QN40ggmA1WfpgPAnFAM1q8AVPSHQUl1TkbwEAEIEAJUg256KxLZCSwGNdD40fHaWcO8d27Lx1/U5/aWFuAhV6mcZFhSLK5axLB+x3cvhB9ZauhIrFXqNe/e6t5gunlQvmyoZUbrNDlOosO3YKeyaJegWueuW6cEXcoX21sSu3u2TJD9yQCM30+ZiA3Rw31PDqco+CIOjR1CwCrOeff95oNGZnZxsMhqtXr+p0ulmzZrE8t2j1LxyVUtSmWtISkXMLaRnB5nTH5Wu004V3riySyVEoiBp7/9Vk3LtdOmxIxRgJY7fJnupf/t9kaRlgGF6o2te5woRIZ5mxvDAEAACTiQldlc2PUVaDNyiXy5fJnDduVh5CAMt5MUGrGGdDBlgAAH5Ui9AP36PvFZf+6xva5j1gpcwWrkZV8zhHpSTdbsoZ+FPwxX7uuKDKlHEduUxGx51b1Q4xTPGqZe57OZpFzwmioipb3r5d+u0SyYQhipljWD1z+lX8we435cp+WSlr1SZo4ox66DdUf+pyj4Ig6NH05AdYDodj3759b775ZsuWLQEACQkJH3744fHjx/V6fcBzKZvVXVwgm+KZfk7cvcuNZhVgEccucFu3rpqthQoEDEUxpL+hIHdJkUuvqyjFzlCUy2zhht4vHM8QJOq34hHCwQADKkeqEAQ8qLTEkCTCenaMr9RUHcGiXS6GZXAmxUkWQWQFhqIc166Xrl1n3P63bvkKy6nT9ouXmUCzJCiOy56eT7so4+crSJ2XZHa32YJJvFW6QhChUunIuenlIRZsVy45jUZBG38LBWoFRRCPwSTdnu3Oojzliy/ww6rtQWnft58TFiTs7XNnw6oYknLqDfzIyn+o7oJCV36B7Klxfs6CGl9d7lEQBD2ynvwAy2w2P/300ykplUWubTYbAID0G+KUs1+9JB81khdSbas428XLlMst6hj499V5Oct86ap8zCiP4zyxmDT5K95dunmtpFu3ilrtZKmOLxFXjGZxtWq33cH4nq0jiss4IgEieFBonqQq1jACmsZYb8yC8rhVc5UQixUJ9jIg5AXDsBwnAzRd9tuq3Lffc+3Zj5odGCZCuCLsTr7pry2F//x30aeLHdev+zkbwbCQ998RdutW8s9vTFv2VesCSZI2ByfI+3ZGaHSUMXWP14f8c5cU6XZuDnr+2YpaZXXH2OzynpVFuYwnj9qvpKsXLvDYkMd08DBqxBXZAAAgAElEQVRlNqteX8DyacniUr5MWjVRzLxlq7zXAJRfi/ptUCOoyz0KanKw0Cjky5NfpiE4OPjnn3+u+DMvL++7777r3bt3cHBwwHMZhsaTu3scdKenc8KDAy8hZBjH9kOSvn1q7luHCYVEmd5XzSFXQZ67TK/oNbviCOVwVCvSjaLCILXt5BVxP+8ZyvbTWbzgyglE0mjmPqiJSjscAGWbmk3ZbZyqcZLBgLYKZXMibbFh3nby8Xx+i8W48jfK4Ypc9KbHuyEbOZE0m0r/3mxat8EsEqnmz/XYiLoqvHcviqat+w9yeFx8xP2sNaq0jIOLEB+1D2TDhhR//pXj3m1hZDSbV1TOrSspWPmjqF2bigLodWfPvEq5Cb6mcjNv15U08ZDBvAjPIVL3uXP84X3ZlGsvRxnM1T4FhrHfuq16qkY1EKip1eUeBTW58kKjp6w+k2KhZuvJD7CqWr9+/WuvvSYUCtesWePx0OLFixcvXlz1SKdOnURdu3oEUqReb7txQ/vZWwGvZf77MKCBYtSImg9xQ0KchfmiOG8FpRhGv/UPxfixXE1lhIQKBB6r3sQzxxpXbMCT21YtLl+OsrtMO04qX5lXccRZqlfExd1/lCA4cgVgx1aQrxlbOfzmLC1VJforglXBdfOOKCxQKEZR+mW/oDxR2HOLvJaA4khlIdPnMSSp37O95Nsl3MhIzYK5vuJaad8+eIcOJd986zyXgU95SpAQ67pbIPQxfAUA4MjliqmTdZvWhD77GsuCWKazJ02p+/AeXeWjRrJpzwZltZr+3KSZOANUrPJjGHtJcWinDh4t7RkZbqtVVZvtnBmXu2KTQQCAOz+fJ5Xy1LXOzWcYJi8vz2w2S6Xs9oaC6qBW96jExMS2bdvm5bEtvQs1KPhBNC2LxSLxmhPSdJ7AAOvQoUNDhtwvDvT2229/8sknAICcnJz58+efPn160aJFH330kVjsWWRh0aJF8+bNq3rk66+/Pp923qOZ/cBBQVw0GqiGO+MmbPuOySd63zSQlopBwb2axwEAptPHKLcb71otyQYTCtxmC2CYimcTtI4xoljh28vUb06pmu1OFOr1X/wJeFxe1P3cHffdfJTLq/ihJe12hN3cFmW1MAzDexAnUWYz6XRy1KyCM/L6LUYaYJWldd8B4CZDFiz0U2ATAIBwOOqR42W9B+T//JV59VrJtCm++o/JpCEfvm/Yut3w01rFC7PIohJG4G83blFiO/Pe/fk/fqmd8yxP7TMUAwC4dSXWw3uM167KJ4yVdPcc0awL3U9LMbFEGF25yJQhCIokUdzzH5jzzl2uWsmy9Fo5ymqrmsfmLirm4mxri1SFIEhoaOijdud6rNXXPeqzzz7jcDihoazGlaGGBj+IplXzK9PknsAAq3v37hcvXiz/b41GAwBIT0/v379/cnJyVlZWdLT3KSGRSCSqnpzErfFDbk9LN1+6rP0fi+GrjXt4CgXeqZPXR6X9+hUt/kJNEB6xgjn9XNnB3cpZMzx+RzG5nCcRu+8V8FpUpjxrP33Dlnqm8L1fRLHhSJiKdrk5Nrf50k35hGHKAT0qmjmOnBUnVW4dTblcXHYjWKbzp2Xt2lbUT7JdvCRtE+c/GLqPpp1XstXPP+uniTn1qDn1aOQr77J6QgC4ckWLNz8y7thY9H//07y8iCOXe2+HoorxYwGKmn5axwh4goQA1eS1b7xqO3W6cMX3/IgozZjJWPX4gyHcxjMnqLu3zLduKoYPDZ81lWVsypL54GEOgwQ//VLVgwiPh3E4tMPhUWACoWhOXIvaXYABXFllVEQ7HDwluxS6GlAURWoT20H+1e89CmX3JYIaGvwgmtYjeI96AgMsHMfbtaucDqdpevLkySkpKZs3b67jB+A4dZoXF4UGKgLOUJT9VJpqwTxfDThKBcLnl21arZw4E+Hez5Ixp50p27tDPnG8101maBSz7jpSvgHOfSiKD0zmxcc4Ll51XcigbU4sJVk1oBc/rvLuzBCE/VyGYsa0+3+63QxNozx/4zoVnJkX+T0q9w92paWjLVlt3mfencoggBvsc0yIdrnsqUekPfti4loMiiAYphgzxf7zV9aNm+UL5vkZy1GMHU0PGVzw3/9zXLhA9Erm+p4oBADgyT0wjdq4cfO9bz7liXFRaAThcnJ4fEdBnstiRrlccf++YXNn1EykqyOGIK2HU1WjJlYtAVqOIxK5CwsFVbdmKk+ec7DaAKACZbIwbqLKn2aEIPy098WRn3vt2rWHOBHypeHuUVDjKy802tS9gB5FT2CA5eH48ePZ2dmjR49esWJF1eMzZswQeqtC6Yu7qNhZUBC8+O2ALe0n0/DwUEGMv+zp0H99YP1zc8HPXwvbJ5HGMlBa5NCVKmdOF/pY/K9+ZkHpN99RJgsmqxaUcMOCuWHB4EFmtwfTqq0cqaSiiBdpNAp8jf1UZ7t+laFJab8HS9to2lVUrJk/PvCZNO06ck4yZLCfJqZ166Wt28kGDvPTxjsECV34SulvP5p27JSN9pcIhYqEeHAQaBNd8t330pEjJD38zesJYmO1777NOJ2OnFu0yQz0OjQkBO/UTpPYrn6HrKoq2/AnHh4hbuNlR0VJfFtX1jWPAIsbEmI/cbxWl2BoGtNUZlxhuAh9qCnC0r//yhqQ/BAnQizV1z0KgqBHypMfYJX/n++vvvrK4/jIkSNrdfOynzrNj4lEhYGXuBPnMpCwAIM9CIpKpkx0b/qLBk7SbsIHDVC0a+tnVIarVvPCw6zL/5S+Osfr/no1OdKuONIzNS+9WNmxUh1AWA1iG3Zt4bVLqOiP8+49TMDjhmn9nwUAsO45xqCYpKfP32PT1u3WrGvqtz9m042aEAyTj5yY+9NXeM9kP+sKAQAug1HWLo62OUzbdiAMI07u4acxAAARCERt2zxcrx4CcecuP8nHu6RUuy+eASOeqnpM1K6Nafdu2mYPOIBagSnWkVjlv3DK4aDMPnc89IV2Oc25d4cMGXLp0qXanguxVF/3KAiCHilP/pzxwoULGW+02sDhQlVkdg4+oj+blkRhqbj61jreIYhq0gTZyBGahQtEie0C5i+rFz5NWh36fy9x380P8MwMY9yw07Bio+aF53jaypXelNksCg08zWc4ehDhYPLRVdYPpqfjvbv6OaWc4/J1696j6mcW+mpg2rXXffVa5CvvoSyKOPjCCw5RdOhsOxZgOIdwOLgtwhWzx2k+fMF68GDpt0toZ+BdrhuNQCrlh3mvVSvr1ou02tz5BVUPctRqeedO1r9T2V+C4ySErVpV/MlVq7m1r4Blu3lNHtsSr5F0D9Wj+rpHQRD0SHnyA6x6QTsc9pISfmzgLGNKZ3SZTP7zfh4SimpeeYkbHqn79GfDt785M65XzbC530+7w3r4tP5f3zlPX1LNnsmrXgecyMt3U5T/i7h1pcajB6STxlfNDXJczkBbBFggQ9vsxhV/clvGclTKmo8yBGn4bZX5cKp66lyOpK6r/fkJ7R2XM/w0oMxmAAAq4AMAuFqN5pPXAULrvvzKkZVVx0vXF5teZ8tI9/oQgmGYTGHcuMnjOLdzZ+uRM2QJ2+re1pw7aJUtyRmCcBlqXRnceSOLEsPoCoJ8goVGIV+e/CnCeuEuLBKHadkseXPfzRNptbVaTl8LKKqYOhkf0M95OcO2fpeuVMeXSzm4COHzaKebdjhdRpOsVRwnoY3mqWE1+8AhKSyqpZ+nJ0yGwpU/KMaOFjyomwUAcOfmIhgq6uxvRR7tdJm+WyVLThY/5SWzynn9hnnrdlwbFvX2v+slW1zUslWxzcbQtK86okRJKR5WWX8f4XJUH7xg3rrfsO4Pol8/6aAUr2exRDudluMnEQRxXs7A1UrL7buS1q0cVpuoaxeR33neqjQL5pet+JV2uby+IcFT/pH/05ceawkFcbHSfn11//eT5uNXMGmAbCoit5ChaEHLykQurlZL1UioDwh12ES9A8yuQlBzBguNQr7AAIsVd34+xbDa6diZeRPIApSAqiNecDBvcDAYPIihKHdBAWkwAAYAmuKFhGAKhZ8IxnXvHq71WYKcsllLfl/KDdHi1dOVbGfOckKD/MQNjJvQfbyEoYFq+NCaj9ovXS77Y4MwqqV8/PSaj96/tN3GstpnufLcc9psxnzk7Lvu3qNr7EwtHTtYlNyp5D/fu2/cVD09v7YJ7LTdbr14yXHkKGEyAxSR9uvOaRPFxETiHWNpBGHOZRg3bixbu042ZDDeq2fAOJIXEY5KpWVb/1BP/oeXUFgm5ymUlh07ZZMnVnsJw4cS9+4Z/rdM/vIcTpCXkcIK9u2HhC1jqj4zgqIOva5WLxkAYLl3R6YcXtuzIAiCIBhgscKRyYCCVdjE0Rm53Rvp//EjGMaPiODX2FPFJ5oWtojx+oj91s3SjatlfXrjQz0XADouX5H+w+f2wJTJYvnpD1FUjGTSBI9AgSYI46+/u3LzQ+Y8J/CWb0SaygyH91MFubbSEpokOXy+olNXRqZQ9OrvfxyIdrkAgmC+A1nG5eLGR9U8zglWa//3lu2PnfrvluDDhgrbBiiUBQBgCMJ89Dhy764xM0vRpT2/b5J6YE+E75lDhvdMAgA4b9wmj5zL//Aj2eAUacpA/0OemhdfKFn8RdHq5dpZT9d8vUGznyn48UtwKFU2sH/V46pnnjbv3lv8z69lE4eJU3p6faOcV7Ndt+4Fvf1m1YPc4CA60ASxB9rhYChKwP4fGARBEPQADLBYoZ1OR2FJwDXujMttup4TOmFioIZNw2kwYALPNWgMTRsO7jGeOSbp16dmdEVbraTDIergfYccskRf+p8fuGqVcsokj196Z84t88bNACBhi970OjpFWS1Fv/1Mo4hy2hRVVBQAgNTr7ZcyTHv3OtLOcEIj1CPGoz6WUNmuZ3KEQj9BGJV7jwnxPsCD4iLJgkmGlRt1v68JfvVlXoi/PGL7xUuWnbsIu102dWToM5NQv6XhAQCCVtGgVTR3QDfjsg2W1CPSYUPFvXr6msdEuBzNG68Wf/Z52bYNytGTPaIxTCgSd+tl2L2HHxkhiK02sSsdPlSQ2Fa39Bf77qP4+MGirh0qd0xiGHtaZtny9bLBg1BBtZR2VCgkXS7K6cQEbFPd7XeyOSJRQ813QxAEPdFggMWKIC7WsntPwGbWExcU7dpwFGw3+2tkfKmUJlwYuF9JizQbzWdPObMuUzQZ8tbrHJWXqgfOe7myVjFeR2JMOw44Dp2Rj3wKr1EBwZqWbt68Be/QRT1stPchloLc0nW/Snr3xAdXpkNx1GppygBpygD3vVzz9r/zlnzGj4hSDhnpsQ807XAY9/8t9VsHiy8SgTh/dcgU8ybx27YqW/aLbOokYXx8zQa29IvOI0dcZQb5/EmCRC8N/F09Nip48dv2Mxepk+mF+w6IB6dI+/T2+j6gfL723bdKv/2+aOUPwf941mPWUtFnoCA8svT3NaI+PWXVS4vxwsND//1Pa3o6ffZS/u9bpNERFAB8lcKcdVOgVCnGjvFSKQNBBDIZUVSARXkfxazJdvE8v8o6RAiCaoKFRiFfYIDFCkcuJ622mnU+q6KdbuvW/dKhQxqzY7VCo4j+j1+xFi05AoHjeqazTM8R44qZM/zURHVeu04ztMdB2u6wb9hlPXtRNWO6qH1itccYpmzNOtvljNC5zwsifC66NOzagqqUVaOrqniREepFz5FlhrJVa3J//JKvVOFdknnqYITLcdzOsZ0/icpkeEfP7ZCrsuflCxP9pfMDAETdO1hTT+lWrY34xLMol/nIUePfu5QLpyo6s01a9/b8HUH3juiJC9bNe20HD4uHDJL0TK75bAiPp3nt5dKvvtH/tU495R8ejwqjY1UjJxRvWoM5nPjwoUjV8hYoKk5KAklJErfbnZtnu3IFadFCFpuAJ3Xy1WdUIbdcvSRgF2AxJGm/lS0fP7YWrxmCIAh6AAZY7CCIvEOi41KWuK/PAlfW1Vt4arWkT+/G7FetaN97x34l03Y4FYlvxevcQdWvb+Bc7NAQhqlSPookbUfOmDbvEye2Df/Pv5Hq5axoq9W6eQtiskQseovre9s769XLjNOheeM1/5fmKBVBr7xIu1zmQ6mMobg0dZ84JMRhNsumTxW2ivN/rkCjwZSBc+aEcpmwlZfiouTFS8oFk0RJ9bAsCO+VhPdKsqaeIU+lFR9OxYcMFnfzrCiGYJjm5RdLPv+ydNufmjGTPZ+hTWLUmx/pt/xR8O//KqZOFiV69grh8fgtY/gtA4dNkqeGWzdvYdlz0/HDsrYJ4m5dAjeFIAiCaoABFlukQknsO+E9wCJJ82+b7Zk3Qz54r9H7VYl2OEidniFIymbhSGUMRfGjWnjM7onatfW616HP5yRIS3om2jEBcDDqbr5lz1EMx4MWPc8LD/NoSVmtxYu/wHBp2DOv+Kk1TzudpVs3yMeNQbis/u2hfL58+FAAgHjSeAAAywpaTr2eX1giaOdzest1447r4Enzxashr3umnbmLi625eeIbd0Rd/Q2S1Yq4f3fQv7t5d6rxry1kZpZ47CiPeWSEx1PMnln07Q/KlOE1t2hEhULN9HmiG1nFa1db1Srlgvkc+cOsVBXEROtNJsuF05KkAOswzGln9UcPhLz28kNcBYIgCAIwwGJPPmyI7vJlx+VrwvbVMr5dN+/Y1mynSFL73jtIHQqUPxyiuNieeZXOumbPy6cpisMX8KRSmiRRDsdlMtIEwVUo1C+9gInY7q/iQdqnlzsri049b83NwxNaq+bN9Ui4LufKzbWsXa/o2lPa30ulhqoMh3bxg4JqjuLUL0HHjsBs9fqQ+16+++BpS3qmqF278P98hNbI+OYFB2tfedHw6+82mQQfObAeeyUd3l8ysGfZj2v03/8onz2T36LaFCovIkLZp6f19FHZoBFeT8dbJUS9+S/Tkf2lX34taNNaPnFCrbdKRJCgF58v+upbhqKl3Xp6bUI7nZajBwxpZ5STJnBDQry2gSCoQgSvZLLi4J+GOlXXg55IMMBiC8EwNCZa//1qxfB+nDYtaafbnXOPuXbLcjtXPX0qntS58btEFBUVfvkNHhaOd+kpHxHJq54MDgCgnY7itSvK1v6heXr+Q19FvXABAMBn6hkAZJmhZMmPkrYdAkZXlN1mOn8m+NWXHrozLCFymeXvv0VD+6Li+5ElqTdaU08jObnm7NvihISQ995BfQedvPBw9csvFS3+3HrkrOK56bwYn8XDat0xPk/16jzH2UvF3/2gnDxR3L3agCi/V8/C/30hGzjcV30HlMdXDB4pSuxc+ueqksVfKp+ezw3y/ND942q1Qc8t1K/83XTsoKhDEi8ohKdS04SboSh7zg3MbCi7clkQFhby3tso3B4HgliAhUYhX2CAVQuqKZNlg1Ksu3bbTqbzlQoKIPjAQYpWcUjtC2TXnTM727h6nXbcNDyxo682qEAowHG0RwOm0ZBGo/GXFeqU4dKe/QI2thw9oOjdkxcaYNedupN07+Y6f77ozc8EIUEcocCeX8SQFB4Xgya0jZw3n81AIyaVhP37X5bjJ00/rkMkIvmi2RyV96KmD0HYrYOCICyb9whiq+0sxFWrxVqtq6iA73fLSL42NPyld0xHDxZ98ZV6zmxhm4RaXZ0fHR368b/Mx44jZovpyB6uQOA2WwRqFc3lgLi4sAljMKmfcBqCIAhiBQZYtcNRqeSzZjZ1LwAAwLB2PT8q1k90BQBwFeTpr12NmD6pgfpAu1yFny7G49uwia5s1zP1Z06E/fufDdQZD+oXnqddLuvZc6hAqBkXwVWr2ex0VA2GSfr1EffoZt61p+jdzwVhWsnMMfyW9TOahffqQhXpSn/4MeSfH1Q9TnE4xlNHgyf4rHpfQdY3hR/VsvD3pao5s4UJ3guV+YQg0r59AACSkU/V7kQIgiCIHbjZ8+MKQ1HloAB7mNiOHZD16N5Qcz0MY9u4WdG+U/CkWYEb07Qldb80ZSDWiBNPKJ8v7dNb3DWJGxRU6+jqAYTPl40bE/7xv3jRLa0rNhW/9okjLROw2zfJP+n4oSiKWk6eqtbn0BCEcLN8BkFklGrEeMO6Pxjas5QGBEEQ1LRggPV4ommn0ciV+FtKZjyRar6VLWuwOkb69RssN3PkT41n1XjPVsJpkw/zWSSMKC427tvvyLrmzLlVf32sN6hIJB87WvP2m+Lhw6wbduc//0/boVOMi20k5B2CYO3i7EePVz3GDdYQJUXsn0PaqSuKcS3HjgduCkFQAygvNHrSlhi4KdTMwCnCxxOKClUqt0HPUwd5fdx08qjhyP7g1/1VTKgLymp1ZmRqJs5kk39mvnTeejk96M3XvRbAtBw/Yd69lyPgYxIczbtnvnkL12pBZIR89KgG6vzDQxBJ9+6S7t0d166R5y8U/LlTPnkE3r/7Qw+Pift0dd4rrnqEqwlCg4Jr9SR8icTr0k4IgiCoCcEAyx+6jkMUDYmi6bJDe7WTa0zP0bTp2CH90QOaZxdy1eoGurph9VpRVEs8LnDqD1Gm12/fJB0xrGbpJspo0i1dxhBu+byJwk73C36KGcZ55YZ57Y7C9ItBL73IUfssWNqEhK1bg9at+QWFlk2bDX/uVC2cJuxci+piFVCZ2JKXXzV5nrbarIX57PdacuXnmvPz5PX7QdO0Ky+fMlvcebkMQdoEgiv96rNcBQRBUHMAAyx/7KdOCaJaiDq0Z38KQ5K29EtMYYEt/RLG5TqNRkXbtm6pWDl2TP1umiubNN64dr3t+lU8vrIWuTPvnvHvzYTLEfLOWxxlg22JSNNkcYl6znMBG7pLikrXrVSMH4v36O7xEGW2GJb/ggUpFItmVRupQhBBYrzgs3j7kTOFiz9X/WO2qK2XYut15Lh+3XXrDigupgwGFOPQBMENDyM4HEn3rrzQUJYjUrzQENVLiwRpF53bDlk37VG8OoejqV04SBnM0siIaocwVBoTy/J0hiSNOzcrhg5BAlXkD4jU661nzqFWi/3adbfFyhEKBEFqRCwEMgnD43KaYp0sBEHQYw3eN/0RdOtQtuFP2/kLmvlzAzamzGbzzt3W9Is8HBcn9ZAPGSUIi0BQ1HH3tnnvDp2+TL1gXj32TRgfjy6YW/TdD5KoGFQTDOx2V/49p8momjRR1TWpfoM5D7aMKwxNc2uU3fLgKirI/2UJ3q5tzeiKKCgq+u47+eDe+DifWVmift2xMK3+65XkkCHSAYFXKbLBEIRx63bb+QscoZAfFsGLjOa3bIMJccpuJY1GrCjfvGqtTadTJHdHo6LEXVi9jXjnjqKO7Y1btxd98LWkbzfp5KdYFqkHAFj3H2eczmpHzp4DRgubMu2U3V64cgmG49KhnsXo2XNcu05mZxtSj3JFQn5YMNM6RtprEj8mAuFXVrIQcritW9dylSIENRuw0CjkCwyw/MEUUtn00dTRC/6b0W63Zc9++7lzXI02bOHL/OBq9a8l7RV8bVjJmmWAph86WccrfmRk8IvPO2/dJg1GBOdJp09RaYMfumg7e5hIJA713CrHQ9mhPeYzx5WTJ9YswUpZrcbVq/Gu7f1EV+X4sS2UL/6j7Lvf8aTOdS/OZNy9x3HqDB4ZFTRpJh7vc0aPKNNb0s/adu217tzNCQ7G+/cVtIzxXzoLQVHF+LF4r2TDb6sM//0BnzmGHxcVsD+000VeuyUdO6bqQVwiRWIDzzaSFrNu3QpUIlY983TAxp4Yxp2fbzmcyhQWucxmcXLnoHef5UVHBD4RgqAaYKFRyBcYYAUg6pKY/9tmGUn6yuamLJbiL77GePyQ+Yt8DerwgoIpgrRfzarVPoBs8Fu08NhxpRHQdrs1P0/h4z2x37pp2LWFIQnlzBnCNp4jH6TBUPzVN5KencVTvG8I40HQOkbUpV3Jt0tCPnz4fR4ZitL/tIzU6VWjJuGtA3wEXKVKmTJcmTLcVVRgPnfKffBIyfIVIo0GKBXCpM4cpYLfooXX7HtecHDw22/aL10u/Xw5Hh8jmT2Oo1HWbPagT4zh2995oaF4505VD5oyM7Wde/nvoTUro/jP1arhw/CUAb7aUDabOy8PIAhRVIxJpaROj0nErjt3+YRbn3ZRpNWgIUH4zFHK+JgGHeyEIAhqtmCAFQDC42J8HkMQXoMJd26e/peV8qQesgH+dolhaJqhKUHLmAbrZqMStU8kL2cYd/6lGDO54iBDkub0c8T1K7b8XGGH9vJxY2q+Y5TVali+gt8ykmV0VY7DAG7P5IfuLUNRpV9+w+ELwha9hdYmV4mvDdWMmgAAULpcjtw7toyLyJXr+hvXaJLAeDxpUidSIJT07e1R2UvUoX1YXKzjxMniD7+SdU7kDevDi/SsXE/qjcYlq1CUo3y22qyx82a2UKkShPuuZUrTpiMHzGmn5aNH4n37eDxIlJSY9h/ku12Gq1kcPh8giCQ60lGqk0RFuu7li1q2oM16pnsn7dgB3FDvi08hCIKg+gIDrMBokmRcLiAUehxnKEq37Be8daL/6AoAYLmUhnK5aI1neFwhiGTKpPyP/mPNuS7UhqJ8vrOwwKHX4SEhWOv4kAVzvCYhue7llv68VJbSM+DMYAWGJO2HThlOpUV88vFDd1b3w09ckTho1sKHnp9F+Xw8Nh6PjQcAyAFgCMJx95a7tJhIP1d09BgDgHzkU6KkzhX7RmMikXjwIFHvXrZTZ3SfLUW4HEF8DKdlBAAIQ1PE+UxnfqG8fz98UEq1mUeGMW/ZKoz3WU2HdjgKln1DUWTwqy9jMmnlcZfLdvqsafcejM/jhGvRgckhs0djivsNyqO/8p41+OQxBEEQ9AAMsAJg3ARgGEzmJe3YfvAwHh6pHj0xwDMQhGH/Dtm4Mf6bPV4QHi/kg3eJ/HznzRxGKBS1byMP0XJDQny1d1y7blz3h6hLIvvoynHxqmH5BtXZIjQAAB+7SURBVGnrVtqXFj10bGo+fIQxW9XPvlqP2W8IlyuKjRfFxsuT+zIEYUo/y2TfyduyTZncg5fcgxd6/01AhULJwP6SAf2c2TnWM2fR3DJXQQFHq+XGJ8jGT+RFeCaxGTZvARSj6Oc9Y91xK1u3ZR3eoYN49IiKCUrG7bYePGw8dFjeuZ100nBx367gUascBkFPuvJCo03dC+hRBAOsAFy37mE8fs08Fcf16/p9+1u8+n7AZyjdsp4jFldLtWlSZKmOdjpJg0HUvk6lhzGRCIuLE8TF+W/G0LRu+QrnrVvqV+fxW0WzeWbn1ZuG5Rs4XL5yxvS6ZK0xBGHctTto3FSUL3joJ/EP4XLl3XqBbr2kQ8dYz58q+vpboVYrmzalIswCCCKIixXExQIA/GTpW0+esp09FzLvBe9pbdnXi/74VdK/r+Spys2RrGfPlf25Sd61vebDF3jhPkNbCIIgqEnAACsA+7HzXK2XytrE1WuS+DYcaYAF9bYrl4iiXOVzzzRM71hjGMfVa/Zjx0idjrBacW2wrbiEMRjxfp55PPXLmZNj3bqdp5RK33+BG64N2N59K9e0fAOKYqKkJNnQIbVKmarJlpYuj20lSWyM0BbDxbJ+gyU9+pjPnSz+domsdWvBkBReWIC1lgAAwDCGjZudVzK1MxcIwrws5bPfzi7dvFYxdbL4QYxOOxzmzX8ReXmy6aPF/T1LYEAQBEGPAhhg+cUw7qvZiimTah43nzkbtvAV/2dbM9KLNq8LffN1jtL3arIGRttsxp27rWfPiVuEg1CNfPYorlYDABCXGcv+t9RVUqKcNKFBrksQpk2bbRcvi/p0kUwbFXCpGm2zl32/hsgtwHv1lA8fVi8zetY9+xRDR9f9edhD+QJ574Gy7n3MF06XfPcDRypVzJzOb+Ezad11+7Zh7XquQBg0fb7X6Ip2u4rXrRT37lk1uir67HOOUqb85yJUUPsAlGFM2w4gKErczuO2iuJolMIOrREut9bPA0EQBPkFAyx/3HfyBWq1MCHB47grL08gl/M0/pZiOe/dKduzTT1rhtcBsEZAmUzWvfvM5y/Ik5OUT08Rda1Wjx5TygWd2zFIg+TdO29mG//YgEpwzQcvcMMCv3z37Vzz8j8RoSj41Zc5mgD1S1mi7Q7S4fBT76rhIFyurEcfaZdk0+ljpT8tw0O0aNsEvHPnitr6DEHar2RSV66YM6+K27bXjJrkK3fKcvywtG0b6cj7iy5Js9m4fAXeKUEye9z9FgzjyLhG3rjtPH8FDwmyFutkcyb4mop13bzj/Guf22AWtGuHCCVokcl66LRp1RZBVLhgUE9he1hNFIJqDRYahXyBAZY/zsybyre8bFFsST3K0fjLerFmXS7esFrz9Hxh6/iG7KB3tMtVtvJX+63b8sG9gz5+lRvkff8WIvsep3U970JDu1wlX31D2+2yORMqthf0z7huuzX1jHrWjFptSRSQ7fwFgVLFZi/qBoJwOPLeA2Q9+9lvZJkO77EfPU653Vwcp9xuyuUSyOT8Vm1avPEvP9OgzsJ8/YnU0PffrTii+/5HTCGVzBpb/idRWKL/4heEpqVDukom9eUopfjNPOvvm8usjpBvP/R4NnfOvZL/LVVNHK9I7lHxT1o6AVBmi2nvPtu6vw3LNoiH9BYP6IFKcABBEDuw0CjkCwyw/BHEtuQGexmA4bndvDif0YDjTo7h7y2KMaOaJLqynjpt3rUbbxcfPONFP2lPjJtwF5fKp3esx0s7sq5Zt27jR4aIp4+sWkfAD9u+48TFa0HPLRS0bFmPPQEAAAwVBNc69dtdWmy7doV2uUhdiah1O45CIWxRp44hKIq3blte3dStK0FQlCbcPLmKze6BllNH+GGhFe+k7UIaxuWoXp9XHh7Zjp0zrt2uGNdHPqFvRcAkat+SGdMr7/lv3HfyeVGVGWC0zW75dZNyxHBxjYpimFSinDQBMIxxz14sX1/45qd4i3C0fbygXTwvQgtQlHY4KYqqy5sAQRDUDMEAyx9+dJTX49Zbt0MGeC+VaTiRWrZ/Z9CzC8sXjjUmhqL0S5dTep1k8lN4ryT/jU3bD/CDNBxV7TYn9sNy5Khp127x8H7S0YNYnmJYtt5xKUv79lscOZvN92qHKNUh1bf584Oy2wyp+22X0wACeBo1NzqaEQvcOVd1WVmCIK1s0HBRTKu6d4mnrkV5T4YkLZkZ2jdfK/+TttsNGzep31gAOBwAgOXAcev2gyH/niuI9cyjRzgcUedW1p2HlC/MevBcTPF7X0qTOktSBvq8HoLIhw8DAODjxjpvZtuPHjMdOesymgGCYDzudg2cPYQgCKodGGA9DARFMaGXqo2WtDPWU0eU06b4iq4YmjYfPoKajOYLaaKgILfNJh03VphQD79eDE0bli0nTUbVBy9gsgDb9tFOl+PoOS/J+w/Lce2G9cBBxcJpLKcFAQCum3fcWTmaF55riOgKACBoGeO6dSdgM6JMb9q73Zx9Xda+vahfH/mggVXz68V2h2n3nuJ1v6qHj5UkNep6Pfutm6JQLVejLv/TnHqEI5PwYiIBAKTeYNtxSLVwVM3oqhyikXLpyrx1+9GzHJFIMmokm+uiIpGoQ/vy6Vra6UQQRITj48aNu3TpUl1fEgRBUHMCA6yHQdM0aTFj4so4hiHJ4tXLHIX5wa+9UvGj6MGwbYczPR3hcoQpycrk2Qifh17LMW/aZNdqVU8vqGOXdEt+4EpFmv+8inACl5o0/7WXK5WKEutUB6sC43LrfvtNMrw/++iKyC/Sf/2r6h+z+OHh9dKHmoRtEvSr18oKC/ghnjvVlHMXF5b8uYowm+QD+odMHuc1zkNFQsWEceK+fQy/rDCeOhrxwhuNtnOf9fQxLLYyTHddSJPMuL8i0rxmOy9cI072mb9P5hQBxf2xSaKo1LhhV/ArL97Po2cYw+69ROZVZ3ExTZIIggiVSoqm8QH9xN27eSSEVdSmhyDIF1hoFPIFBlgPA2+faD2yjz9lzv1smJtZhl1beEFBIe++hUm95B7RTqd181+OGzckk4bjPSsn73hRYaLkTkVv/098925d9mw27TtAlJUp3pzHJrqibXbXuQzFjGkPfTkPjhs38PAQ6Sjf0081OLcf4keEex26o0wm++mz5mPHAM1QLpdIo6ExTDZlEj/SSxUDPxAMk/bprd+0Wj1tbrW5OZK03ciyHD/o1OtESZ3VgwZ6LdNfFVejVj73jP6nZYYdGxUjJ9ZjUXg/SINONur+Fky0y+W2WIWJD6YpdXrZQn+bORK3CyR97udaWVZuEnfuxNVqAQDuoiL7lm1ufZmgdXvtrGcwXAwYhijTGY4dQm7cyt+xU9KhvXjEcI5C0YAvDIIgqHmAAdbDkE2aoPvi6/yfvxZoQ23Z1zE+j5fYTjFmlNfG7sKi4q+/lffrHvz5OzUXtWEyibhzO+upMw8fYFGU9cgR+bxJLKsiGX/+A2+TIGhVD0lF5eypR7ida7Ea0XLghCP7XvC7b3k+wDBlq1ZbMzLV3XoGTZwpCItEeXy3rtSSftb0+2qCIELeeRMV1WI/PdmoEWVGY8Gyb7kKJb9lPO10EHdvu81GvlwmShmoaJ/IvpApRy4Pev0V44rf7n37acTL7yINHGMRuhK3xcKPuB9TOq5cFWiU5UNQtNlqL9EHx/sMN62nMwmbU9A2DgBgOXTSVViqevY5AIAtLU2/dr16yEjNjMqkeIAgXJUmaOwUAIDEoLennS38dDEvRBv0wnPV9kmEIAiCagkGWA8DQVHJ+LHWU6dBqIYnwJQTx/v6xaWdTsu6P/DuHfBpPjNgGLkUtZEP3RlXfgFXImY5PefMvOm4cVv+/tSHvlxNKENzWFRpv4+miSPn8CGDPH6/aZfLsOJX4HBFPP86T1O5cpMXFKwaOopJGV70+1Lz6rWyeXO97iTti3LWDNJsMfy1hSLtNEqjcdEhQ4diUi85arTdbr+cQd267c7N5QgFhMMpTOrMiQgXxt9fCorweLI5s4jvfjBsWq0YP6NBC0DYcm4KQ0IqwiCGJLjqB7VqMRTFUMTXnoMM49h5Vjy4N0AQhiBd+09KRz2FcDiu3Fzzlh3qkRNkXXr4uihXoZKlDBd27GLas7308y8lE8Y3yTJYCIKgJwMMsB6SILalIDbQAn6GKfnya7xjgp/oCgDA6MoQqfe0LTZs587zWrDYkgUAhiBNKzeqZs3wmVfOMObjJ1wXLznz8lEMI10uPCwUjWqhGDXST7FvhiQZB9v1emW/bXZbbepkz595/U9LEYLWLnjRa+CCcDgh8543bPlD990SzeuvsrxWOY5Uopkz208D0mg0rN/ozr3HU8r5PToKO8dhChmnRE/l5Jp/P8zTqOWzZnLVagAAKhRq3njVsv7Pu198HLHozapJeD7RtKuowHj6GGPQucv0GI/H0AwqEArathcntONpvAem9kvn0JDKKJOy2ZgHhRJQXMTQDGWyYTIv1arK/jhI2V3KMYMAAMYVG3lBwZIePdwFBcXffh8yeZYoIREAQBjKDAd327Ov8QRCp8UiCgrmRscqBgxFuVwAAE+l0cyYX3Zwd9mqNeK+vWXDhgZ+jRDUjMFCo5AvMMBqQPaMK5TTiU95yl8jhnFk3pRPrFONTYZdZUj77iM8pcrXHs/Ws+fdx0+4zRZBXGv1iEkciQzBMOPZ47bzp42FxbI5s1Dc+1VQpYrSG1j1002QV27Ka2zOY7+Qxljt2ude9zcshCDy0ZMNn37gys3jR9Rbarw9Ld20dTumlKrffZYbWhnT8OOiQK8kydQRxhUbixZ/qZ4zW9gmAZSndk2f6l66vHDpN9KBQ6Wdunl9WoaizGlnQHGBPv28UKVEVWoQHqoY/RQmkZC6MkdmpvvOzcKTRwRKFb9dJ3ly36q585TD7tKVaufMqjjCVSqdmZUhLN4y0rzjlGKmZzkMe8Yt446T6hdnAwRx3yuwpWdqX3+FoWnblm3ypG7l0ZX14vmS7Rul0a1Dhk7lqbQIhpmvpVsyTpfeyVZNncORysufSpkynB8Zrdu8Fu/WFQTVoroEBDU3sNAo5AsMsBqQZfsO+ZwJ/nOibafSeGKJOKnzQ18FEQoZXWHAZrbT6Ya/D4V9+H7NhxiK0i/7xZWbpxk3rbwkZgVFrwGKnv3Nh/YU/vdT5fy5Qm+Ddpz4Vu6082B4/4B9MK3bJoiIELWrdidy383Vb9gYtuBFNFDSD8LhKLr3su3bz58/N+C1AiJNJt33PzIkqXh5Ni/ae0oTwuMqnpsuyrln+mmdVaPRlG/ajSDqZxc6b93W/7LSduooFhYp69qTI5UxFOkqLnQXF1nTz9B2OyYUCnt0C3nnrYodcspxNRphQjwoD8KOHXddupx7MpUX1TJozGSEywMAlO3fKWkdz1FV7l8paB2vX/uHjCDKxxGFowfpvlmJBstkg7tWtCnbcMi277xq0SxBYjzjchu/W6WeNoWn1ep/WYkBjmrEBMAwuUsWcxEkauYrfHVlCVZV1wGqrv2N51Nzv1usHDpS1rVn+XE8rrU1Mlq/fKXk/Xfq/m5DEAQ1NzDAaii00+k2m4UdPfcxrIohSOfOI/xuXepyIX5khCUtDTCMnwoCtMPp2HZQOqBfzQLrtNNZ8sXXXFwc8cp7Xot7AQSRpgy3FeY79x0QtoypeRVhfCvT9h0yhxMV+lvVT9sdzguZynnzPI47MzIEoWH8EFaznNywFu7c22xa+me/fNm8ZRs3NlK+cKrPfKYH+C0j5S/N0n+50rZnL/5gykwQEx32ycfmY8ftx06YSgusBYV8qZR0u8Wt47HIcM2okZhc7v9pEQyT9e8H+vczpR4hL2Xc/eJjPCoG04bbMi+p5v6jaktUIBAEB1t2pUrHDAYA8ONjZFNHWTcftu85J+zQktCbqbvFzjKz4ukp5fsJWldv5apUos6dXLfv2K7diFj0BkAQ8/HDwO0Om/0aKqg5EonIuwywlRa5b2SBBwEWAEAxaETx6qVs3k8IgiDIA8IwTFP34RE1Z86cDSeOB0608oEyW9xXMwX9vE8hlSOybjFWB9/HnB179pOnuO3jOSqfv+jutEwE5fESauQsM4zz/AWA8URt2wPgt8ITw9gunsPCQ3nhXiIh26kzqEomSPS3MtGZnkWbrHhy9XKdDGM9ehxP7IzhYn9Xf4A0G923bwrqFpISuXnOm9nclpH8VlHsz2LchOv0RUyl5j3sPwn/SKOJLCtjjCYExwXxcR6PEsWljswr4kG9KnL8GZJy38kHNEUZLfxWUZj8fuhM3M5zXbsl7tsHoIj9xCl+TBxPHUwY9M5rmdJ23VCezyCYoUhD2lFp997lA2kAANpht19Jl/bt/ULX7qmpqVFRUb/99lv9v3LoYc2YMePevXspKTD7pymtPHxssuLQn4aB8wb0aeq+NGsHDx6MjIxcu3ZtU3ekEgywfPrmm28uXrwYFRXV1B0BAACCIM6ePdurV6+m7kgTSE1N7d+/f1P3ogmcOHGiW7duXN/LCxrTnTt3Onbs+MorrzR1R6BKixYtys7O7tHD58pQqHE023vUI+X06dOxsbHff/99U3ekEgywHg86na5169Y6na6pO9IEEKSZ/itVq9XXrl1Tqx9+hSn0ZPvoo48q/hdqQs32HvVIeQS/Do1RkxqCIAiCIKhZgQEWBEEQBEFQPYMBFgRBEARBUD2DARYEQRAEQVA9wx6pjDDIDy6X2zxXEQIAmu0KnV69ej0iqwihR1NUVNQjstK5mWu296hHyqP2dYBrHyAIgiAIguoZnCKEIAiCIAiqZzDAgiAIgiAIqmcwwIIgCIIgCKpnMMCCIAiCIAiqZ5ym7gBUCxRFZWRk5ObmRkVFtW3bFkWf/Pg4Jyfn5s2bnTp1Cg4Obuq+NJ5m+EFDLAX8Rrjd7rKysqpHRCKRVCptlN494djfjprnjavRPDbfAgZ6TNy6datTp04AALlcDgDo1q3b7du3m7pTDcjpdI4ePRoAIBAIAAAffPBBU/eokTS3DxpiieU3YsOGDR43+fnz5zdyV5887G9HzfbG1Tger28BDLAeG8OGDYuOjs7OzmYY5urVqzExMb17927qTjWgd999VyKRnDx5kqKolStXIgiydevWpu5UY2huHzTEEstvxCeffBIREbGjikuXLjV+b58w7G9HzfbG1Tger28BDLAeD3a7HUXRH3/8seLIr7/+CgDQ6XRN2KuGQ5JkSEjIG2+8UXGkX79+o0ePbsIuNY7m9kFDLLH/RsydO3fkyJGN2LUnH/s3v9neuBrHY/ctgLkdjwez2fz000+npKRUHLHZbAAAkiSbrlMN6O7du4WFhVVfb0pKysmTJ5uwS42juX3QEEvsvxE3b95s1arV3r17lyxZsnPnTofD0YjdfDKxf/Ob7Y2rcTx23wKY5P54CA4O/vnnnyv+zMvL++6773r37v2kZlAWFRUBAKq+Oq1Wq9frSZLkcJ7kf7TN7YOGWGL/jcjOzk5LS1uxYkVoaGh2dnZkZOSOHTsSEhIau8dPEPZvfrO9cTWOx+5bAEewHj/r16/v1q0bSZJr1qxp6r40FKPRCACQSCQVRyQSCcMwBoOh6TrV2JrDBw2xxPIb4XQ65XL5ggUL9Hr91atXr1+/TtP0/PnzG7u7Txb2tyN442pQj923AAZYj6JDhw5xHnj//fcrjufk5PTv33/OnDnTp0+/dOlSixYtmrCTDUqlUgEALBZLxRGTyYQgSPnCuide8/mgIa9q3gFYfiMEAkFWVta3336LYRgAIDo6+u233z516hT8ga8L9rejZn7jamiP3bcADlo+irp3737x4sXy/9ZoNOX/kZ6e3r9//+Tk5KysrOjo6KbrXWPQarXgwYBwuaKiIo1Gw+Vym65TjaRZfdCQVzXvAA/9jSj/J6TT6RQKRUN190nH/s1vzjeuRvDYfQvgCNajCMfxdg+UzzfTND158uSUlJTdu3c3hx/dyMjI6OjoAwcOVBw5cOBA3759m7BLjaO5fdCQVzXvACy/EQcOHAgJCTl//nzFkcuXLwsEgpiYmMbp+ROJ/e2o2d64Gsfj9y1o0jWMEFtHjhwBALz22mvLq7Pb7U3dtYby6aef4jh+7NgxgiCWLVuGIMjBgwebulMNrhl+0BBLvr4RS5cunTJlitPpZBjG6XSGh4cnJSUdOXLEbDZv27ZNoVC88847Td33x56f21HV999/S6ju2HwQj863AAZYj4elS5d6jY8LCwubumsNhaKoZ555BkVRLpfL5/OrloZ6gjXDDxpiydc3ojx712KxlP+ZlpZWsVoKRdFXXnml4rcfemh+bkce73/zvHE1GpYfxCPyLUAYhqnnMTEIqj9mszknJ6dNmzZ8Pr+p+wJBTY/NN4Km6ezsbIvF0rp1axzHG7N7Tzb2tyN442pQj8u3AAZYEARBEARB9QwmuUMQBEEQBNUzGGBBEARBEATVMxhgQRAEQRAE1TMYYEEQBEEQBNUzGGBBEARBEATVMxhgQRAEQRAE1TMYYEEQBEEQBNUzGGBBEARBEATVMxhgQRAEQZB3CxcurLq7MASxBwMsCIIgCPLur7/+ys7ObupeQI8lGGBBEARBEATVM05TdwCCvMjMzDx//vy0adN4PB4AwGKxbN68uW/fvjExMU3dNQiCmpjRaNy6davHwWnTppVv/Xv9+vVt27bl5eUlJCRMnz5dJpOVN9i4cWOXLl2cTue2bduKiooGDx48YsSIitNPnjy5c+dOvV4fFhY2derUuLg4/33YtGlTUlJScXHxjh07BALB9OnTW7ZsuWnTphMnTshksmeffVar1Za3LCgo2LRp0/Xr16Ojo2fPnh0UFBTwov67WtXq1at79epVcWM8fvy4y+VKSUlh+U5CDYuBoEdPaWlpcHDwe++9V/7nwoULExIS7HZ70/YKgqBHQU5OTvcqykOWsrIyhmH++usvoVDYtm3biRMnarXaqKionJyc8rPCwsJee+21uLi4uXPnJiYmAgB++umn8od+/vlnAEDbtm3Hjx8fHh4uEAjS09PLH1KpVBXNqmrRosWECRMSExNnz56tUChCQ0OnTZvWtWvXqVOnCoXChIQEmqYZhjl58qRarW7VqtXkyZP/v707CmmqjeM4/mxpkWcs7FRKGpqEbZQQJeIsMCqKCutilZSQ3SRGpDO8kRaId+FFjSAxsF2YV151rUMJXI5FIQlGhYK11MjI6cbMnc57cXiHxNt8eX1gJ97v5+o5j+P8f9uF/NwzddeuXQUFBTMzM2sOTRP1F5s2bert7U1d1tfXnz17dv2vMKSgYMGknj17lpWVFQ6HBwYGNm7c+PLly0wnAmA6ExMTW7Zs8Xq9uq7HYrH8/PzLly9rmqbr+tevX/fs2VNbW2s8sqCgQFXVVL8pKys7fvy4sXY4HBcvXjTW0WhUVdX29nbjMk3B2r9/fyKR0HU9EAgIIU6fPm3MffTokRBienpa07SysrLz58+vrKzour60tORyuaqrq9ccmibqLyhYZsYRIUzq3LlzdXV19fX1sVjs7t27hw4dynQiAOby7du3mpqaY8eOdXR0CCFGR0dnZ2e9Xq/VahVCqKp68+bNtrY2XdctFosQoq6uLnVyd+LEiWAwaKyHh4ftdrux1jQtOzt7cXFxzelut9s4lDxy5IgQ4sqVK8bcw4cPCyFisdj4+PibN2/8fn9WVpYQQlGU1tZWt9s9Pz+vqmr6ob+Lij8IBQvm5fP5du/evX379ra2tkxnAWAuyWTywoULOTk5vb29Rn+anJy0Wq2lpaWpxzidzkQiMTMzs3PnTiFEUVFR6ktGGTLY7faurq5gMPj+/fuJiYl/GcBms62+1S+XQgjj1w9rampSOz9+/BBCzM3NqaqafujvouIPQsGCeQ0NDcVisYWFhVAoVFVVlek4AEzk1q1b4+Pj4XBYURRjx2az/fz5M5FIpLpOPB4XQmzevNm4/MemkkwmXS5XPB5vaGhobGw0DvWkJDTm+v1+VVVX7xcXF6859L+VKuP5wiQoWDCpL1++NDQ03Lt379WrV9euXRsbG0t9lwTwP/fw4cMnT54EAoHV7/Q4HA4hxPPnz8+cOWPsDA8P5+Xl5ebmprlVKBQaGxt78eJFZWWlsfP582cpIZ1OpxBiZWWlvLzc2BkcHAwGg+Xl5SMjI1KGWiyWhYUFY63r+uvXr/fu3SsjOyTgjUeY1PXr10tLS5uamnw+3+Li4p07dzKdCIApDA0NtbS0NDc3b9u27e3flpaWDhw4cPTo0ebm5nA4HI/H+/r6Hj9+3NLSkv5uxk9uoVAomUx+//69qanp48ePkUhE07R15iwuLna73R6PZ3R0NB6PDw4OXrp0KRKJSBxaWFjY09MzNTW1vLzs9XplVUNIQcGCGfX09AwMDPj9fqvVmpub29XV5fP5RkZGMp0LQOYFAgFN0zo7O52rGP/Q5unTp4WFhRUVFYqiXL169caNG7dv305/t4MHDzY2Nno8HpvNtmPHjuzs7Pv37/f397e2tq4/and39759+1wul6IoJ0+ePHXq1IMHDyQO7ezs/PDhQ0lJid1un5qa8ng8688MWSy6rmc6AwAA0szNzX369MnhcKQ+nrWmSCQyOzvrdDpzcnKEENFoVFGUDRs2SMkzPz8/OTlZVFS0+q+MyhoajUbfvXtXUlKydetWKWkhCwULAABAMo4IAQAAJKNgAQAASEbBAgAAkIyCBQAAIBkFCwAAQDIKFgAAgGQULAAAAMkoWAAAAJJRsAAAACSjYAEAAEhGwQIAAJCMggUAACAZBQsAAEAyChYAAIBkFCwAAADJKFgAAACS/QWufSm/uleNTAAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 13 + } + ], + "cell_type": "code", + "source": [ + "Lx, Ly = grid.Lx, grid.Ly\n", + "\n", + "title_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\n", + "title_ψ = \"streamfunction ψ\"\n", + "\n", + "fig = Figure(resolution=(800, 720))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n", + "\n", + "axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n", + "\n", + "axq̄ = Axis(fig[1, 2],\n", + " xlabel = \"zonal mean vorticity\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n", + "\n", + "axū = Axis(fig[2, 2],\n", + " xlabel = \"zonal mean u\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n", + "\n", + "q = Observable(Array(vars.q))\n", + "ψ = Observable(Array(vars.ψ))\n", + "q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\n", + "ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n", + "\n", + "heatmap!(axq, x, y, q;\n", + " colormap = :balance, colorrange = (-12, 12))\n", + "\n", + "levels = collect(range(-0.7, stop=0.7, length=20))\n", + "\n", + "contourf!(axψ, x, y, ψ;\n", + " levels, colormap = :viridis, colorrange = (-0.35, 0.35))\n", + "contour!(axψ, x, y, ψ;\n", + " levels, color = :black)\n", + "\n", + "lines!(axq̄, q̄ₘ, y; linewidth = 3)\n", + "lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n", + "\n", + "lines!(axū, ūₘ, y; linewidth = 3)\n", + "lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0, cfl: 0.86, E: 0.0800, Q: 5.0860, walltime: 0.00 min\n", + "step: 0500, t: 20, cfl: 0.87, E: 0.0786, Q: 1.8862, walltime: 0.16 min\n", + "step: 1000, t: 40, cfl: 0.71, E: 0.0784, Q: 1.2623, walltime: 0.27 min\n", + "step: 1500, t: 60, cfl: 0.87, E: 0.0783, Q: 1.1067, walltime: 0.39 min\n", + "step: 2000, t: 80, cfl: 0.85, E: 0.0783, Q: 1.0400, walltime: 0.51 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "frames = 0:round(Int, nsteps / nsubs)\n", + "\n", + "record(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 8) do j\n", + " if j % round(Int, nsteps/nsubs / 4) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + " end\n", + "\n", + " q[] = vars.q\n", + " ψ[] = vars.ψ\n", + " q̄ₘ[] = vec(mean(vars.q, dims=1))\n", + " ūₘ[] = vec(mean(vars.u, dims=1))\n", + "\n", + " title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " SingleLayerQG.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "![](singlelayerqg_betadecay.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Save" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Finally, we can save, e.g., the last snapshot via\n", + "```julia\n", + "savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\n", + "savefig(savename)\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/singlelayerqg_betadecay.jl b/v0.15.2/literated/singlelayerqg_betadecay.jl new file mode 100644 index 00000000..f60c5360 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_betadecay.jl @@ -0,0 +1,163 @@ +using GeophysicalFlows, CairoMakie, Printf, Random + +using Statistics: mean + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n = 128 # 2D resolution: n² grid points +stepper = "FilteredRK4" # timestepper + dt = 0.04 # timestep + nsteps = 2000 # total number of time-steps + nsubs = 20 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs) +nothing # hide + +L = 2π # domain size +β = 10.0 # planetary PV gradient +μ = 0.0 # bottom drag +nothing # hide + +prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid +x, y = grid.x, grid.y +nothing # hide + +E₀ = 0.08 # energy of initial condition + +K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber + +Random.seed!(1234) +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol))) +@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h) +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h) +@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0 +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀ +q₀ = irfft(q₀h, grid.nx) + +SingleLayerQG.set_q!(prob, q₀) +nothing # hide + +fig = Figure(resolution = (800, 360)) + +axq = Axis(fig[1, 1]; + xlabel = "x", + ylabel = "y", + title = "initial vorticity ∂v/∂x-∂u/∂y", + aspect = 1, + limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2)) + ) + +axψ = Axis(fig[1, 2]; + xlabel = "x", + ylabel = "y", + title = "initial streamfunction ψ", + aspect = 1, + limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2)) + ) + +heatmap!(axq, x, y, Array(vars.q); colormap = :balance) + +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis) + +fig + +E = Diagnostic(SingleLayerQG.energy, prob; nsteps) +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps) +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will be updated every timestep. +nothing # hide + +filepath = "." +plotpath = "./plots_decayingbetaturb" +plotname = "snapshots" +filename = joinpath(filepath, "decayingbetaturb.jld2") +nothing # hide + +if isfile(filename); rm(filename); end +if !isdir(plotpath); mkdir(plotpath); end +nothing # hide + +get_sol(prob) = prob.sol # extracts the Fourier-transformed solution +out = Output(prob, filename, (:sol, get_sol)) +nothing # hide + +Lx, Ly = grid.Lx, grid.Ly + +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t)) +title_ψ = "streamfunction ψ" + +fig = Figure(resolution=(800, 720)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...) + +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...) + +axq̄ = Axis(fig[1, 2], + xlabel = "zonal mean vorticity", + ylabel = "y", + aspect = 1, + limits = ((-2.1, 2.1), (-Ly/2, Ly/2))) + +axū = Axis(fig[2, 2], + xlabel = "zonal mean u", + ylabel = "y", + aspect = 1, + limits = ((-0.5, 0.5), (-Ly/2, Ly/2))) + +q = Observable(Array(vars.q)) +ψ = Observable(Array(vars.ψ)) +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1)))) +ūₘ = Observable(Array(vec(mean(vars.u, dims=1)))) + +heatmap!(axq, x, y, q; + colormap = :balance, colorrange = (-12, 12)) + +levels = collect(range(-0.7, stop=0.7, length=20)) + +contourf!(axψ, x, y, ψ; + levels, colormap = :viridis, colorrange = (-0.35, 0.35)) +contour!(axψ, x, y, ψ; + levels, color = :black) + +lines!(axq̄, q̄ₘ, y; linewidth = 3) +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash) + +lines!(axū, ūₘ, y; linewidth = 3) +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash) + +fig + +startwalltime = time() + +frames = 0:round(Int, nsteps / nsubs) + +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 8) do j + if j % round(Int, nsteps/nsubs / 4) == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60) + + println(log) + end + + q[] = vars.q + ψ[] = vars.ψ + q̄ₘ[] = vec(mean(vars.q, dims=1)) + ūₘ[] = vec(mean(vars.u, dims=1)) + + title_q[] = @sprintf("vorticity, t = %.2f", clock.t) + + stepforward!(prob, diags, nsubs) + SingleLayerQG.updatevars!(prob) +end +nothing # hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/singlelayerqg_betadecay.mp4 b/v0.15.2/literated/singlelayerqg_betadecay.mp4 new file mode 100644 index 00000000..66121d39 Binary files /dev/null and b/v0.15.2/literated/singlelayerqg_betadecay.mp4 differ diff --git a/v0.15.2/literated/singlelayerqg_betadecay/index.html b/v0.15.2/literated/singlelayerqg_betadecay/index.html new file mode 100644 index 00000000..f843d445 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_betadecay/index.html @@ -0,0 +1,130 @@ + +Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Decaying barotropic QG beta-plane turbulence

    This example can be viewed as a Jupyter notebook via .

    An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.04           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 20             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.0       # bottom drag

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.08 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                          # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. q₀h = ifelse(K < 6  * 2π/L, 0, q₀h)
    +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)
    +@. q₀h[1, :] = 0    # remove any power from zonal wavenumber k=0
    +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀
    +q₀ = irfft(q₀h, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, q₀)

    Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (800, 360))
    +
    +axq = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial vorticity ∂v/∂x-∂u/∂y",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +axψ = Axis(fig[1, 2];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial streamfunction ψ",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +heatmap!(axq, x, y, Array(vars.q); colormap = :balance)
    +
    +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We plot the vorticity and streamfunction and their corresponding zonal mean structure.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(800, 720))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +q  = Observable(Array(vars.q))
    +ψ  = Observable(Array(vars.ψ))
    +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))
    +ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-12, 12))
    +
    +levels = collect(range(-0.7, stop=0.7, length=20))
    +
    +contourf!(axψ, x, y, ψ;
    +         levels, colormap = :viridis, colorrange = (-0.35, 0.35))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₘ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 8) do j
    +  if j % round(Int, nsteps/nsubs / 4) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +  q̄ₘ[] = vec(mean(vars.q, dims=1))
    +  ūₘ[] = vec(mean(vars.u, dims=1))
    +
    +  title_q[] = @sprintf("vorticity, t = %.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.86, E: 0.0800, Q: 5.0860, walltime: 0.00 min
    +step: 0500, t: 20, cfl: 0.87, E: 0.0786, Q: 1.8862, walltime: 0.12 min
    +step: 1000, t: 40, cfl: 0.71, E: 0.0784, Q: 1.2623, walltime: 0.24 min
    +step: 1500, t: 60, cfl: 0.87, E: 0.0783, Q: 1.1067, walltime: 0.36 min
    +step: 2000, t: 80, cfl: 0.85, E: 0.0783, Q: 1.0400, walltime: 0.47 min

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/singlelayerqg_betaforced.ipynb b/v0.15.2/literated/singlelayerqg_betaforced.ipynb new file mode 100644 index 00000000..fbf0dcf4 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_betaforced.ipynb @@ -0,0 +1,695 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Forced-dissipative barotropic QG beta-plane turbulence\n", + "\n", + "\n", + "A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on\n", + "a beta plane. The dynamics include linear drag and stochastic excitation.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n", + "\n", + "using Statistics: mean\n", + "using LinearAlgebra: ldiv!\n", + "\n", + "parsevalsum = FourierFlows.parsevalsum\n", + "record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical parameters and time-stepping parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n = 128 # 2D resolution: n² grid points\n", + "stepper = \"FilteredRK4\" # timestepper\n", + " dt = 0.05 # timestep\n", + " nsteps = 8000 # total number of timesteps\n", + " save_substeps = 10 # number of timesteps after which output is saved\n", + "\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Physical parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "L = 2π # domain size\n", + "β = 10.0 # planetary PV gradient\n", + "μ = 0.01 # bottom drag\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Forcing\n", + "\n", + "We force the vorticity equation with stochastic excitation that is delta-correlated in time\n", + "and while spatially homogeneously and isotropically correlated. The forcing has a spectrum\n", + "with power in a ring in wavenumber space of radius $k_f$ (`forcing_wavenumber`) and width\n", + "$δ_f$ (`forcing_bandwidth`), and it injects energy per unit area and per unit time\n", + "equal to $\\varepsilon$. That is, the forcing covariance spectrum is proportional to\n", + "$\\exp{[-(|\\bm{k}| - k_f)^2 / (2 δ_f^2)]}$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\n", + "forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\n", + "ε = 0.001 # energy input rate by the forcing\n", + "\n", + "grid = TwoDGrid(dev; nx=n, Lx=L)\n", + "\n", + "K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n", + "\n", + "forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n", + "@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n", + "\n", + "ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n", + "@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "We reset of the random number generator for reproducibility" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "Next we construct function `calcF!` that computes a forcing realization every timestep.\n", + "First we make sure that if `dev=GPU()`, then `CUDA.rand()` function is called for random\n", + "numbers uniformly distributed between 0 and 1." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "random_uniform = dev==CPU() ? rand : CUDA.rand\n", + "\n", + "function calcF!(Fh, sol, t, clock, vars, params, grid)\n", + " T = eltype(grid)\n", + " @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n", + "\n", + " return nothing\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n", + " calcF=calcF!, stochastic=true)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "Let's define some shortcuts." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "x, y = grid.x, grid.y\n", + "Lx, Ly = grid.Lx, grid.Ly\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "First let's see how a forcing realization looks like. Note that when plotting, we decorate\n", + "the variable to be plotted with `Array()` to make sure it is brought back on the CPU when\n", + "`vars` live on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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meXLl+/YsePVV1+dfeSuu+6qq6v78MMPyzsx+pl4qdK8xU+wiObw9ddfd3d333///fv375eP79y50+VylWtWdMNMJtPu3btffvnlHTt2bNmy5cCBA0ePHj106FC550U/Fy9Vmre4wCKaw8WLFzVN27dv3/95/L777uO79i/UM888Ew6H7777bovFYjab33zzzXvuuafck6Kfi5cqzVu8RUhEN5F4PN7T09PS0uJwOMo9FyJayLjAIiIiIjIYyzQQERERGYwLLCIiIiKDcYFFREREZDAusIiIiIgMxgUWERERkcG4wCIiIiIyGBdYRERERAbjAouIiIjIYFxgERERERmMCywiIiIig3GBRURERGQwLrCIaOH74Ycf3nvvvWw2O/vPRCJx8ODBK1eulHdWRLSAsdkzES18kUiktbX1scce27t3r6Zpe/bsOXLkSFdXl8vlKvfUiGhh4gKLiG4Kn3zyyQMPPHDs2LFoNHrvvfd2dna2t7eXe1JEtGBxgUVEN4tdu3adPHkymUw+/vjjzz//fLmnQ0QLGRdYRHSziMVizc3NwWDw/PnzFoul3NMhooWMIXciulkcPnw4mUx2d3efOHGi3HMhogWOn2AR0U1hdHS0tbX12WefPXXq1PHjx8+cOcOEOxH95XCBRUQ3he3bt4+Pj3/11VexWKylpeXBBx/ct29fuSdFRAsWbxES0cK3f//+zz777MCBA2azubKy8q233nr99dePHj1a7nkR0YLFT7CIiIiIDMZPsIiIiIgMxgUWERERkcG4wCIiIiIyGBdYRERERAbjAouIiIjIYFxgERERERmMCywiIiIig3GBRURERGQwLrCIiIiIDMYFFhEREZHBuMAiIiIiMhgXWEREREQG4wKLiIiIyGBcYBEREREZjAssIiIiIoNxgUVERERkMC6wiIiIiAz2v405Tn5VF+FiAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n", + "\n", + "fig = Figure()\n", + "\n", + "ax = Axis(fig[1, 1],\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " title = \"a forcing realization\",\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n", + " colormap = :balance, colorrange = (-8, 8))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition is simply fluid at rest." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostic -- `energy` and `enstrophy` are functions imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\n", + "Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\n", + "diags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "filepath = \".\"\n", + "plotpath = \"./plots_forcedbetaturb\"\n", + "plotname = \"snapshots\"\n", + "filename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if isfile(filename); rm(filename); end\n", + "if !isdir(plotpath); mkdir(plotpath); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "and then create Output." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n", + "\n", + "function get_u(prob)\n", + " vars, grid, sol = prob.vars, prob.grid, prob.sol\n", + "\n", + " @. vars.qh = sol\n", + "\n", + " SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n", + "\n", + " ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n", + "\n", + " return Array(vars.u)\n", + "end\n", + "\n", + "output = Output(prob, filename, (:qh, get_sol), (:u, get_u))\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 15 + }, + { + "cell_type": "markdown", + "source": [ + "We first save the problem's grid and other parameters so we can use them later." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "saveproblem(output)" + ], + "metadata": {}, + "execution_count": 16 + }, + { + "cell_type": "markdown", + "source": [ + "and then call `saveoutput(output)` once to save the initial state." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "saveoutput(output)" + ], + "metadata": {}, + "execution_count": 17 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We time-step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\n", + "step: 0500, t: 25, cfl: 0.47, E: 0.0188, Q: 2.6766, walltime: 0.05 min\n", + "step: 1000, t: 50, cfl: 0.58, E: 0.0288, Q: 2.6773, walltime: 0.08 min\n", + "step: 1500, t: 75, cfl: 0.95, E: 0.0362, Q: 2.7047, walltime: 0.12 min\n", + "step: 2000, t: 100, cfl: 0.83, E: 0.0399, Q: 2.5734, walltime: 0.15 min\n", + "step: 2500, t: 125, cfl: 0.85, E: 0.0432, Q: 2.8344, walltime: 0.19 min\n", + "step: 3000, t: 150, cfl: 0.77, E: 0.0438, Q: 2.5116, walltime: 0.22 min\n", + "step: 3500, t: 175, cfl: 0.80, E: 0.0455, Q: 2.5815, walltime: 0.25 min\n", + "step: 4000, t: 200, cfl: 0.80, E: 0.0458, Q: 2.5701, walltime: 0.29 min\n", + "step: 4500, t: 225, cfl: 0.78, E: 0.0465, Q: 2.5623, walltime: 0.32 min\n", + "step: 5000, t: 250, cfl: 0.75, E: 0.0465, Q: 2.4738, walltime: 0.36 min\n", + "step: 5500, t: 275, cfl: 0.79, E: 0.0464, Q: 2.5337, walltime: 0.40 min\n", + "step: 6000, t: 300, cfl: 0.82, E: 0.0459, Q: 2.4495, walltime: 0.44 min\n", + "step: 6500, t: 325, cfl: 0.79, E: 0.0476, Q: 2.7472, walltime: 0.48 min\n", + "step: 7000, t: 350, cfl: 0.79, E: 0.0469, Q: 2.5711, walltime: 0.51 min\n", + "step: 7500, t: 375, cfl: 0.89, E: 0.0467, Q: 2.5391, walltime: 0.56 min\n", + "step: 8000, t: 400, cfl: 0.91, E: 0.0471, Q: 2.6349, walltime: 0.60 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "while clock.step <= nsteps\n", + " if clock.step % 50save_substeps == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + " end\n", + "\n", + " stepforward!(prob, diags, save_substeps)\n", + " SingleLayerQG.updatevars!(prob)\n", + "\n", + " if clock.step % save_substeps == 0\n", + " saveoutput(output)\n", + " end\n", + "end\n", + "\n", + "savediagnostic(E, \"energy\", output.path)\n", + "savediagnostic(Z, \"enstrophy\", output.path)" + ], + "metadata": {}, + "execution_count": 18 + }, + { + "cell_type": "markdown", + "source": [ + "## Load saved output and visualize" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We now have output from our simulation saved in `singlelayerqg_forcedbeta.jld2` which\n", + "we can load to create a time series for the fields we are interested in." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "file = jldopen(output.path)\n", + "\n", + "iterations = parse.(Int, keys(file[\"snapshots/t\"]))\n", + "t = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n", + "\n", + "qh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\n", + "u = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n", + "\n", + "E_t = file[\"diagnostics/energy/t\"]\n", + "Z_t = file[\"diagnostics/enstrophy/t\"]\n", + "E_data = file[\"diagnostics/energy/data\"]\n", + "Z_data = file[\"diagnostics/enstrophy/data\"]\n", + "\n", + "x, y = file[\"grid/x\"], file[\"grid/y\"]\n", + "nx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\n", + "Lx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n", + "\n", + "close(file)" + ], + "metadata": {}, + "execution_count": 19 + }, + { + "cell_type": "markdown", + "source": [ + "We create a figure using Makie's [`Observable`](https://makie.juliaplots.org/stable/documentation/nodes/)s" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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UASCOwAAAKAABHcAAABAAQjuAGDrWFUGABSB4A4AAAAoAMEdAAAAUACCOwDYOlaVAQBFILgDAABTDh06tG3btuvXr8tdCGDrCO4AAMCUixcvPvHEE61bt46Lizt06JDc5QC2i+AOALaOVWVgWmRkZGZm5ksvvbRv376QkJDAwMC333774sWLctcF2ByCOwAAqIWvr+/LL798/PjxY8eORURELF682M/Pb9CgQV988UVZWZnc1QG2guAOAADqKiAgoGfPnr169RJC7Nu3b+LEia1bt168eLHcdQE2geAOALaOVWVQq9LS0nXr1kVGRnp5eY0ePbqkpGT58uV5eXk5OTmzZs2aPHlyUlKS3DUCjR/BHQAAmLJr1y4vL6+nn366tLR0wYIFubm5u3fvjo2Nbd68ebNmzWbOnNmhQ4dff/1V7jKBxs9e7gIAAIBVa968+YIFC0aMGOHp6XnTDomJiV5eXhauCrBBBHcAsHXZQRHMloEJffr06dOnj4kOfn5+lqoFsGkEdwAAYMqOHTtef/31Go1qtdrT09PHx+fRRx+NioqytydRAGbHHHcAAGDKPffcc/fddx8/frxFixahoaHdunWrqqo6derUgAEDWrRo8cILLwwZMkSv18tdJtD48fcxANg65snAtMrKyh9++CElJUVaBVIIodfrX3311dTU1O3bt//rX//q0qXLnj17HnnkEXnrBBo9rrgDAABTtmzZ0rdvX0NqF0KoVKp//etfO3bsyMnJadOmTf/+/U+dOiVjhYCNILgDAABTdDpdfn5+jcYrV64IIYqLi6WfmeMOWADBHQBsXXZQhNwlwKpFRESkpqa+9tprpaWlUsupU6f+/ve/d+7cuVOnTosWLTpy5IjpZWcANAiCOwAAMKVnz57Lli1buHBh8+bNfX19W7Zsee+99xYWFm7durWqqiouLm7atGndu3eXu0yg8eM/tgAAgCnXrl0bOnTo448//s0332RkZDg5Od17771Dhgyxs7PT6XRZWVnt2rWTu0bAJhDcAcDWsaoMTJs7d+6mTZsuXLgwevToGnep1WpSO2AxjXmqTEZGxjfffJOXlyd3IQDuFMMZkFFMTExeXt6hQ4fkLgSwdY3zintVVVV0dPSOHTucnJwqKytnzZr11ltvyV0UgNvBcAZk5+npOWnSpMGDB48aNapDhw4ODg6Gu6ZNmyZj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AIACENwBAAAABSC4AwAAAApAcAcAAAAUgOAOAAAAKADBHQAAAFAAgjsAAACgAAR3AAAAQAEI7gAAAIACENwBAAAABSC4AwAAAApAcAcAAAAUgOAOAAAAKADBHQAAAFAAgjsAAACgAAR3AAAAQAEI7gAAAIACENwBAAAABSC4AwAAAApAcMdN6PX6ZcuWxcbGvvDCCxbbaZcuXVq2bLl161YzbX/SpEkjR448cOCAmbYPAABgVgR3q/Pqq6/26tXr448/lrGGtWvXTpw48fPPP1+7dq359lLjSDUajUajqaqqMtPutm3btn79+gsXLphp+wAAAGZFcLc6Z8+eTU1NzczMlLGGo0ePCiH69u1r1phb40iXL1++cePGvn37mm+PAAAAykVwl8f169eXLVsWFRU1cODA2NjYxMREqX3NmjVnz54VQvzyyy9ffPGFEGLMmDFjxow5e/bsl19+GRMTY9jC1q1bY2NjBw8ePH369NOnTxvay8vLP/7448jIyAEDBowePXrTpk1Se1VVlbSpM2fOvPLKK4888sj06dPz8/MvXLgQFxc3aNCgKVOm5ObmSjWkpqYKIYqKihYvXlxaWio9MCcnR9rUypUrx4wZs2jRIummdO/p06fnzZv32GOPRUVFffXVV8YHe+DAgeeff37QoEFPP/30jh07bnWkO3fu3LZtW15entTh1KlT06dPHzJkSHR09LvvvlteXm7YYK17rHHIWVlZNe6aO3fumDFjtm/fXtcXDAAAQHZ6yOHJJ5+s8UJ88MEHer0+JCTE0HLffffp9Xrp5+eff14I4enpKT18+vTpUrtarRZCuLq6JiYm6vX66urq8PDwGlv+97//rdfrS0pKpJtt27Y13HXvvfe2bt3acPP++++vUYMQIj8/X/rh1KlT0t4nTpwohHjqqaekm9K93bt3N37Unj17pHuXLl0qFWnwxhtv3PRImzZtKoTYunWrXq/fsGGDo6Oj8aM6dOiQl5dXlz0aGA756NGjer3e29tbCLF27Vq9Xt+/f38hxFtvvWWelxcAAKDhccVdBhcvXpQuhH/33XdFRUVz584VQrz99ttCiH379o0YMUIIERcXd+jQIcNDVqxYERkZOWvWLCHEsWPHPvroI5VKtWPHjmvXrk2ePLmsrGzKlCk6ne6XX375/vvv7ezs9uzZk5ubK8X9NWvWGO+9ffv2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" + }, + "metadata": {}, + "execution_count": 20 + } + ], + "cell_type": "code", + "source": [ + "j = Observable(1)\n", + "\n", + "q = @lift irfft(qh[$j], nx)\n", + "ψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)\n", + "q̄ = @lift real(ifft(qh[$j][1, :] / ny))\n", + "ū = @lift vec(mean(u[$j], dims=1))\n", + "\n", + "title_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$j])\n", + "\n", + "energy = Observable([Point2f(E_t[1], E_data[1])])\n", + "enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n", + "\n", + "fig = Figure(resolution=(1000, 600))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n", + "\n", + "axψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n", + "\n", + "axq̄ = Axis(fig[1, 2],\n", + " xlabel = \"zonal mean vorticity\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-3, 3), (-Ly/2, Ly/2)))\n", + "\n", + "axū = Axis(fig[2, 2],\n", + " xlabel = \"zonal mean u\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n", + "\n", + "axE = Axis(fig[1, 3],\n", + " xlabel = \"μ t\",\n", + " ylabel = \"energy\",\n", + " aspect = 1,\n", + " limits = ((-0.1, 4.1), (0, 0.055)))\n", + "\n", + "axZ = Axis(fig[2, 3],\n", + " xlabel = \"μ t\",\n", + " ylabel = \"enstrophy\",\n", + " aspect = 1,\n", + " limits = ((-0.1, 4.1), (0, 3.1)))\n", + "\n", + "heatmap!(axq, x, y, q;\n", + " colormap = :balance, colorrange = (-8, 8))\n", + "\n", + "levels = collect(-0.32:0.04:0.32)\n", + "\n", + "contourf!(axψ, x, y, ψ;\n", + " levels, colormap = :viridis, colorrange = (-0.22, 0.22))\n", + "contour!(axψ, x, y, ψ;\n", + " levels, color = :black)\n", + "\n", + "lines!(axq̄, q̄, y; linewidth = 3)\n", + "lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n", + "\n", + "lines!(axū, ū, y; linewidth = 3)\n", + "lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n", + "\n", + "lines!(axE, energy; linewidth = 3)\n", + "lines!(axZ, enstrophy; linewidth = 3, color = :red)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 20 + }, + { + "cell_type": "markdown", + "source": [ + "We are now ready to animate all saved output." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "frames = 1:length(t)\n", + "record(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 18) do i\n", + " j[] = i\n", + "\n", + " energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n", + " enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 21 + }, + { + "cell_type": "markdown", + "source": [ + "![](singlelayerqg_betaforced.mp4)" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# we delete the .jld2 file before deploying the docs (takes too much space) #hide\n", + "rm(output.path) #hide" + ], + "metadata": {}, + "execution_count": 22 + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/singlelayerqg_betaforced.jl b/v0.15.2/literated/singlelayerqg_betaforced.jl new file mode 100644 index 00000000..1e29d8db --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_betaforced.jl @@ -0,0 +1,240 @@ +using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf + +using Statistics: mean +using LinearAlgebra: ldiv! + +parsevalsum = FourierFlows.parsevalsum +record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record +nothing # hide + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n = 128 # 2D resolution: n² grid points +stepper = "FilteredRK4" # timestepper + dt = 0.05 # timestep + nsteps = 8000 # total number of timesteps + save_substeps = 10 # number of timesteps after which output is saved + +nothing # hide + +L = 2π # domain size +β = 10.0 # planetary PV gradient +μ = 0.01 # bottom drag +nothing # hide + +forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space +forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f` +ε = 0.001 # energy input rate by the forcing + +grid = TwoDGrid(dev; nx=n, Lx=L) + +K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber + +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2)) +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average + +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly) +@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε +nothing # hide + +if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end +nothing # hide + +random_uniform = dev==CPU() ? rand : CUDA.rand + +function calcF!(Fh, sol, t, clock, vars, params, grid) + T = eltype(grid) + @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt) + + return nothing +end +nothing # hide + +prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, + calcF=calcF!, stochastic=true) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid +x, y = grid.x, grid.y +Lx, Ly = grid.Lx, grid.Ly +nothing # hide + +calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid) + +fig = Figure() + +ax = Axis(fig[1, 1], + xlabel = "x", + ylabel = "y", + aspect = 1, + title = "a forcing realization", + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx)); + colormap = :balance, colorrange = (-8, 8)) + +fig + +SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny))) + +E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps) +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps) +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will be updated every timestep. +nothing # hide + +filepath = "." +plotpath = "./plots_forcedbetaturb" +plotname = "snapshots" +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2") +nothing # hide + +if isfile(filename); rm(filename); end +if !isdir(plotpath); mkdir(plotpath); end +nothing # hide + +get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution + +function get_u(prob) + vars, grid, sol = prob.vars, prob.grid, prob.sol + + @. vars.qh = sol + + SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid) + + ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh) + + return Array(vars.u) +end + +output = Output(prob, filename, (:qh, get_sol), (:u, get_u)) +nothing # hide + +saveproblem(output) + +saveoutput(output) + +startwalltime = time() + +while clock.step <= nsteps + if clock.step % 50save_substeps == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60) + + println(log) + end + + stepforward!(prob, diags, save_substeps) + SingleLayerQG.updatevars!(prob) + + if clock.step % save_substeps == 0 + saveoutput(output) + end +end + +savediagnostic(E, "energy", output.path) +savediagnostic(Z, "enstrophy", output.path) + +file = jldopen(output.path) + +iterations = parse.(Int, keys(file["snapshots/t"])) +t = [file["snapshots/t/$i"] for i ∈ iterations] + +qh = [file["snapshots/qh/$i"] for i ∈ iterations] +u = [file["snapshots/u/$i"] for i ∈ iterations] + +E_t = file["diagnostics/energy/t"] +Z_t = file["diagnostics/enstrophy/t"] +E_data = file["diagnostics/energy/data"] +Z_data = file["diagnostics/enstrophy/data"] + +x, y = file["grid/x"], file["grid/y"] +nx, ny = file["grid/nx"], file["grid/ny"] +Lx, Ly = file["grid/Lx"], file["grid/Ly"] + +close(file) + +j = Observable(1) + +q = @lift irfft(qh[$j], nx) +ψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx) +q̄ = @lift real(ifft(qh[$j][1, :] / ny)) +ū = @lift vec(mean(u[$j], dims=1)) + +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$j]) + +energy = Observable([Point2f(E_t[1], E_data[1])]) +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])]) + +fig = Figure(resolution=(1000, 600)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...) + +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...) + +axq̄ = Axis(fig[1, 2], + xlabel = "zonal mean vorticity", + ylabel = "y", + aspect = 1, + limits = ((-3, 3), (-Ly/2, Ly/2))) + +axū = Axis(fig[2, 2], + xlabel = "zonal mean u", + ylabel = "y", + aspect = 1, + limits = ((-0.5, 0.5), (-Ly/2, Ly/2))) + +axE = Axis(fig[1, 3], + xlabel = "μ t", + ylabel = "energy", + aspect = 1, + limits = ((-0.1, 4.1), (0, 0.055))) + +axZ = Axis(fig[2, 3], + xlabel = "μ t", + ylabel = "enstrophy", + aspect = 1, + limits = ((-0.1, 4.1), (0, 3.1))) + +heatmap!(axq, x, y, q; + colormap = :balance, colorrange = (-8, 8)) + +levels = collect(-0.32:0.04:0.32) + +contourf!(axψ, x, y, ψ; + levels, colormap = :viridis, colorrange = (-0.22, 0.22)) +contour!(axψ, x, y, ψ; + levels, color = :black) + +lines!(axq̄, q̄, y; linewidth = 3) +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash) + +lines!(axū, ū, y; linewidth = 3) +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash) + +lines!(axE, energy; linewidth = 3) +lines!(axZ, enstrophy; linewidth = 3, color = :red) + +fig + +frames = 1:length(t) +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 18) do i + j[] = i + + energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i])) + enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i])) +end +nothing # hide + +# we delete the .jld2 file before deploying the docs (takes too much space) #hide +rm(output.path) #hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/singlelayerqg_betaforced.mp4 b/v0.15.2/literated/singlelayerqg_betaforced.mp4 new file mode 100644 index 00000000..f5cfdd55 Binary files /dev/null and b/v0.15.2/literated/singlelayerqg_betaforced.mp4 differ diff --git a/v0.15.2/literated/singlelayerqg_betaforced/index.html b/v0.15.2/literated/singlelayerqg_betaforced/index.html new file mode 100644 index 00000000..627320e8 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_betaforced/index.html @@ -0,0 +1,197 @@ + +Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Forced-dissipative barotropic QG beta-plane turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
    +
    +using Statistics: mean
    +using LinearAlgebra: ldiv!
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of timesteps
    + save_substeps = 10      # number of timesteps after which output is saved

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                             calcF=calcF!, stochastic=true)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostic – energy and enstrophy are functions imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  vars, grid, sol = prob.vars, prob.grid, prob.sol
    +
    +  @. vars.qh = sol
    +
    +  SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +
    +  ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)
    +
    +  return Array(vars.u)
    +end
    +
    +output = Output(prob, filename, (:qh, get_sol), (:u, get_u))

    We first save the problem's grid and other parameters so we can use them later.

    saveproblem(output)

    and then call saveoutput(output) once to save the initial state.

    saveoutput(output)

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +while clock.step <= nsteps
    +  if clock.step % 50save_substeps == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +    clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  stepforward!(prob, diags, save_substeps)
    +  SingleLayerQG.updatevars!(prob)
    +
    +  if clock.step % save_substeps == 0
    +    saveoutput(output)
    +  end
    +end
    +
    +savediagnostic(E, "energy", output.path)
    +savediagnostic(Z, "enstrophy", output.path)
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 0500, t: 25, cfl: 0.47, E: 0.0188, Q: 2.6766, walltime: 0.03 min
    +step: 1000, t: 50, cfl: 0.58, E: 0.0288, Q: 2.6773, walltime: 0.06 min
    +step: 1500, t: 75, cfl: 0.95, E: 0.0362, Q: 2.7047, walltime: 0.10 min
    +step: 2000, t: 100, cfl: 0.83, E: 0.0399, Q: 2.5734, walltime: 0.13 min
    +step: 2500, t: 125, cfl: 0.85, E: 0.0432, Q: 2.8344, walltime: 0.16 min
    +step: 3000, t: 150, cfl: 0.77, E: 0.0438, Q: 2.5116, walltime: 0.19 min
    +step: 3500, t: 175, cfl: 0.80, E: 0.0455, Q: 2.5815, walltime: 0.23 min
    +step: 4000, t: 200, cfl: 0.80, E: 0.0458, Q: 2.5701, walltime: 0.26 min
    +step: 4500, t: 225, cfl: 0.78, E: 0.0465, Q: 2.5623, walltime: 0.29 min
    +step: 5000, t: 250, cfl: 0.75, E: 0.0465, Q: 2.4738, walltime: 0.33 min
    +step: 5500, t: 275, cfl: 0.79, E: 0.0464, Q: 2.5337, walltime: 0.36 min
    +step: 6000, t: 300, cfl: 0.82, E: 0.0459, Q: 2.4495, walltime: 0.40 min
    +step: 6500, t: 325, cfl: 0.79, E: 0.0476, Q: 2.7472, walltime: 0.43 min
    +step: 7000, t: 350, cfl: 0.79, E: 0.0469, Q: 2.5711, walltime: 0.46 min
    +step: 7500, t: 375, cfl: 0.89, E: 0.0467, Q: 2.5391, walltime: 0.50 min
    +step: 8000, t: 400, cfl: 0.91, E: 0.0471, Q: 2.6349, walltime: 0.53 min

    Load saved output and visualize

    We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

    file = jldopen(output.path)
    +
    +iterations = parse.(Int, keys(file["snapshots/t"]))
    +t = [file["snapshots/t/$i"] for i ∈ iterations]
    +
    +qh = [file["snapshots/qh/$i"] for i ∈ iterations]
    +u  = [file["snapshots/u/$i"] for i ∈ iterations]
    +
    +E_t  = file["diagnostics/energy/t"]
    +Z_t  = file["diagnostics/enstrophy/t"]
    +E_data = file["diagnostics/energy/data"]
    +Z_data = file["diagnostics/enstrophy/data"]
    +
    +x,  y  = file["grid/x"],  file["grid/y"]
    +nx, ny = file["grid/nx"], file["grid/ny"]
    +Lx, Ly = file["grid/Lx"], file["grid/Ly"]
    +
    +close(file)

    We create a figure using Makie's Observables

    j = Observable(1)
    +
    +q = @lift irfft(qh[$j], nx)
    +ψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)
    +q̄ = @lift real(ifft(qh[$j][1, :] / ny))
    +ū = @lift vec(mean(u[$j], dims=1))
    +
    +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$j])
    +
    +energy = Observable([Point2f(E_t[1], E_data[1])])
    +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.055)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 3.1)))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +levels = collect(-0.32:0.04:0.32)
    +
    +contourf!(axψ, x, y, ψ;
    +          levels, colormap = :viridis, colorrange = (-0.22, 0.22))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ū, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, energy; linewidth = 3)
    +lines!(axZ, enstrophy; linewidth = 3, color = :red)
    +
    +fig

    We are now ready to animate all saved output.

    frames = 1:length(t)
    +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 18) do i
    +  j[] = i
    +
    +  energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
    +end


    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.ipynb b/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.ipynb new file mode 100644 index 00000000..1d6cd5b3 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.ipynb @@ -0,0 +1,373 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation\n", + "\n", + "\n", + "We use here the `SingleLayerQG` module to simulate decaying two-dimensional turbulence and\n", + "investigate how does a finite Rossby radius of deformation affects its evolution.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, Printf, Random, CairoMakie\n", + "\n", + "using GeophysicalFlows: peakedisotropicspectrum\n", + "using LinearAlgebra: ldiv!\n", + "using Random: seed!" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical, domain, and simulation parameters\n", + "\n", + "First, we pick some numerical and physical parameters for our model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "n, L = 128, 2π # grid resolution and domain length\n", + "deformation_radius = 0.35 # the deformation radius\n", + "nothing # hide\n", + "\n", + "# Then we pick the time-stepper parameters\n", + " dt = 1e-2 # timestep\n", + "nsteps = 4000 # total number of steps\n", + " nsubs = 20 # number of steps between each plot\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize two problems by providing a set of keyword arguments to the `Problem` constructor.\n", + "The two problems are otherwise the same, except one has an infinite deformation radius, `prob_bqg`,\n", + "and the other has finite deformation radius, `prob_eqbqg`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For both problems we use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a\n", + "wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and,\n", + "thereby, stabilize the problem, despite that we use the default viscosity coefficient `ν=0`.\n", + "Thus, we choose not to do any dealiasing by providing `aliased_fraction=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "stepper=\"FilteredRK4\"\n", + "\n", + "prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\n", + "prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For initial condition we construct a relative vorticity with energy most energy around total\n", + "wavenumber $k_0$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "seed!(1234)\n", + "k₀, E₀ = 6, 0.5\n", + "∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "`SingleLayerQG` allows us to set up the initial $q$ for each problem via `set_q!()` function.\n", + "To initialize both `prob_bqg` and `prob_eqbqg` with the same flow, we first use function\n", + "`SingleLayerQG.streamfunctionfrompv!` to get the streamfunction that corresponds to the\n", + "relative vorticity we computed above. This works in the purely barotropic problem, `prob_bqg`\n", + "since in that case the QGPV is simply the relative vorticity." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "∇²ψ₀h = rfft(∇²ψ₀)\n", + "ψ₀h = @. 0 * ∇²ψ₀h\n", + "SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "and then use the streamfunction to compute the corresponding $q_0$ for each problem," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\n", + "q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Now we can initialize our problems with the same flow." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\n", + "SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate\n", + "the variable to be plotted with `Array()` to make sure it is brought back on the CPU when\n", + "`vars` live on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAF8CAIAAAC4wUiaAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeXxU1d348c/sS2Ym+0IWkhAgJCHsyCKKCOKC+0qLti61tdZWn9rnV22lffXp8uhTrUv7PLZ1QWwVa11arbaCC64UUAhrMBDIvk+S2fe5vz+uM00DDIHGktbv+w9emZl7z5w5957DOeeeRaMoCkIIIYQQYvRoT3YEhBBCCCH+3UgFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSwghhBBilEkFSxwHv9+/cuXKlStXtrW1ney4/ENqampycnJefPHFkx0RIWCUbsgbbrhh5cqVH3744WjFaijJ+ymsW7du5cqVd9999zGPVBTl17/+9XXXXff1r399FCPwDxpr5eGw9PznRK+pqemJJ55YvXr1Sy+95Ha7j3bY9u3b/+d//ueOO+54/PHHvV5v8v2urq5n/t5rr72GIsSIDQwMqDfTrl27Pu3vuvPOO+fNm3f//fd/GoHn5+cD69at+zQCF+J4jcoNmZ6eDrz44ov/SCBHy3eS91P49re/DZx99tnHPPKpp55SkzE7O3sUI3BcDk/esVYeDkvPf0L03n77bYvFkqwtVVZW9vb2Hn7Y3XffrdFokocVFBQcOHBA/eixxx4bVhWbPn26/sTqekJ82hoaGjZv3jx//vxPI/BHH300GAx+SoELcbzGzg35qea7sRCHk5vU27dvBxYtWvSXv/zlpESAIyXv2Ln9jujTjl48Hr/yyisDgcBNN910wQUX/OQnP3n//fdvu+223/72t0MPa25uvuuuuzQazQMPPJCbm7t69erGxsY77rjj97//PVBfXw9cdNFFZrNZPb6srEwqWOJEeL3eO+64o66urqam5pZbbikvL1ff9/v9v/71r999993+/v5x48Zdeumll19+ufrR1VdfDXzve9/bunXrq6++qrbk6uvrH3nkkb179zocjtmzZ3/961+3Wq3A008/3dDQAGzbtu3JJ5/8whe+cMTTjxaC1+u96aabgB/+8Idr167dvHnz5MmTb7755srKSvWsl19+2efzlZeXFxcXq+9s2rTpN7/5TUNDw7hx46644ooLL7zwn5WW4l/Piy+++NJLL7W3t0+dOvXLX/7ylClThn707LPPxmKxa665xuv1vvLKKzNnzrz99tuT9+RPf/rTcePGAWvWrHnjjTcWLFjwta99begN+dBDD23ZsuWUU075xje+oYZ56623Op3OlStXnn/++Smy2AgjqWalu+6667XXXnv99dfNZvO11167YsUKjpTvDg/2s5P39+7d29DQYLPZli1bdng6vPrqq08//bTP57vssstGmPhPP/305s2bAZfL9fDDD3/rW99KkQ6Hp9vjjz9+ww03AKtXr37iiSe2bdtWU1Nz5513+v3+n/70p/v27auurv7Od75TUFCQ4ooc8RIPS5NjRumIN88wh1+11LduivQcGr3U+SgSiaxZs2bDhg1Op7O0tHTVqlXJa5fiar7//vvd3d02m+0Xv/iFTqezWq1Llix59dVXo9GoXv+3OtJHH30UjUYXLlyoZszW1tZvf/vbar0K2Ldvn8FgeO6554aeIo8IxXFIPiYoLS1N3kJ5eXn19fWKosRisaVLlw67d++77z71XPXlzTffTKJ7/NlnnzWZTEMPnjBhQnd3t6Io8+bNS745ffr0I56eIoTe3l715cyZM5Mfpaenb9u2TT1x2MOUX/3qV1rt341H/P73v/9PTVnxr+Ob3/ymepOo90xaWtrrr7+ufvSTn/wkeQtptdpp06YBK1asUBQleU+qmUVRlK985SvAVVddpfz9Dfnoo48C+fn58XhcUZTW1lb1xB07dqTOYkMDSRHJw7MGsH79euVI+S7pM5j31QdVFRUVh98DDz744NBHRWqaJB9pHS3xh/40IHU6HP7DPR6P+k6yaghUV1er9QzVrFmz1HOPdkWOeImHpslIonTEm2eYYZFPfYekTs+h0Uudjw5vbNx7773HvJoPPfQQMG/ePPVlcgBWQ0PD0MM6OzvffffdvXv3qi8vueQS4MYbb1RfVlRUTJo06Te/+c2XvvSlu+66a+fOnYqiSAVLHIdkIVtSUvLmm29u2bKlpqYGuPTSSxVF2bp1K6DT6davX9/V1aVmrdmzZ6vnqieazebLLrvs/vvvd7lcubm5wKpVq1pbWzdv3jxhwgTghhtuUBQlFAqpt+8tt9wSCoUOP11RlBQhJDNhaWnpxo0bt2zZMnXqVGD58uVqZIbm2L6+PvXl97///Y6Ojvvuu0/9FUd8Bi8+4+rq6jQajUajeemllwYHB7/2ta8B1dXVsVispaVF/Z/pP/7jP/bt26feSBx/BWtgYMBoNAKbN29WEvWtqqoq5VhZLBlIikgqiaxUWVn5/PPPv/LKK+p/z9dee61ypHyX9BnM+0f7L7mzszMtLQ342te+Vl9ff//996vfqFYIUiR+KBS65ZZbgEsuuSQQCKROh8N/eLKCdeqpp7799tt33XXX0Jd33nmn+rK5uTnFFTniJU6myQijdMSbZ5hhkU9xh6ROT2XEFayWlhb1ow0bNrhcrh//+McMqZGnqGD94Ac/AJYuXZp8R6fTAVu2bDn8YEVR1q5dO2PGDGDx4sVer1dRlGAwqJ6SZDQaX3jhBalgieOQLGQff/xx9Z3169er2SYUCvX19W3atKmurs7v92/dunXlypVqMaceqZ747W9/e+iJVqvV7Xar76gPvPPz89WXakfxrbfeesTTU4eQzIRr165VP1JHPGi12mAwqPx9jn355ZfVfBiNRhVFicfjt99++1e+8pVkS0WIJLWPqra2duvWreqzD7XlvWPHDnWUa0lJiVqPURRl0aJFHH8FS1GUiy66CFi9erWiKFdccQXwgx/8QFGU1FksGUiKSCqJrPTEE0+oZ331q18Fli1bpr4clu+SPoN5PxaLRSIR9aOhnnzySWDcuHGRSER954wzzkhWCFIn/q233gpcdtllI0mHYT88WcF6+eWXFUUZHBwc+rKvr099uX379tS3yuGXOJkmI4zS0W6eoYZFPkV8UqenMuIK1qFDh9SPLr744t/97nfd3d319fX19fVqfjza1VQU5Y477gDOOeec5DvqY7633nrr8IMVRbn33nszMjIAk8n0yCOPKIqye/dunU5ns9meeeaZurq6Sy+9VP1FskyDOBG1tbXqH9OnTwdisdihQ4eys7Pr6+uvv/56m802d+7c3/3ud4efuHz5cvWPxsZGoKyszG63Dw2zu7t76NzXo52eOgSfzzcsnurDmng8nmzlJKnZcvz48WoTRKPR3Hvvvb/85S+rqqpGmhziM0O963bt2jV37ty5c+eed9556v8lBw4cUD+qqqpKPnJS77oT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W4h/pm9961v33XffihUrks/7xKdtFPP+wYMHr7vuuqVLl37ve98bpdiJzxaZRSiEEEIM9957761atUrdnUaIEyAVLPFvyGq1fv/73ycx61iIk2L58uU2m01dYUH8c4xi3j/iVoxCjJw8IhRCCCGEGGWyDpYQQgghxCiTR4Ti+PzoRz8KBoNH+3T69OkTJ0585513Zs2atXDhwsP3JbjpppsGBwdvvfXWBQsWfEoxbGpq2rhxY2Nj49y5c88444zkqiojP2yEIQghxiApo8RYcbzzGMVn3Oc+9zmguLi49O+pa/T913/9l1arveyyy7Kysm666abDT8/PzwfWrVs38m+88847582bd//994/k4Lfffju5VwZQWVmprjI38sNGGIIQYmySMkqMEVLBEsdH3aDghRdeGPb+Nddck5WV9fjjj19++eWKonz1q1894voxJ1B4Hb73+9HEYjE1/JtuuumVV1459dRTgVWrVo38sBGGIIQYs6SMEmOEVLDE8YnH4xMnThy2dqLL5bJard/4xjfUl9u3b8/Ly3vooYcURQkGg6tWrVq1alVzc7Py94XXj370o1WrVv3hD39I8XVPPfWUuknqaaedtnbt2tRxU7eystls0WhUUZS33noLyMzMjEQiIzxshCEIIcYsKaPEGCEVLHHc/vu//1un07W3tyff+eUvfwns3LlTUZQHHnggMzPz0UcfVT8atp/D0MJr8eLFwA9/+MMU3zVv3rxkT/iwvTsO99BDDwHz5s1TX7rdbvXEhoaGER42whCEEGOZlFFiLJBZhOK4XXvttRqNZu3atcl3HnvssXnz5tXW1r755pu33XbbokWLWltb1RLtH/TOO+9ccsklwC233LJly5ZYLLbxSNTtzdXduGw2m3qu3W5XR7AODg4ODTPFYSMMQQgxlkkZJcYCmUUojltBQcEFF1zw+OOP33nnncDu3bu3bt366KOPAj6f74tf/CLQ1NQUj8f/8e8yGo3qzpo6nc5oNHq93iVLlhx+2Jo1a6699tpAIAAYDIbk++qu5j6fb+jBKQ4bYQhCiLFMyigxFkgFS5yIG2+88bzzznvnnXdOP/30xx57zGazXXXVVcAFF1xwwQUXfHrfazab161bd/j7ai+9uul6sqAJhULRaBRIS0sbenCKw0YYghBijJMySpx08ohQnIizzz67pKTkscceC4fD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" + }, + "metadata": {}, + "execution_count": 9 + } + ], + "cell_type": "code", + "source": [ + "function relativevorticity(prob)\n", + " vars, grid = prob.vars, prob.grid\n", + "\n", + " ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n", + "\n", + " return vars.q\n", + "end\n", + "\n", + "x, y = prob_bqg.grid.x, prob_bqg.grid.y\n", + "Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n", + "\n", + "fig = Figure(resolution=(800, 380))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "t_bqg = Observable(prob_bqg.clock.t)\n", + "t_eqbqg = Observable(prob_eqbqg.clock.t)\n", + "\n", + "title_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\n", + "title_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n", + "\n", + "ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\n", + "ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n", + "\n", + "ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\n", + "ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n", + "\n", + "heatmap!(ax1, x, y, ζ_bqg;\n", + " colormap = :balance, colorrange = (-40, 40))\n", + "\n", + "heatmap!(ax2, x, y, ζ_eqbqg;\n", + " colormap = :balance, colorrange = (-40, 40))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Now we time-step both problems forward and animate the relative vorticity in each case." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min\n", + "equivalent barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.01 min\n", + "barotropic; step: 1000, t: 10, cfl: 0.65, walltime: 0.13 min\n", + "equivalent barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.13 min\n", + "barotropic; step: 2000, t: 20, cfl: 0.52, walltime: 0.23 min\n", + "equivalent barotropic; step: 2000, t: 20, cfl: 0.35, walltime: 0.23 min\n", + "barotropic; step: 3000, t: 30, cfl: 0.48, walltime: 0.33 min\n", + "equivalent barotropic; step: 3000, t: 30, cfl: 0.32, walltime: 0.33 min\n", + "barotropic; step: 4000, t: 40, cfl: 0.49, walltime: 0.45 min\n", + "equivalent barotropic; step: 4000, t: 40, cfl: 0.34, walltime: 0.45 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n", + "\n", + "record(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n", + " if j % (1000 / nsubs) == 0\n", + " log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n", + " prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n", + " println(log_bqg)\n", + "\n", + " log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n", + " prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n", + " println(log_eqbqg)\n", + " end\n", + "\n", + " stepforward!(prob_bqg, nsubs)\n", + " SingleLayerQG.updatevars!(prob_bqg)\n", + "\n", + " stepforward!(prob_eqbqg, nsubs)\n", + " SingleLayerQG.updatevars!(prob_eqbqg)\n", + "\n", + " t_bqg[] = prob_bqg.clock.t\n", + " t_eqbqg[] = prob_eqbqg.clock.t\n", + " ζ_bqg[] = relativevorticity(prob_bqg)\n", + " ζ_eqbqg[] = relativevorticity(prob_eqbqg)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "![](singlelayerqg_barotropic_equivalentbarotropic.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl b/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl new file mode 100644 index 00000000..5466e946 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl @@ -0,0 +1,111 @@ +using GeophysicalFlows, Printf, Random, CairoMakie + +using GeophysicalFlows: peakedisotropicspectrum +using LinearAlgebra: ldiv! +using Random: seed! + +dev = CPU() # Device (CPU/GPU) +nothing # hide + +n, L = 128, 2π # grid resolution and domain length +deformation_radius = 0.35 # the deformation radius +nothing # hide + +# Then we pick the time-stepper parameters + dt = 1e-2 # timestep +nsteps = 4000 # total number of steps + nsubs = 20 # number of steps between each plot +nothing # hide + +stepper="FilteredRK4" + +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0) +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0) +nothing # hide + +seed!(1234) +k₀, E₀ = 6, 0.5 +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter) +nothing # hide + +∇²ψ₀h = rfft(∇²ψ₀) +ψ₀h = @. 0 * ∇²ψ₀h +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid) +nothing # hide + +q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx) +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx) +nothing # hide + +SingleLayerQG.set_q!(prob_bqg, q₀_bqg) +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg) +nothing # hide + +function relativevorticity(prob) + vars, grid = prob.vars, prob.grid + + ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh) + + return vars.q +end + +x, y = prob_bqg.grid.x, prob_bqg.grid.y +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly + +fig = Figure(resolution=(800, 380)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +t_bqg = Observable(prob_bqg.clock.t) +t_eqbqg = Observable(prob_eqbqg.clock.t) + +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg) +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg) + +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...) +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...) + +ζ_bqg = Observable(Array(relativevorticity(prob_bqg))) +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg))) + +heatmap!(ax1, x, y, ζ_bqg; + colormap = :balance, colorrange = (-40, 40)) + +heatmap!(ax2, x, y, ζ_eqbqg; + colormap = :balance, colorrange = (-40, 40)) + +fig + +startwalltime = time() + +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy]) + +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j + if j % (1000 / nsubs) == 0 + log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min", + prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60) + println(log_bqg) + + log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min", + prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60) + println(log_eqbqg) + end + + stepforward!(prob_bqg, nsubs) + SingleLayerQG.updatevars!(prob_bqg) + + stepforward!(prob_eqbqg, nsubs) + SingleLayerQG.updatevars!(prob_eqbqg) + + t_bqg[] = prob_bqg.clock.t + t_eqbqg[] = prob_eqbqg.clock.t + ζ_bqg[] = relativevorticity(prob_bqg) + ζ_eqbqg[] = relativevorticity(prob_eqbqg) +end +nothing # hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html new file mode 100644 index 00000000..96b24d8a --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -0,0 +1,92 @@ + +SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

    SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

    This example can be viewed as a Jupyter notebook via .

    We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using GeophysicalFlows: peakedisotropicspectrum
    +using LinearAlgebra: ldiv!
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length
    +deformation_radius = 0.35   # the deformation radius
    +
    +# Then we pick the time-stepper parameters
    +    dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.

    For both problems we use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    stepper="FilteredRK4"
    +
    +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)
    +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)

    Setting initial conditions

    For initial condition we construct a relative vorticity with energy most energy around total wavenumber $k_0$.

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)

    SingleLayerQG allows us to set up the initial $q$ for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.

    ∇²ψ₀h = rfft(∇²ψ₀)
    +ψ₀h = @. 0 * ∇²ψ₀h
    +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)

    and then use the streamfunction to compute the corresponding $q_0$ for each problem,

    q₀_bqg   = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)
    +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)

    Now we can initialize our problems with the same flow.

    SingleLayerQG.set_q!(prob_bqg, q₀_bqg)
    +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)

    Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    function relativevorticity(prob)
    +  vars, grid = prob.vars, prob.grid
    +
    +  ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)
    +
    +  return vars.q
    +end
    +
    +x,  y  = prob_bqg.grid.x,  prob_bqg.grid.y
    +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +t_bqg = Observable(prob_bqg.clock.t)
    +t_eqbqg = Observable(prob_eqbqg.clock.t)
    +
    +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg)
    +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg)
    +
    +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)
    +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)
    +
    +ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))
    +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))
    +
    +heatmap!(ax1, x, y, ζ_bqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +heatmap!(ax2, x, y, ζ_eqbqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Time-stepping the Problem forward

    Now we time-step both problems forward and animate the relative vorticity in each case.

    startwalltime = time()
    +
    +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
    +
    +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)
    +    println(log_bqg)
    +
    +    log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)
    +    println(log_eqbqg)
    +  end
    +
    +  stepforward!(prob_bqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_bqg)
    +
    +  stepforward!(prob_eqbqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_eqbqg)
    +
    +  t_bqg[] = prob_bqg.clock.t
    +  t_eqbqg[] = prob_eqbqg.clock.t
    +  ζ_bqg[] = relativevorticity(prob_bqg)
    +  ζ_eqbqg[] = relativevorticity(prob_eqbqg)
    +end
    barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min
    +equivalent barotropic; step: 0000, t: 0, cfl: 0.48, walltime: 0.00 min
    +barotropic; step: 1000, t: 10, cfl: 0.65, walltime: 0.11 min
    +equivalent barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.11 min
    +barotropic; step: 2000, t: 20, cfl: 0.52, walltime: 0.21 min
    +equivalent barotropic; step: 2000, t: 20, cfl: 0.35, walltime: 0.21 min
    +barotropic; step: 3000, t: 30, cfl: 0.48, walltime: 0.31 min
    +equivalent barotropic; step: 3000, t: 30, cfl: 0.32, walltime: 0.31 min
    +barotropic; step: 4000, t: 40, cfl: 0.49, walltime: 0.42 min
    +equivalent barotropic; step: 4000, t: 40, cfl: 0.34, walltime: 0.42 min


    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/singlelayerqg_decaying_topography.ipynb b/v0.15.2/literated/singlelayerqg_decaying_topography.ipynb new file mode 100644 index 00000000..31e687f7 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_decaying_topography.ipynb @@ -0,0 +1,504 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Decaying barotropic QG turbulence over topography\n", + "\n", + "\n", + "An example of decaying barotropic quasi-geostrophic turbulence over topography.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CairoMakie, Printf, Random\n", + "\n", + "using Statistics: mean" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical parameters and time-stepping parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n = 128 # 2D resolution = n²\n", + "stepper = \"FilteredRK4\" # timestepper\n", + " dt = 0.05 # timestep\n", + " nsteps = 2000 # total number of time-steps\n", + " nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Physical parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "L = 2π # domain size\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "Define the topographic potential vorticity, $\\eta = f_0 h(x, y)/H$. The topography here is\n", + "an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "σx, σy = 0.4, 0.8\n", + "topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`.\n", + "Thus, we choose not to do any dealiasing by providing `aliased_fraction=0`.\n", + "\n", + "The topophic PV is prescribed via keyword argument `eta`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n", + " dt, stepper, aliased_fraction=0)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "and define some shortcuts" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "x, y = grid.x, grid.y\n", + "Lx, Ly = grid.Lx, grid.Ly\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "and let's plot the topographic PV. Note that when plotting, we decorate the variable to be\n", + "plotted with `Array()` to make sure it is brought back on the CPU when the variable lives\n", + "on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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S4RAZunr62tvb58zZ864cePizgKkLQULACAwH9MAABCYggUAEJiCBQAQmIIFABCYggUAEJiCBQAQmIIFABCYggUAEJiCBQAQmIIFABCYggUAEJiCBWSE1tbW06dPDwwMDL3s7+8/derUs2fP4k0FpCtf9gxkhK6urrlz527ZsqWmpiaKourq6qamprt37+bm5sYdDUhDChaQKS5durRu3bqbN2/29PSsWrUqmUwuXLgw7lBAelKwgAxSVVV1586dVCq1devWvXv3xh0HSFsKFpBBent7i4qK8vLyHj16lJOTE3ccIG25yR3III2NjalUqq2t7fbt23FnAdKZEywgU7x9+3bu3Lm7d+9uaWm5devWgwcP3OEO/E0ULCBTrF279t27d9evX+/t7Z0zZ8769etra2vjDgWkJ5cIgYxQV1d3+fLl+vr67OzsyZMnHz9+/MiRI83NzXHnAtKTEywAgMCcYAEABKZgAQAEpmABAASmYAEABKZgAQAEpmABAASmYAEABKZgAQAEpmABAASmYAEABKZgAQAEpmABAASmYAEABKZgAQAEpmABAASmYAEABKZgAQAE9geqWNO9xjmSXAAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "η = Array(params.eta)\n", + "\n", + "fig = Figure()\n", + "ax = Axis(fig[1, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = \"topographic PV η=f₀h/H\",\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "contourf!(ax, x, y, η;\n", + " levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition consist of a flow that has power only at wavenumbers with\n", + "$6 < \\frac{L}{2\\pi} \\sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$.\n", + "`device_array()` function returns the array type appropriate for the device, i.e., `Array` for\n", + "`dev = CPU()` and `CuArray` for `dev = GPU()`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E₀ = 0.04 # energy of initial condition\n", + "\n", + "K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n", + "\n", + "Random.seed!(1234)\n", + "qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n", + "@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n", + "@. qih = ifelse(K > 12 * 2π/L, 0, qih)\n", + "qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\n", + "qi = irfft(qih, grid.nx)\n", + "\n", + "SingleLayerQG.set_q!(prob, qi)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "Let's plot the initial vorticity and streamfunction." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAF8CAIAAAC4wUiaAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOydd5wURfbAv92T82zOsOQgYQUlKGIAFQN6KgoKeHKY9cx6Zzq98+clczrD3alnwoQkPVA8RVERJErOYdkcZ3cnz3T//mhmWDYMw7KoaH0/fJaZ7uqqV9UzNa9fvfdKUlUVgUAgEAgEAkHnIf/YAggEAoFAIBD83BAKlkAgEAgEAkEnIxQsgUAgEAgEgk5GKFgCgUAgEAgEnYxQsAQCgUAgEAg6GaFgCQQCgUAgEHQyQsESCAQCgUAg6GSEgiUQCAQCgUDQyQgFSyAQCAQCgaCTEQqWQCAQCAQCQScjFCyBQCAQCASCTkYoWAKBQCAQCASdjFCwBAKBQCAQCDoZoWAJBAKBQCAQdDJCwRIIBAKBQCDoZISCJRAIBAKBQNDJCAVLIBAIBAKBoJMRCpZAIBAIBAJBJyMULIFAIBAIBIJORihYAoFAIBAIBJ2MULAEAoFAIBAIOhmhYAkEAoFAIBB0MkLBEggEAoFAIOhkhIIlEAgEAoFA0MkIBUsgEAgEAoGgkxEKlkAgEAgEAkEnIxQsgUAgEAgEgk5GKFgCgUAgEAgEnYxQsAQCgUAgEAg6GaFgCQQCgUAgEHQyQsFKxDHHHJOenj5r1qzDLJlkPdOnT580adLy5cs7ImtHSVK25IciAatWrbr33nsfeOCBr7766pAufOGFFxYtWnQ4NfykZBAIOpFfwjR1+Kiq+tJLL02bNu23v/3tD9Zop0ybibn22msnTZq0ZMmSI9eEoMMIBSsRNTU1NTU1wWDwkErec889I0aMePLJJw+1npkzZ77zzjt79+49TLET00K8JGVrUax1Hw+Koij33Xffu+++u2TJklNOOeX6669XVTWZC9evX3/ddddt27atwzX8pGQQCDqXo2Ka6sCM0bnMmDHjmmuuefXVV2fMmHHkWunY7Ho4zJ49+5133tm9e/eRa0LQYfQ/tgA/af71r38FAoERI0YcUsktW7YsXbq0+VXJ1/MD0EK8JGVrUax1Hw+KLMuzZ8/2+/1Op/ORRx656667evTocfvttx/0wgULFgBnnnlmh2v4ScnwS0BRlNWrV5eWlvbu3bt3794/tjg/c46KaaoDM0bnsmrVKmDUqFHad/kI0bHZVfBzRViwEjFv3rzZs2dXVFQAU6ZMmTJlyqZNm5566qnx48dffPHFH330UeuSb7311pYtW4CVK1e+9tprrevx+XxPPvnkRRdddOqpp1522WXvv//+QcV4+umnp0yZ8vTTT8eP3HzzzVOmTPnwww+1txs3brztttvGjRt3ySWX/O1vf/P5fNpxTeYtW7a8+eabkydPBlqL11w2YMmSJddff/3YsWOnTp06d+7cNoeiRSV//vOfp0yZ0vzZ9A9/+MOUKVNaG8YNBoPT6QSuvvpqWZYff/zxUCh00N7Nnz9/wIABBQUFbdYwc+ZMrZslJSXA4sWLtbdr165tczDblKGpqUm7qqysTCv2yiuvTJky5bnnnktGhlAolPwg/OzZvXv30KFDhw4detFFF/Xp0+eCCy44ok/wgp/INAWEw+GXXnrp4osvPu2006ZNm/bpp59qx1s313pqAmbNmjVt2rQzzjjjtttu27RpU7za9oQJBoNaPZs3b7777rvPPPPM2267raqqavfu3TfeeOPYsWNvuumm8vJyTYClS5cCHo/n+eefBxJ/5RMPI+3MkwedXWl/rk6m0Ra93rNnT4tTDz/88JQpU+bMmZPMzRL8EKiC9nG5XMCsWbPU2DLQscce23z0PvnkkxYlhw8fHj87ePDgFmej0eiYMWNa3ILHHnusdXPN+de//gVkZWUpiqKqanFxsXbhmjVrVFV99913TSZT8wq7d+9eUVERl/n6668H0tLSVFVtLV7zRl988UVZPkDnfuCBB1rL1qKSRx55RKs/EomoqtrQ0GAwGIBly5YlGNtu3boBixcvTty7pqYmo9F4xx13tFfDggUL8vPzgenTpyuKot2gsWPHJnN/4zJUVVVpjW7cuFE7dc011wATJ05MRobFixd3bBB+lowbN65Pnz5Lly4NhUJz5syxWq0PPvjgjy3Uz5mfyDSlquqECRNaXPXoo4+qbU07raem2267TTuoTUE2m+3TTz9VVTWBMI2NjdpbbQbQ6N+/f05OTvztkCFDWggAqKqa+CufeBjbmycTz65qwrn6oI3Gifd61apVqqpmZWUBM2bMUFX15JNPBh566KHD+DQJOhOhYCWi9czVp0+fmTNnfvTRR9p3+IorrmhRMhgMXnDBBcCNN94YDAZbnP3uu+8AnU73ySeflJeXa/PL0KFDWzfXnLq6OqPRCCxdulSN6Vv9+vVTVdXj8WRkZACTJ08uLi5eunRp9+7dgenTp8dlNpvNF1100RNPPKGqamvx4o1WV1drrx944IHS0tLHHntME7WqqqqFbC0q2bt3rzbdfPnll6qqajabHj16tB7PaDT69ttv33PPPW+++aa2cvTqq68m6J2qqtrToTbVtleD9pyn0+nuv/9+wGaz7dy5s7172mYNiWfbZGRIfhB+9thstocffjj+dvz48WPGjPkR5fnZ8xOZpuIGlYULF3o8nocffpiY8tS6uRZT0+rVqyVJkiRp7ty59fX1N9xwA9C/f/9oNJpAmLiqceKJJ37xxRf33Xdf87d333239nb37t3BYPDGG28ELrjgAr/fryanYLU5jAnmyQSzq3qwufqg9y6OULCOIsQS4aFx9913X3jhhWefffavfvUroLWnp9Fo1H5odTqdpjc0p1u3bkuWLFmxYsWoUaOKi4tra2uB6urqxI263e6zzjoL0FbNPv74Y2DSpEnA0qVLq6qqrFbr888/n5+fP2zYsD/96U/xkho333zz+++/f8sttyQWb8mSJR6PJy0t7f7778/Jybn11ltvv/32K6+8Mj4TtdfHvLy8U045BZg3bx4wf/584NJLL23dkUmTJk2ePHnlypU333yzZkv3er0JegcsWLDAZrOddNJJCWo4++yzp06dGo1GH3roIeAvf/lLYWGhVtVfY7z55psJakg8/snIkPwg/Ozp3bv3999/r70Oh8ObNm0Sblg/MD/KNBWNRrUXzz333IIFC6688sqNGzd+9dVXiqK011x8avrvf/+rquqAAQNycnK2bt16zjnnSJK0YcOGdevWJSPM73//+9GjR99xxx3N38Y9I2tra41Go06nA2RZNpvNhzOMCebJxKOazFzdXqOCoxTh5H5o9OjRQ3uRmpoKqIcYQZaWljZ37txnn3129erViqJIkpTkhZdddtmcOXM++uijBx54QPNs0FSQ7du3A4WFhQ6HQys5cOBAoKKioqmpSTtyxhlnJNPEzp07gS5dumgzkSRJjz76aJLiTZky5bPPPps3b97f//739nSLBQsWvPfee6effvr8+fMVRcnPzy8rK9Oe4drrnXbVmDFjtNkqQQ2PP/7422+/HQ6H+/btqz3+ArNmzXrxxRe11yeeeOLkyZMT1JCAJGVIZhB+aixatEjLPZE8bre7vr6++ZFTTjlFUy41nnrqqQsvvHDQoEEjRoyYP3++2+2O2xIEPww/yjRVWFg4ceLEd955Z/bs2bNnz9bpdKNHj3700UdbrKY1Jz41afPY2rVrjz/++OYFtm3bNmjQoIMKoy0RahNX67cdps1h7PA8mXiuttvtCRr9hfPRRx9JknT22Wf/2IIcMkLB+kFZsGDBb37zG6PReM8995x++ukrVqyIex4kZvz48Xa7fdWqVXPmzKmrqxs6dKhmFUhPTwdqamriJbXXFovFarVqR1o/S7VJSkoK0OK3M0kuuuii66+/ftOmTbNmzSouLh40aFD//v1blPnf//4HaHbvhoaGsrIyg8GgORy017stW7bs2LEj/mCaoIY333wzHA5rl3zzzTejRo0CioqKzj//fO1aTZ4ENWjEn8LjzqfJy5DMIPzUWLRo0ZMPPeySDUmW9yjhX02drBkI28NqtdpstkgkUlZWpqpqampqkp9AwU+EDk9Tb7/99v333//+++/PmTNn1apVn3/++ciRIysrK7WVstbEPxha1MiYMWPiXzSNgQMHdliYJGn9lU9Mh+fJZOZqQWvC4fDtt10HnH76ds2x9ShCLBEeKSKRSOuDWmrKgQMHPvTQQ6NHj164cGGStVkslvPPP19V1TvvvJNmBp6ioiJJkioqKt59911AUZRnn31WO57gwbFN8QYMGADs3LlTy1m3Z88ep9Op1+u18ObElTidznPPPRfQ5r42LTeaAqTX6wEtomfKlCmaA0F7vdPsQOPGjUtcw/bt2++55x7g1FNPVRRl2rRp2lx57bXXzo7x5z//OUENdrtdezL+7LPPgPLycm2lL3kZkhyEnyAu2dDFYEnyn0s2FBYWPnggzc1XDQ0NJ5100qRJkzZs2DBv3rzt27dbrVZtWAQ/QTpxmnr33XfHjh3717/+9f7771+5cuXq1atlWQ6FQitWrEjcHLHJZ+/evaeffvq4ceNGjRq1Y8eObdu2mUymDs+ZiUnwlU9MMvNkm93s8FzdAqvVqhm3Fi9erE1HGrt379aMZFqw88+Gp59+smdXf48uvmee/tGSqHUYoWB1PtrT2Jw5c5544okWp7RH/xUrVpx88snHH3+8lpFFUZRkqtV+sHfs2CFJ0sSJE7WDPXv2nD59OjB58uTTTz990KBBH3zwAfCXv/zlUMUrKirSfgjPOOOMcePGHXvssY2NjSNGjCgqKkqmEi3WeteuXZIkxTWk5kyYMEGSpJUrV7755pvXX3997969NZepBL1bsGBBnz59tEi99mpQVXX69Ok+n2/06NFz587Nysratm3bvffe22bf25PBbDZrVqibbrqpX79+BQUFDQ0NycsQr/+gg/ATRAIZKcl/B10rWrhwod/v1xz+AJPJdN111y1fvry0tPRId0RwSHT6NNWjR49Fixa98cYbw4cPnzx58hVXXKEois1mGzRoUOLmgMmTJ3fr1m3z5s0nnHDCVVddNWzYsBtuuOE///lPWlra4cyZCUjwlU9M4nkyQTc7MFe3iSzLd911lya53W7XfGSnTZtWWFi4d+/e/v37n3feeYdU4U+Zqqqqv/31oUcfsD75J/tf/vInLenG0cSP5l5/NNA6PGfx4sXaKe0nPB4e1bzkkiVLsrOzaSv+ORgMaq6LkiSdfPLJ2jOTLMurV69WE8Y/q6oaCoXS0tKAUaNGNT8eCATuvfdet9utVduvX7/58+drp1rIrNFCvOaN1tfXT5s2TXMC1el0l1xySTyEuIVsrfsYDAY14/kJJ5zQ3njOmDFjwIABvXv3vu666+I1t9c7v99vsVhuueWWxDVoT4HEghD/8Y9/aEP61VdfHZIMK1eu7NmzJ2AwGKZOnXrFFVcAEyZMSEaGOMkMwk+KBx54oFBvPdWSnuS/Qr01nrmjTTSD39q1a+NH/v3vfwO1tbVHvDO/VH4609TMmTP79esX/3EZOHDgwoULtVMtmms9NW3fvv20007THJuMRuOUKVO0z0wCYVrE07V4W1dX1/ztzTffDFx00UXxFtv8yjePImxvGBPMkwlmVzXhXH3QRluwaNGi3/zmN0OGDNGsX7m5uWedddbTTz/t8XgSfVaONq6+6te3XZuplPVUynreek3GNVf/+seW6NCQVOFDd2RoaGiwWCxtrhnX1tbKsqx9zTqR8vJyu90ed5bssHiKopSUlGRlZR3UdaZFJaeffvqnn376zDPPaBHRh4nP51u5cmWvXr20BbgfhrKystTU1Hiumg7I0LmDcKR58MEHX/vzI90NtiTL7wh7L7/nzgcffLC9Ak1NTQMGDMjNzX3ppZe6d+++ZMmSX//614MHD24zZaLgR+dITFNNTU1VVVXp6elxb+5kmtMIBAKVlZU5OTktyhyhOZNWX/nkSTBPHrSbhzRXJyY7O7uiomLGjBlHi8k8eVavXn3WuJM2fJnpdspAQ6PS/+SqufM+Hzp06I8tWrIIJ/cjhWYrbhNtBb3T0Z6ckiSBeLIsJ7mKH6+kuLh40aJFX3zxhdFovPjii5MXIwFWq1XzVf8haZ6i8FBlOBKD8AMgIckkG80qHayk3W6fN2/eb37zGy1CCrjwwgvjsZyCnxpHYppKoDokaE7DbDZ36dKlE4U5KC2+8smTYJ48aDcPaa7+xXLLzVc/eIdN064Ap0O+/1brzTddtfirFckH4P+4CB8sQSdw//33X3755eFw+MYbb/whDU4/KY7SQZBBJ0lJ/ktmvhg4cOB3331XXFy8bNmy6urqmTNnavFTAoFAkCTvvvuup27b9EsPMIJeNdkR8O56//33fiypDhVhwRJ0AhMmTBg0aFBRUVHzgLJfGkfpIEiSJCf9OJj8g2N+fn7zDUwEAsGR4Kyzzqqrq/uZfdf8fv/v7rrplSesLXKZyTJPPmSbfMNvzznn3KMit4VQsASdgIjD56gdBC2KMPnCAoHgp8Mrr7zyY4vQ+Tz6yF+PH6ycPNLS+tSJx5uHFQUef+xv993/xx9esENFLBEKBL9oJCRd0v8O6oMlEAgEh0NJScnTTz/+t/vaNVA99qD9qacej+99+VPm6LZgPfnkk6tXr06cV1og+Pmxa9euoqKieLqpw0HzwUq+sKA9xHQk+GXSidMR8Lu7br7u19bCgnZjMAty9ddebr33nttef+P9TmnxyHF0K1irV6/etWvXvhmtdb4Jaf9/+84llZNCgiQyKh5IOBQKRyJWSxsmTQ6srpUkzZprJl5iQduQrh2J1bb+S1i1tL/+hMMVDAaBA8KbW4vQugLpgP86IuEhIB34pwXqvtZaiXRgof34fT69wdA6+jqpD0vSN7eNOltJuGvXrmTaTIbOjSL8JXPAdPSjEg6Hw+HwUeGk0lm0MR393PH5fIa2pqMfnk6cjpYsWfLFok9eWJyRuNjvf+voP3rhV1999cNHmh8SR7eCVVhYmJOZed3ECwF/+R4gXFcF+37MjOk5gKtvEbC8uAr4ZGcN8F1xBCipjRck0wXQN0sChmZbgGMyXUCe2wHYTEZiCoyiqIAsS4DFoAf8laWAf+92IFCyEwjXVwOSLAPGzDzA3udYIJyWDyzZXQ5srvECYUXt7jYDp3TPBXQ7vweqP30fqFy8FCjdCuALSYDLpgCZPXWAe2AfwNG3CLB26weYs7sAxpQMwOhwA+WeRmB7VT2wssIDfFcSAtbvBSiv0QFaPuTMNAU4rpsKXNjHBZzVrytQtfgjoHHdUiBQXgKoigIY3CmAObsAMOfmxodaZ3XAPjVACQYAJeAH1GgYkPQGQO9MBSxZ+UDAYAG2VdYB2+sagT0NQaDKFwUagioQCKtAMEL8byAMEAwDRLRtxCQAswHAZQXIc8pAr1QD0DfNAfTJdANZNjPgrywBwg11aiQMyAZjXDBzehbQGFGBck8TUO0NAE2hCBBRFEAvy4BZr/3VA2a9DjDqZcCo1wF2oxFIc1iBSG0l0LR1DdDw/RKgbuUyoHxVPbC7Rg9o+3I7JYDCzDCQMzwXSBl+MuAqGgXYu/cHMHTyvn6SJOmSig7cV7hzW/85UVhYqKrqsGHD8vLyBg8e3LpAdXX1xx9/rKX7PxxUVX399df1ev1ll13WZgGv1+v3+9sL3gyHw2+//fbUqVMTNDFz5swzzjgjnsjK4/F89tlnF1xwQXvlN23aVF9fP2LEiDbPvvbaa1OmTDmkDWHivPfee2effbbNdkCqtg8//HDEiBFaB7/66quSkhJtM6v2Nj1sk1mzZhUVFcU3aTgoGzZsWLNmTYItsK677rprr722zVt/JKiurrZYLC1Gpj2+/PJLq9V63HHHNT+4dOlSm82mbf6TDB988MGpp56q5VJuToLEeIeEoii33Hz1X+612awH+ahYLdL//d56801Xfbd8fcc+Vz8MR7eCJRAIDhPh5N6JvP/x/A8++zTc0BgNha3ZOYaefU35XUz5BWow2Lh2tW/ZV/aTh9/nL+l4A6pa+9bs6Kad0UDQOeq0B3ZVdKSOaLTkiYfv3rXGkJPZXpnKe/6ecfm1htQ07W1gzy7/Jwse+GJXe+XrN60IVm91Xth2rsudD/7uD95iqQO2FkUpufWh/Fvv1lkPUCNq331DCUl5p1zkLd1ZuvAtx/ATUrYfwl5MSsBf+do/FX9T6m1X6tNaqgutCe0t87zyXrShIXPyyX+1bWyvWPGaL/5z2lsYjJbTTrANK9LZk83fe2ioqnfVet+CL8xpqf7ScmtedqC23ti9S6ixydy3h6oopu5dZLNJtphVUOoa/Ju3K6s3Nu3ckz3tWvMni/dXoygVzz6WOeoCW37PZJoNN9btfPfJ3Ft+p7PELKOq2rjsm5evu7Kzevb2229LauWlF/VRk5hoLpvAc69ufvvtt9t7zPgpcNQrWB5/wJCeA2gp6SWdHtAsEwZXGhBUJKDWHwJq/FGg3gvQ4JMBSVIBt02FfUYqq0EHpFrNQKbTBgQ9tYAaiQD7AtpVFfD5vUCorhII11YCkcY6IOprACRZD0R9TUDU1wg48k2Ay2QAXCY9EIgqmvFDp5PjAqDTAZJOE08BVFUCwmEJCDdFgIjHA4Q9NUDYUwvo7S5AZ7EBOFxAVFGAYFQBAhEVCEX3j5tOD2CQVcBpUQG3RQYcJgOghEMAsgzIFhtgcKUQM8vp3WmAISUT0DvcgGyyEDNvKNEwoEZCxGxX2u+yVsbgTAFkuxMoLqsBdtY3ATvrg0BZU4SY7SoUAYiqAFEFQFHjY7/vtdYjzQ4Xjuw/q5M0U5PWeiMQjEaBfKcNSLenA470PL1OBhRVM5VFAI8vBPhDEWILedonIcshAWaDHrAaDYDFaACMej0xiyb7P0So0SgQ8tQAgYo9QKB8DxAoKwa8xfVARZ0eqEABwpICmFQ9IOsA9HYHYEzLBiy5hUBNIALU1jbRqYglwk7EOGyw+7zTgUh1XXDbruCy1cGNq/1V1TqjyZyTaR032nbqCR2uPLir2PPqTEmVXWddYO3Zu8P1SDqdbdDQhvc+SrtpWpsFFL/fX1OnGao1oj5fyJvog2d0p9d8t6DN9JpqOKxEox3RrsC3bovOaGyhXQGmY4/zf/Pl5pf/JBv0mVOnm7sUJl9nzcL5vpVLbcf2s194hWxtx6kjhuLzVzz0lBSJuM8oSrtgpM6aaAmy4PcT1KhSPXepunNPyV3/dRTmyz0LXReelbxsByW4p6Ty7y86cvOM+T0MeQVyTnedzW60l0mSUW6sZ+3OwN7ikE7nq6mR9TolFLakpSlIjpPHpE2c3uIW1H0632CyJqldAWWfvecccnxcu/Jt21L/0SxjqrNPnz7Lvv22U3q3ZcuWAaNC3wWLkyw/YFRoy5YtndL0EeKoV7AEAsHhICxYRwJ9eoo+PcU24tjOqjCwcVv1c69ZevXNmjiVw14TsRUdV/fcF6mhsGRsQ+9RwxGdydi8FUNqmremUgkFZWPbGkawtlJnb7kxjoYSDOjNHXSNCixZITvbWPWz9epr69XXVV8rgd6dbJL3hu+WBNcsD3rqzKOOc15w5sEvUNWm1z8wZTgL/jAxsWoVR9LJGReMBDJuPKv+mw0lz3wkW8220SMOqsklSeir5bZu3dOnXnXA0YFF8ZeHsJdQeam5cGCSZWvXfeur2JNyyUTtrX/n9ur3Xjd0L3DfeEXXrl2Tb/OXxlGvYO31+L4vrgD65WQCFqMJiHgbAL3NCYSiUUAzMVj0EuCwaBYLBTDpAXLdAD1TDECvNCfQJdUBNO7cDIQbagGUKCDpjcTciTTzTKSpAYgG/ew32+y3FGm2NCUUBAw6GbAaNK8dGYgoalRRAX8wDDidqYAxLQuw5qQCafUVgNmjAEazCpjcJkBntQCy3sCBJhPNzBYNhwCLwUDMIpVu0QM5jggQCGlWqyigza5dUiXgmHQT0DXFAYTqa+LCyyYzYEhJJ2Yh08wqxqx8wJSaBeis+3fGiAZ8QFSSiRkUNZuMZrsyp2UCJfVNQEmDFyhtCgJV/ijQFIKYvcqgA7DqJEAz8GkmJc1Spdnk/OH9R7SzRh3sM73hC6tAaVMECES8QElDALAYZMCok7XoOe2vQScR86nSBk2zXWU4rIBFVoFgXRUQrqkHgkE/EEQFZKM5Pjg6s42YqS/iayLuiKY5pYWCQCSkApFmvu5GVQa0PSHsWQbAUtANsPUYCFRF9cCKkgqg2hcGVPWQ4zDaQwbdwUvtLyz44al6/vXI1t1Zl19lKezeKRUaM7OsWdkNCxe7zjmt9VnZaokGQy3Ku/v1K188O3fMxNbllUi45ruPXWef32Zb0aYmuUPmq2hDk2/9lvwb72yvgCE51Srq99X8d25kzw5kTCcdn33myUl+eUoffNIgR7s/eZVk0AFqOOrfUR71BprW7pJNhoavN7gKcxu3lVgzUnwVtdbc9GBDk2w3K3rZ2ic/XNdo6Z6TMnYwe3buvX2hPScz5A84e3T1VdWau+Y1btlpOfaYqKfR1KtQDYZMvbrp01Lkg6mhodIKz7crC269JxnhD4qvvCx16NnJlIz4m6qW/DflzHP0LhdQOftd/7rVaddNNfdL1vr1i+WoV7AEAsHhIJYIf8qo4XDjjHmRHXtTL5jUWdqVhmlAkbJjR5unJL3e5LSHKiuMmft3fLKecEr1269Vfvtx5ogzmpsyAzXlFf+bocqSvW//NmsLVZYrzZ45k8c3c4Gte0+9++A+Um2jqr4tmxo+/zhQWWHtmm8cNdR99qmH9FyiT3VKtZ4t05+2pLu9ZdVKOKIzm+xdciNRRS7IxZUa6d7L3K2XnOq2NDTJVouuuCRS36B4/cFqJVzs0TXKgR0lBrNRkmT72AE6l1U2GdhRZsxwB2rLTdZQoLjauDvq2bA78vWyxpJKa0aaqtfbzh1jGdhX0rfx1BNYu9lW2ENn64QtogG91ap5sBwEVSklMcMAACAASURBVK1a9J61ew/n8SMB38Z1gY3rXJPGC+0qGY56BWt7XejLPTXEnGwG5WUAJpMZYrGEeh2QYTMDPVMCQEQJAvVuFbAbJaBfmhEYnp8G9M9yA/UbVgCBsj2AEvACkhZrZnMBOpuDmHlGs1VokWiy0QLIxiDELEuSBKhKlJhhSZPHIGvJI1RfOApUe/1AVk4BYO3aFwjX1wCy0QA4G5rir03p6YA5vxAwZeUDetd+25LWnBIMAm6bA8gLR4BwVAGMOhnItgcBb1gFrAYJ6OYyA4OzU4B8pwXwbNoEKH4vIBtMgM5iB4ypWYA5p2v8r9GVAgRCEcCghdFFI0C4qYGY8UbS6QCDKxXwBCNAWYMXqPQGgfpAFAhFVUAvE5fKYZIBl0kG7PtsThIx7yvNt8yv2bEiCjF/rKjmhNXMOBSMqMCehggQioaBQAQgHN1XyKyXgHSrBHR1GYG+aXagW5oL0HvrgLodG4BAyQ4gXFdNzFq5z7FMC97MyANM6TmA3uECJM1Dy2wFdHZn/LglxQCkVihAxCcDRgkgLzsMuPr2BhzHDAOUnG7AJ+t2AUv2BoA6nwqMRO2s9ToJdGKJsJMIV1Sr4Yhk6Jx5NbB1V/Wzrzq698q/5fdSZ0ePOo8bXvzIJ85wuE3vKHOv7g3Lvkk/d3/YoLlrt8zfXFfx8j+atq0ypObaCnoGairC1cXeypKM8RdmDh3eXkOhqgpb90NeRap++Z3Q2i0Fd9x3qBcCaiTi+ebLhq8XGew285iRqccPlm0dyViRefN0wLdmo2yz2t12fWpK4sVZy6C+LY5orVqLy6offyltwsiMC05wndAPSD1zSLzMvlBPVQ2W1NR9/r3y9ZLif77lPmeMs5VxMbT8e9txnZaVwNSnf92aL+1d+yQutvO9Z6KhptybfwfUzJ/btGJpxh1XGbvkaWcjNXUVFR2JtPiFcNQrWAKB4HAQFqxORN1TXHLrH60D+qRcdamkS37ptSWRqtr612aG95Y7hwxPPeu8TpQwjs5qM7ndoeIyU/curc8ajx/keWOWMmac3Cy3nzEjs+CuB+qXfu1fszLiKwvU7TX26FFw+TR9O95XAKoa3rzecNLQQ5LN+9k3kY3bU8+/uANqpX/ntpr335ItJscFZzhGt6v2JY91cL/DrMFYkOOadF7VG7OMOWmuEe0oNJJkyk/PnnoaYFuysfyFBbq0A3z41HDYt7csY9JB9KHksRUdV7nyu8pv52eOaM8NX636+kNVCWRdeb2k0wX37vGu/s5x3lhNu/KuWBv6cmmgpHx5v5GdJdLPj6NewdpVJS3aGQJkqR6wGQ3AMbkZxCxPBhSge3oKsQxG+Q4fMRNIitkI9MxwAylKEKhd8SXg37MFiDTUEQ+dc6UBequTmN1CMxqpmulI1gGqqkDMahUJE3dCUlRACYcBk2bB2he/hjccBSqa/ECOyw7Y+xQRS4JpSs8m5sqjGckM7nTAmJFLzBfK4Egh5imliapEwgC+RiDHbQOcFhOQ67IBHn+QWEonbbi0di2RANCwaTUQLNtNLARSczjTYgbNed0Be2EfoMofAir3VgLBSJRYOii31QykWJ2A1Z1OLEyvwRcASj1NQFWTH/CEokBEgZgZyWWSgDSLDsi2GYFsuxlItZji0upkCdB817R2/eEI4Gv2tyEYAWoDYaDMGwZKGhSgtE4FKjwA9V5ZS6Nlt6hAQboCqISAnikqkGq3AtUblgANq78GmrZvAkI1tfGPnzHVDVi7dI8PlNGdDuhMVkBntsRvnBIKABFPLRD21AM54d2AszoMGK0SkNI/B3ANORFIGz4WeOf7ncCcjX5g1Q4ZCDfpgJGd51cqfLA6Eccpx6SMKar+58LKBx5Pv/Nanat9zaMtwpU1gQ1bmhZ8qQaCtgFF6eddpncdgtfyoWLMyfUuX9OmgmU99pjIui3lr76Qe92tB5yQJPeIUe4Ro4Bk+lYzf64qqc7Tko2dVIOhykdeUGobcq695VAXB9VotPQfjyu+JtfUC61Fba9X/ljYhh+rT08te+YVc36aKb/t/GRxXCP7GbNStt/5siEn09h1n60ouGWnzmzSOQ6I1FSj0Zr5c/0b19kysrzVFZmX/tqU18bdbBNjRmbaJVOq3no14m3MOXWCdKBxLuJr2jXzGVVSc6+/VTZbvBvXV898K/XKiZZB/VDV2lffD6zd6D7z2II/Tjh3/LmrVq5MeiR+WRz1CpZAIDgcRBRh52LMdOXeM2H7bf+q/8/77eVBCGzeHiqpCG/fbZDlSH2jTpYD1TURr0+JRBxdu5l69Us7bZwuuQSSh4OclUdtuyHx1vPGNP7xqYaP5znPOPdQQyrUSKRx1XeBVcv81dWp0y9J8vKmb5Y3zVloysxJufHqRFaxtgjX1dTPelvvtLjvnK5zHtq1PwymHl0txxXt/sNbPZ+/TjYdxOvf0j07ZUivwOYdcQUrXFljPzAbRWDPrvL//NORXeDuO8Ka3UXdtLzq9ZedY89yHpes3c7SrUfWFdfUzn5ny8sPpg8ebc4tNDpTw00ez6blnq1rbL37pl04SdLro96m+v/OMg3opWlXNU+9HCmvLPzzVHOXg+RbFxz1Cpa1snHldhlIs4WA7u4moGuqCzCHQ8QC4owGE9Av3QUMzNc8N1Ug1FAP+Eq3ArW7NhPLyd48I7yW9klntgKG1EzAorkfOd2A5r8Zqq0iFtYXlHRA1NtAzAtHjUaIRRrajCbAqtcBelnSDGk1/hCwq8YD9M1OB9yDTwSCeT2IGT/2RfM5UwGTOw0IIwGRqALIepnY7Qx7G4h5QYUa6gCdTg/kmMxA3r6IPxWI+LxAaO9WoL5yLxCqLgUijfXxEdbSiRncaYAlpwtQ7g0AmyvrgdJGPzFzoEWvA9KsRiDdaiYWjqflx/KFwsQSo9cHtcToKmAxaLYrGUi3GIAClwUoTHECBalOQPE1AuEmD6D4g3HZtAGXbWZAb3UDeqsdqPQ0ATtrGgBdVQNQ0RQAPH6AvRU6IKMybAwFgAa7A9gZVYCCFJVYtrNAbSXg27EB8KxdCdSsKwcaa2XAYFSBlC5eQG+zA5YuvYh5XGkOZzVNPsBkSwGcfVpG7OttNsBRXwdojquOvoOB1BFnAF/vKgfmbvECK1bpgfyd3wNqqB6g8yxY2mbPyRfutIZ/xkh0/eNlW65+NlRcZizIaX4mUltf988ZodJKe4+eOqtDcqcaXKrBnWIxm41ZOUfUXtUaS/de1d993V7uc73LmfPwnfXP/Kfhqb/lXnuLbDYftMKoz+vduK7hi0+VQEC2mJyXnJNadEwy2lXTkhWNsz8xmCz2ESe7Tzz5EPtB1Oct/ccTlmN6pV11aaeF17aDGo16v10Z2rortHmH3mj0V1VHwxFJknQmExKOwgJfvcd59qnmY/roHC1V5JTJv6r+897S5z7Kv+1XB23INKhL45frOeMk7W143WZ9Rm78bKi8tPL1f2WNPDt10InaEXvXPo27NuyZ96q1dx+9M9kPkikvP+eG2wPFu73ffFG78BstPtk2sCj94stsffoDSsBf9o/HHScPt517GlD95L8NUqTr89ceVEcU8DNQsAQCweEgHcrCn1CvkkTvtDp75oXLKporWGokWv3IizqHu+C2e+X29i1NGiUUqv7wA4PfW79tq2zQq1HFdcxAfffejsFDklQyTDm5wYZGNRiSTG27OskWs/uGqdVP/Lvs2b+bBwxxjz61dc7PqLfJv2uHb80KqbG+sbQsZfAxckF2xuTzde6kdq0JbN7unbMwWusxde2ZeVEH1aPGBXMsvbulXn1kM3qHdpd43p4bLq/Smcymwh62wcNs/QfoU1K1R18lGAjX1UY8ntDSr9XvNpa+9oGrX29pSD/HCcc175Rz6kXVT/zTv6Pc0j07cXP6NOcBe1jVN5oG73+ualq00NljUFy70nAU9jfZ7MqBKTY0oo2Njd+vCu7ebiwo1JlMjqHDm/sImgu6mide3voqNRKpeu2fWE2adlX37rxwaXmXZ64W2lWSHPUKluLb69obBUq7SEBdIAwoqgJEvI3EMmhr4WxaDIi22KyGQ8RMNaHqMiBYVQqEPXWwLzu49kCpuT2Z83sAzl4DgUp/GKirrCfmU5WblgNYdDpiLlBa5KBmu9rnf9PUAKRkFQBuixGo8YfqFRXinlgBQF9VB2Q7bIAjrwexm+QNhoBSXwDwFFcCgUiUWGxgisVEzJvKZrLEm9M6qAmgagF4qMRcxDQvq0hDLbEtFLXyWj4tbTLVUn/pHSkAVgewZ3cZsLXWC+xt1OLy9tui0rXB8YcBt9kQlzAUVYht6qe9NukkwG4wAGkWA9DFZQN6ZLgBc8gHNG5aCYSqSoi5xClayjEtLZmsIxbgqbM44jfLltMVOK6wGxBVFaC4MQTo5CigC0iAtbGcUB2QEskCStKzgIgSBWxGPRCsLiNm0fRsqQB2FxsAjwLg1gIeXdq9VogFWpozcoAdVbVAcf3+KOg8pw3oVXQi+2MP04FwQx2x6FR73yFArSUVWLh+F/DtZhnI37YMaKz8FohG/AB0gveuhnwoUYTCByt5JKcluLPYNmx/EsjaF9+0ZOSkTZl+uFWrasWM/4T27DTmZsmnDM+dfqGk10U9jYGN2+rnf+j5/OOsy682pB3E0QeQ9Hprerpv7SbbcYPaKyPbrJn3/Ta4a6/nP+/vXb5ENhrtXbp4tm9P6dO3qXiPGgmHvT53/96KVe8491x39y6SLCe5PqcGgpV/eU71Bc29+2dOvb7DMQEV77we3rsz6//aTZd1+AQ2bK355wy9wWgZMDj9gqmGtpzDZJPZlJ1rys619ekHuMLhpnVr6mf/1/vR5+4rJ5ljjm7GghzXxPE7732t779vka2JXPgjtY3aDxlANNpUWp7ebV9mhKZ1azybNva75v9aXaSGfL4Wi8tqNFrxn5f8u3e6jx2gpllUb2XTml31n86XrbasKdMN6e0u86mRSNnzj1u65aVdMQHwr9/i+3pF4f9N1jt/QZuIHyZHvYIlEAgOB2HBOkLIiqRL2e+S7Fu1Prh9T+o1Nx9mtaHK8sYFcyL1tc6J59iG7193lq0WQ06m49SRdW/N2fvMI1mXTbP2bpk1oDXGnPxIRdVBi5kK8zMfuEWNRPzrtqiRiD7kZVg/W1FPS/+emqWqA05PDbM/UUNK3q33aH4UHURRwsW77Oef0VmpMVoQbWyqefpVxdNoHzw07czxJK0FSgaD49jjHEVDaz/5qOqxf6ZefLbtlH3Rdrbhx3r/93XVix9n3To+UdOVHjl732aRodIKs9utmcqAcGW5u9egfRFUzahdv0w2GJpbGYPlpdVvvWLISMl9+E5dqlu7TU4IlZQ3zPmk/N/P6qx291nnW3v0amE7jHjqa2a8oqhRxxUTNMNE+LOvU8cda+lxwJK3IDFHvYIVjQRMQT8QiVqJec9YjUbAX1dNLCBO27ZPy6Ot5WTX7ExaqqdIUyMQ9XthXwolvdNFLNWTvddgIHXwSGDF7nJgY7UHaAhGAbdJD/Txh4AhXXOBkGYK8tQAkaCfmD+WZiIyZ+YCmXYLUB8IaXmbNG8kXyQKVHkDxOLj9B45/ro+EAKq/SHAE4wSi6RzGHVArmO/h0SPzFRA29RC26JR2ZdGPEBsn0E1FCS2SaJmtdL+7hsEWQZ0kh2QjUZivk0eXwCo9gWBSl8YqPAqQCCsAia9RCyjldajQDRKzOFM+/pGtORkOhmwGXRAitkA5LnsQM/MFCBcuRdo2LkJ8JdsB0JVZXEJtb40T5evPfvKZgsx56dgRbd4XwZ16QPs8fiADU4vsMWqAorOLEs6QJV0gF6vAjajBKRaTUCorAIIVlUADdUAdQpAABVwIQEGqw4wpqQDppyuQL2iA9aWVQDb6gPxocjz+IGmUBgY3G8oYHSlEbNgaZnVNCvpovU7gXXlUcBaIgHBxm1AJNTIEUD4YB0hmrbudY8eHX9b/+Zs+/EjDSnJ7uvSdp1rV1fNnOE646Ss86e1vZomSSmTf2U6pnfVy69nXDLF2vsgKQZ0+V2C61ZzzphkWpf0ei06L4HFK0nC5dWNX3+X/9u7Dku7gvpvvtRbzfYTDy0NRJLUvP5BYMVa58Ahrqlnt+eCpkajSjAQ9Xj0KaltlJGk1DPPdRw/suatl71LVmb+/nrtrmXceW3NX58teXxO3m1tp78HGr7e6JwyQXvdtHRV86Sv4W1b7N1a+nSq0Uj1t/MzLpkSPxJp8FS8+qJl6ICUyS1dvox52enXX66EQk1fLvMsmFXlabR072k/bqQpJzfq99d98pF/x9aU8WPTTh+lCeyZv8i3e2/vBy9KOGCClhz1CpZAIDgcRJqGI4F/W5kaVU2F+0LAfN9vNJjMqaecfjh11i78r2/lUvek8QdN72Qt6h8+fZTn43nWnn0S58Y0d+nqW7b4cKTqGLLVhEp72xcmj1pRqh9yTKeIdEC1kYj3/fmh1RtTzjzPOXRYq9Oqf/eOhs8WyqFgY+levdmsKgoq0XDI3a1HxOlyjx5jzMiMFzekpmVccW3p8080zpjruPQ8JEky6J3TJlb+7XnLzCWpF7WRR8qzaG3EFzT32Ze7X19ZK3ftET8ryzqDo6Ube8Xn75pz86y99iXKCtdUV7zyvPXY/u5W2tX+eoxG59hRjB3lX7fV98WSunnvRYNBwDqor/vS82wn7Fdb1ZIya1GhpBMTwKFx1CtYeoOjKsUJ9HZGgGy7CZDDfiBYXQoEteC42kpACQSIZ6tSVGKuPJrHlWby0XJtm/O6AY5+QwF7/+OBTzbuAr7a2wBsr4kCWhalHJeWhUsCClIcgNVshX0RiErQR8zhKVxfBQSrK4Cs9Fyg3h/cZ7sKR4htiqfZpbyh/XF2jcEwMYtRuS8CeAJKrAc4TFFiGcytBh3gspiALFcaMXuPJoyWrEvzW9LsP1I4RMyHSUvjtO+15qymvTaY4q/DkSixvPBhBWL50MNRAAktrzrEcqwHIgqglyRiVivTvr86wGk2ADkOK9AtIwXwl+4CvDvWA/7dm4Fg2R4gVFcDRLw+YunE9lmwlP0p27XNJfT2SmL+Z5o10u1wAUU5qcDWugBQUhcFdvkz0+tdQJ3DBOSlRoACpwHIctqBRk8NEPX5Yx8QtOdTKxKQlRIBHD1yAVuvAYCr77HAwq17gaVlXmBXnRK/tswZBcKKQsyY1yc7H3Bk5QE6gwnYUl4NlDQFgcYAgF7bSVNnit8UpI6nr2yTI7RE2NDQsHTpUpfLddxxx8mHvTnxUcfeRz/Q9+jKviDiqOf1D9LOuyT5BabW1Px3dtPq5ek3XmHqmVQEqevcMWVfLqv55KO0cYnWoUzZeYHaesUflC0d3I+5Y+icDmOKu2H5t64Rh5WavHHLpozzrjp4uUMhUl1b9qenHIXd8275fXxVLk79l5/Vfb7Qlppuyu7m6lVUkNUlvlQX9Xt9FXvq1iyu/Pc/oqqaffmVprwC7ZTO7si76XdVrz5f9cS/M267EjDm5+Q8dEfdUy/Xf72h6/9Nab6ZdOOq7aUvLMi469p9QeiRSP3aTV3PvDheIBoKalu+aqiKUjz3n/6a0oI77tWOKMFgxcvPG/t1c0+9MJkuWwb0sgzolaCAf/OOgnsmJFOVoDlHvYIlEAgOhyORB+uRRx75/e9/bzAYgsHg8OHDFyxY4Hb/oAkIflzqFqyU0Kdets9yUPfvd/VWh7VPx1NfVs+bGdi6Ie2maW0kBVWUaGOTzuVseVyS7Oeepi7fmLhmSaczuVxRT4Ns+aFzGhmK+tZ/9rFz6PA29+pJBjUSiQQChtysgxdNGt/q9Q0z5rmKjks9t6VqogSDFa+8gM+fc+qElL5tLErqLDZHYT9HYT81GilZOKPqjZdTL5xo7bXPE042mdImXVHy3GPeBV/Yxp0M6NxO983Tap9+dds1/7D2ybWP7Btp9Kk7q6u+Xue64Exj/j5vJ//3m4wul86x39pnKOgarNhN/2GAr2xX+Wfv6N2u3Btu0x6Doz5f1X9eNHXPT5l2yT7JA4HGz5aweXvD1l2yUS8bDPaxo8xF/Q1Zyd50o8PW/GlWkCRHvYIVcvfo1jcCHJ9nBI7JTgN8xduBYEUxEKqpJBYbqMX07XPZ0ULPzFpOdiugd6UC5uyugK3XYIDc7sDcdTuAT3Y0AWv2aKnAZcBsUAFfjgoUukLEUj1pIRaaw1NsN02JWIaksKcacGblAmk2SzCiAGb9/kd8g7a5oSQR877SftY076WQtvteGGLWI804VWuIEveOavQBFm0fw+x8QG9zEEvEpTmiaQ9AkUZPXDBtQCJNHmKGPZ3JQjwZvaoCBr0OsBh0xPYHtJsUQCcBGPUANoNEbD9BLTOWFpRnaX6t0QCk28xAfqorfrO0BPqBvTuAYIVmetRsV15itiua7TaoxUVqMY9qIAQoQa2MAsgmE6B3pgK9TxgHjMr3AfWBOsCkj1Q36IF8SwQ4Jk8C+qfbALMaAep9jYBmFXe4VaBAigBWhwqkDcgAUo4bBbiPHwMs31sFfFnsAVbvVYAKjwToZJWYm5rNGAJSLV5iiemznDZACfmAQDhKbJ/KVBvAxhwDkO89AXBZcgBJp32+9icqO0ykQ1kiTEbBeuedd+6999633nprwoQJy5YtO+OMM+6+++7nn3++4yIeVZS/8Xndh8sz77tJdtiAwKbtvu83tsyHfijUzp/rXbcm4/Yr47+4gBqJNnz0v8ZPv1IiEVmn09ss5mHHui86YM8T27Cive986A4EEqew0hmNoeJSQ/YPrWClXHS2VF5d9c5rmR0NqwxWluutlk5MfOX58H8N8xelnTneOeLEFqdCVZUV//6Ho6BP1vgLte1ZEyDp9PnjpvpKd+568wX3yNEpZ56jHde73Hm/vbP8xafCngb3xPGA3u3K/MPNkZq6+nc/DKyp8G7dZT3thLy/ny/b90fqNc1d6Bh1avP67SNGlTz3mG/v1qDPa7RajL36pY+/cN8OIuFQ+UtPySn2lGsna0d8K9fVvznLlOZIvfiE7H7nyEaDf2d548ery/+00Hn6Sa5fnZnU0DjsFe9+2e2BI5sI4+fHUa9gCQSCw6HTlwifeeaZyy+/fOLEicDIkSOfeeaZ9evXd1i8owvv8m2RWq/97FMNmWlAtLGp4Y1Z7pPHNvfIOSTqPl/oW7cq/beXN9euQsVlVY+/ZO+alXv9Wa6TBkiy5Fmysey5+brsDMeJx8WLyRaz0WaL+n2JFSy9xaI9ivzw2CeNr338X1XvvZFx8ZSDl26Nohgd9s4RRVVr//V2aMuurMuuiNuc9p8Mh8tf/oejoE/O6ZcmX6U1t1uX8dNLP3nDfvwIQ2qadlDvcKZfPKXs1RcNWRm2U0bsO5iWkn7dVKB18n7firWEoo6i45ofNGZkdnvgr9713zdt3pj5q4vjGS6iPl/1ay8aczNSrpuCJKGqDe/Ma/hmeebkU9LH7/cksw8stA8sdK7bXfLILMlkcp51ykH7Yh49vOm9D2ve+CJt8ugjncr158RRr2BldOWiQUbgnN7ZgNNfD9TvWA+EKkuIueNotist8beWNVvztdISo2v52U1ZBYCtWz+gRjIBn6/fBXy83Qcs2yYDSrEMuAJBoCrFDHhcESCsqMT2OowG/MRC2KI+L/EtAjUDUjAARAMBwGo0aLnOta0JtV32NP8k7bVmwdLORvbtvqfF6EUBXxhAM35p9i1vKArU+IKAUdcE+K0mwGKwAXqzAzDoNPuTDgg21AHBqnIgaLUBcm0lEPVruxBqaVr2xyE6U03EsrTn2EOAovldhbXYQAlwm3TEcrKnWAzE8rnbDAbAatQT2xsx3WEDgjXlgL98D/FUZPXVQNTnI+YwJ5u0TFfa1n56AEmO31ZtMKN+LUYyEn8dqq4kZhXzpGQAJw0YTmyfxxx7Y4U3ClgMMtA/zQwMzkkD/JUlxOJMDS434OrlB9xIgDk3B3AOGgaknXg2sDWoA/67rQL4dqcCbC+TgaBfBowWBbAaFcAT0Jzq9m+bqDm0GfX7nee6ua3AkNwIABFgR3oG4PFlATaTZqjvNMfkzlWwampqvv7669/97neAoiiyLF9xxRWHId1RhqLoM/94u2w2AYrPX/7A49bCXu6Tk4rRa43n26/rF3+WccPlpu77/a5qXv8gsOL73GvPco3e79ztGtlPZ7MU/21mcwULQJYi9XWJQxdDjY0mfpzVH31aSspvr6j6+wt1n3yUcsY5h3q54vNFQ+HDFyPqaap+7CW93ph5xTXGjDYWHCteecGV1yP7ULQrDXtB7/QhYytffTHvtnviB81du+XfdFfVay95v1uTeftVCaIQQsVl1f96O3f69Voo9wFIkm3AYNuAwft74fOWPvuoISc95YbLkSTF66/8y7OWdEfvl25sM3OVbUDXnJvP3fOX9839exq75ifuiG3oQEufHrVP/rtqwYqUcUPM3bIMGS41FAnXNmzuvTmZofhl8otzPhUIBM2RQScl+++g80VJSQnQ2Ng4atQoq9Wak5Nz5513BgKBH6AjPwWMx/TWtKvQnpKav79o69k3Y+LUjlXl37Wj4YtPUqddbO7XM34wsHFbYPmanBvObq5dadgHFUaDITV8gMKhRqMH2X5HVcNNTYYueR0T8vAxZGekXju5afV39V98eqjXyhaLvrXmcYj4Vm8o/8Ojeld65lU3taldRerrQlWVGaM7mKEgpejEYH1dtOmAHCuGlNTMy6+OVtXX/vX5wLZdbV7oXbqq9qmXnUOGmQ/cgrBNQhVlpc89ZhnUJ/32q5Ekxef3PPeqzmrI++OlCfKCOob0TCnqGdxdkkxHZLs1/Z4b7GefGtjpqX3n27LH5lY8Nz/wbXFlRWUyl/8yOeotWCMLbFcN6w0oZTuA+g0rAN+uTcT2B9yXlHzfukqJLAAAIABJREFUDnEpgDEtEzCm5wLGjDzAnF0A2PK6AetLK4Fvi0uBRbv9wLLtEmDcEQVsnmIA2QDonAWASQ8xs02KzQIEdtQRSzGlhIOAbDQTc2aSjCZiyaUi/rC2T59ZrwOsmteU2QiYjQZAUVUg1R8k5rJj0XsBuzEI1AejxALpNM8nzXarmUaqvH6gIRgiZnjQSsoS8doyHFYgvbA3Mde0fY+y2nJ+NAJoU3bE1whYlDCQ7bTFWzHrZGJ7EWoRgi6zAUizmgC3xQTYTUZiPmFav/QoQKhWSzRVBkQ0q5W3EVCjYUDLHGhwOOODpuXi0lntxGIetVhCbajDnlog0uABlFCImLdZqLoc8O1YH78RY/odC3RPravxBojZHbUk+Cm6KNBYXUbM7mjKzgOM6VmAMSUDsPYcAKQOGQ18u6cKmLetHPhmuwJs3asDHHUAekkF/Pr9dh/N3KiZ+rSbbjcbAZMsAU6LC3BajECGzQz0T28Cyr2h+CBredcqv+k0K/2hWrC+/fbbwsLC5gdvueWWW265RXtdXl4O3Hjjjb/73e8efvjhVatW3XfffY2NjS+88EJnCfxTR1U9cxc2LFzsHDIsrZWjdJKEKsrKX33RfeE429CB8YPBPSXVz7/e9f6JtmNauboDIOt0Ua9PH9ujRg2GQk1NbaYdj+PbsU026PXuVj7yPyDm3t3d0y6ufv51fUqafVDL9E4JkHS6UGPHk8OFK2uqHn1RJ+kyJ0+3FHZvr1jtR7Nd3Y/RfkE6gCTpTHaXd8Na57ATmh/Xp6QW3HFf05qVVU++bHTY9D26WocVSUa9Gor4lq0Ob90V8Qdypl0bj0NMgHfLxqp337CfMNQ9aTwQqamreOjp9NOLMq4Yc1Cbs5TrDq5ez8ESf+xDlp1jT2LsAcdGnXTSos8/T+ryXx5HvYIlEAgOB0lClpJdIZIkioqKWmhLzSMEjUYjcPfdd995553w/+ydd5xcdb3+3+fMmd53dmZrNrvplSQkhE4gdEEQKSIiF0TAgnrVK97rRQXb79q9tquAAooKIohIL0kkjSAYSO+72d6n9znn/P747pndtN3Z3QSJ7PPKa1+TM6d8T5kzn3nO8zwfli1blk6n77zzzh/+8If2cXffe+cj19Ta+cX/kc2Wig/eVEwkGi20bCb8+B8855/pPu+ACIPY757wnT77SNVVtrVXsdkUz6DXLL11l2dy/fA5WPnd2xyLjn6O1GhhnzvD94H3xp5+xj5txqHtDo8Ek90xtgY7aiQWefCxbGOLa95C3/nvGb4vpFJRJffHSlltIZ0ASc0kJdmk5nPoWqptX7ppcyGftU2ZdthFXAtOdM1fGNv4evIfr2qr3og27vNOmaJH496zL3SfeFIpaqfkjm3dj/zGd80l7mWnAFo6E7vnd47p1cGbSnowbdJ0U9UYBYITGBHHfYEV0lPxtU8Dmba9QLazFSMdW1c1wORwAJayEAZTZa1uAOzV9YC9qg7oT+eBTftagS3dMeDvHVlgVwdAstsEeFN9MGBhy1t9gFymAXUBgGl+J2DOpYBYuItiJDpgNPUTbfKs5VVAUgXoTaRE3pUgM6wi2dzlYJAAywEVNjtQ7g5ihIwHo0mgN50F0vmBTCvAqgw6EAXDFMuKXoEaRu9C8V3qsigYCVtifrc/iBF5X0hEMNo1arnBMPpstB8IlVUA2XwBwxsoUrjsZgXw221AwGXHoGcKQo6WSwFqMgfkRXPGZKy4rYG8LgkMulEymSnmyLv9gNkfBMzeAIbzUWRMDTSU7OsAst1tQD7cC6gDcrc0hidxIAMsGQOCFZOqvV4MSVYh1gUk+ruKB0F0DLRPmgaYfUEMfV7GGwL+vK0FeKExAby+D6C7RQGq+pOApGtA1OUCbDYd8DkBgg4ZKHdYi4dIKWSBVF83oOYygFkxAzPsLmDO1ErAJMJ4NA3IJaLAz9dztCAZJtASZ7bZbAcxWENRVVUFLF06qKhdvHixpmn79++fNWvkzi3HPfpigauuH4YOGRG6prX84FuOWVO9Vxxg78rs3Jft6Kr/2jVHWrDjnuetM6cMLaeif3rGteiUYbalplO9a1fXfOuLYx7tUYT7zKWFXY2tP/7O5P+8u9RlZLmQTo9qK1oq3fPD+/Kdvd6Fi8s+cfXw9N7AwBYvbfvJd63VM1x1M0w2h66q+WSskIzGGrfJkhTb86aiKKlIn5bPSyaT2WrTVNXicuUSCXt5MJ9OeZZfOHn49tuy7Fm8VMSZCu6xpC7ZAETXvRJZ+XzgI9c4Fs8HtGyu86vfLztjduijF5S4hthru51XXHzYt/JdvZndjVo0XojFFL8PTVfK/ciyZFZQNS2VLkRiSiL14qQFh118AvwLFFgTmMAExgNJ0kfDYI0wZ0NDQyAQ2Lx587Jly8SU7du3m0ymYWqyfyXYZs0fT3UFxJ77i60q5P/I1QdNVxNJ36zJJvfhuZb433endrcHP31RcUquuU1LpA6TQj4EiVfXehfOUQLvlIgy7w3vz335B5nmplJUR4CWy1k9JT/c1LTw7/+SfmOLY8q08ouvstYengg8FGZ/mW/5hd3rnuxYlStkMyCZFMVZWalJsnnyFNu8+fbJ9YGKGpPXK729gbqZ1v39Lz4TuPWDjgUDEWvJPz2jOK2hm0utrsIvv1VIpB3zD/7lk9mxJ/3s31JNLfZghbk8qGgafR16JpMv7FFzGVk2aZqm2OxYbVLDtFkzZ25Yf/R+8P1r4bgvsJK7N/c7YkA+EQe0bA6QRai3xwtYAyGMLm/2upmAs246oDk9wN6+GNASTQBNkTSwJ5IDeuM6kM5JgKoAJFwBQJXLgVRIAhbVq8ApNTZgYW0QSDZuAfJ9nRg5WCJKylJWCdhrpwJyWQWwo7UbaIunhcoq6LAC5U47Rux7tq8bg5sRv34Utw+YFKwCgm4n0BNPArFMDsNvKJgkkQUv+KpUPg/EcgUgnlOHvKthdAkU8V1eu7m4LaG+EgIyAcMUmQBsgRDgd9oA00BqFxjewAEhWl83EO/oB9R0CtA1YYuTYIAIFHsqRHJCU6U4PYCImRF3K5PTA1gClYA1VINBAZodg/bsfDIGpDtbMXoXZtsbgVxfV3HrYvyZrpbi62xXywANJgyJA4PJFYdncrgBa7AGcE2dAzQl8sCKzfuBFY0Z4B/7ZMDUAlAT7YKBCK6MowxI+gCmCaazTAIafFag1ussnsRE8x6KxFusH8NtOhBVr2vF1wPJask4gO44WmZpyTh9Jc48PCwWy80333z33XdPnTr1zDPPXLNmzde//vUbb7zRNmxSwAQEOh/6daGnPfSVz3BI9mahs0dLHp6t6Xl8fc8f1wQ/d4u13vCCaVr43od9y84bphdNIRrpX/1y1d2fK314eqEQfWYlfZH465t882Zmkin7GSdZJ1Waa45OA2DZbHacf0b/X/5Y/ak7Spk/3bRPL+3azexp6v/F72xl5cFrb7Q3jLoC9p1xtu+MswE0bfhHrm8b9Fy284F7fFdeVKyuos+tymzaNuVnt5UYB6wX1N7fv+K69LyDgl7jr2yIPvqMa9FJk/7jxkOD7A9FXV2ppWopUOSAVTn849TDzbznKG76WOC4L7AmMIEJjAeSNIqvjFKKuq9//eudnZ2XXHKJaDR+/fXX//CHPxzHAN8tSG55K9fS6PvIB2T7Yb7VnKcs6nxuVde9LwRvOEe2DnwjJt5qTDy7Mbyp0XvVewarK+i/9w+K3eU59czhNvfqas+J85XAyM/IBPKdPfH7H1VTWfuipe6THObqSYX9jbyxs/OhPzsrQ3q5z/P+i8yh8pJ39/BwnbEk+sQLaipZihIrt2ubFBq5eXZ2X3PfT3/jmDUveMU14/1Z8s6oroDExjecUye7lxuBqLpeeO3N8hvOHtpyZ3h0//J5S3Wl55wDOiFG//JiYsW64Puvdc4dbz/vsWFvhhdLDlHem6FyvN0sjy2O+wIr3dkRd6gMEh42wOzxANZQFWCvmwE4pswFXA2zgHBOA1o7+4CuRAYjAD2aLWBY7cRVWuHVAbOpAOQrJMBn04AlQYAz6qzAeVOrAHO4E4g2bsfoeygUM4rHB9iq6wHPtLnA+n1twMbOKNCVLNiUwf6DVR4nBnsklEminaKeywKy3YFBcggWZ3IgBOR0CUhl80A6nwdSOdGvMFtccyqvYkhtdEnC6HuomIRyy4ShVdLSKUDLDGa+S5IMRn76AIRjcXBZm1BfOe1AqrMVyHS1YrRf1ETbLEnCYKdkm0i0shT/Sm4/YLK7MERRYk6zx4/BXZm8AaA9HAfCvZ2AqmuAx2YFaiZNA7y+MiDp9AIm5z6KPFYqUTyS+XA3UIiFRW84sSPi1ikGo7h8gOLyAvaaBqAjowFr9ncDf9ufATY2yoDSrAOeaDcg6SqQtQeA7pAVmFJdAGZXS8AJISswM+AB6sq8QLq3C8iFe4rXTF4owGL9gJqIFYctSLhCSuSrpQF9zoVHy0Y4WpH7iLBYLA8++OBPfvKT3bt3T5kyxe8v9Sv83Yz+Fc/H1/4teMfHLJMOzwYpAX/Ff9+efXbV9uu/759Tn+oKq8mMVlDd559R/b3rRNM6gfDv/5Letqf2U3cMnXgQ8v19vWv+Vvvt/ypxeJmtu7p+cn/ovVe5TxoUdbkWLgZ8up5u2pdY/0rvd+8ppDP+ay5xLF0osirGAMlqtVeFoq+uLVs+wnMuLZNJ7NlV9bURGLj4yvXRx58NfeAGx4zZYxvSOxPhl58NfOrfiv+Nvrg63dvfcHZpVZHO/q/9IbWzrfrbXxpaMsZeXJ1Ysa7yIx+zVo0QizWBEnHcF1gTmMAExoOj+4iwCI/Hs3jxYfq1TeBg6Hp8/er4+tXu911wpOpKwFwZMt90jd5QJ3uc1rYu64wptpkHPu3S9f57/qA2d1Te+DHTsOKk9OY3vSctMJWczpB9cU3g7POHVleDkCR7w1R7w1Q0LfLqGu3N3a0P/7XsrJOVRXMPHl5pkKdN1iPREWeLvfBXz6J5wzNwuqalXnzFddJpb0N1paZTufZW2eZQUwlLZbXiPobJF2osquZy1qmD8bOSyRQ4ZXYpn89CLN31v38lXgj91ycl62CKWHzF2vhfXw5eff1EdXUUcdwXWFq2INyCissB2EJBwF7bANjrZwHOqfMAz5TZwP6+KNAeTQD9adE9sAAD3xs+m4IR5hSwqUCdT5jvAEwyQNChALMDDuCkSSHAnegFopvXY4SGiwZ/JqcbMPtDgKNuOrCtvQfY0BYB3urKAdE0PgeAw5wDZog+epIDg08qCDIjGcdQKQlKQ0snMfoGCo7H7XADfp8bo6WdM5kGFGnwB4pIhxeclseqYGSyB1wOIN0sgu8jFDknVcWI7xLcktiW4MMiyQxQ0DSMrHlV8EOxfiDX2w7ketox+h4OxOi7fYBZLgdMNieG1Em0KZVkCcPrJzKrzG4voFnsQHNfBGiNJoGeZBbIqRpgN6cAEWo1pdwL+GctwkjMMjn3A3lh7RS0kIjUz+d0cWp1rbibCGmXWy4OTAjOmve0Yujz2sMA8ZgMhPJZoGBxAQmHE0hXSsDcmgIwv1oCTqy0A3NDXmBa0A+Y8xkgHe0vnko9n2FQZZUA8pF+IB+NAvl4AiiksoCWUwHG3jj4YMjSwLVd4swTOIrI9XR3/OpnZpej4iufLvFpnVv0Vzlx/kHT1Xii93v3SCqhGz82YrhoeM2K4OdvKXGQsRdeyXT01Fw70vyy7DvtLE47yxOPJda/0vuTByxlPvc1l9jnjS6uQrJaU7s3B4adp+eJR1Nb36z+zpeGnYvIn54xWR3lF713VAMoHWoq2b/yhcK+3Zm+PpNZQVFsAX+2LyJJ5BJJi8tlrpnkXnq6fcq0scVJHAnppn2K84BcrnxntxZLjLhg4s3Glm8/Zq2tCnzulqEEZ3zl+ugTLwSvut4x81+K5/un47gvsCYwgQmMB5Kky/JRcxFOoERkW5ujLz6T6WhznXmS+5Jzhm8XODx0VU2ufi386DPeRYv977limCeDA5vubLe43ZaS09u1TTvdZ51XuvxIcXt8F1zqPefC8MvP993ze+8pJ9ovOUfxlsroOJaekNvw1jAzJHduy+zY4vvQ+4YSMIcfSSxpOXG4oIqxQVfV1M5t0Zefy8cittoq61lLyg6hA7VMNr1pe/rNbak1L3Y+9KuyRYuVKTNc8xceFW+K4vMPdAwz4Fg4r/fnD+Z7Y+bywx/n5PaW8G9fie/v9F51ievMk4bsjB595KnEujdCH7jh0CaM/zLYu3fv7t27Fy1aVFFxmLB+AVVVN2/e3NLSUl9fP3fuXPlo6O2O+wJLcdmdDbUUFVc1g9yVa8ocoOD0A5tbu4HORBoj/El8UdjNJiBgthZfCzJGvC0sfmJOEVVV7rID1V4XENu9GYjs3AikGrcD2d5uDDWY2V+O0eXQXF4JbNu0D9jcnQN2dwJk8mS9AP0eFcP3J6Dnsxh+N8EqGd338jAg8BIpWYLTGmBr7E5AcXmAan9ZcXcUk4zRB1DVNMBttRR3REvFGOwAKLLUCxiskuItA6wVNYDu8gN7OvuAbsGQyXLxEJW7/BjKLcG9GT6+JGCy2SkSRb4ARZteeWVxzKYBHmtwnUJbFo6ngEg6C8QyeQzBXFJoyzIFjDywnKoCDQEvUDtrIUa7yWyPyMfqxsh8V5NR0SnSMEsKJZYJEF9RQo9VUDUgK3x8mtDkAThcGtAtWwDFbAGqylRgSSXAwiozsKjCDcwM+YFJZV4gG+7BaAE5VJomWWzF0yfkveJdNZsFTMJoKQ6LfrRLHAmp9DvJBIM1PhSikeTWTeGXn1PsNvupi0K3XKmUjT0lQUtnkn97NfzkS54pU2s+9hlLRUluvti6V0zVpWZLZptaYnsaGz5022jHJpnNZRdd6jv7vOgLT7V/8X/KbrjSdVpJj4zNofJMf7+ey0mHa4PTv+L56OqVoS/cNlTUfyTEt+0KnbhstCMfBsmd29IbX4tt3+ZumGw9fVH5spMP60gAZJvVuXShc+lCwNUfTW/cEn72L31PPe6YMz9w0WXjqacBs8+fDUeHWhrtc6f737O86Y4HKj/5HveJUwfKOJ3M/u7omq2RF97UCqrvqkuqP3XiUC4t19ze93+/tbq8Vbd9Zsz9yN/hyGaz11xzzZNPPmmz2TKZzJ133vn1r3/90NkaGxuvvPLKjRs3+ny+SCSydOnSRx55ZPzhMsd9gTWBCUxgPDjqLsIJHApdVaPrV6tNe2L79rimN/iuu8x18qKSjrumaZmsns3pBVXLZtH1XHsXqpp+a7s5mYntbfTNmR+68jrX/FGEPZp1VZ83o8SZc9v3+k88acxPuGSbzX/ZVZbps8JP/Dm3bXfZzR8Y8RqSTCbP9CnJ3TtchxjZ4n9fn3x9vfeqi0uprgBZURT3uG1mmpbe3xhbvULt7S7kso6TF1Zc8UnrpOrSV6CUed3nnu4+9/TUm9sST69o+9H/szVMC1x+lfD6jAEmj9c9qS715lbHkCfFrovPVguFth88qWuqYrcqdluqu9/m90pul+eqS50nH0CeqdFY4qkVydc32RqmBa/60Iis5/GLu+++e+XKlevWrTv55JMffPDBm2++ecmSJZdffvlBs33iE5+IRCJ79uyZOnXq9u3bL7300g9/+MOrV68e59aP+8Nqr671n7wcsFXVY6idlGA1sK+7H2jubgd6UzkgM9AyTwLKbBag0m3H6EMncon0nFDDZAFdUwFd0EW5DJDv6QZ6trZiZMenW/YC2a5ODL5BeBgFYWP2lgOdkQTQHMsAnVGAvrgEaJrkc2gY1kWhkdIG8tMzGPnmRsq5BKgmQa7EAWGCE2yT0DmJ2C3BGIl+fOWBEEZalUhaF6opl9UMlHtcQLJ1H0WfnaoCsuj95ykrHlh7zRTgtcZ2YHN3DOhJFwC3Rcag+oQ5TmCAe4uFgUIqiRE0JdYpKxbA7C0DzGVBoDeWBDLxwa7AsixhmBezhUGDp3A+inZ+qQLF09qXyRdHki1oQCydBap9IcBXWQtkejsxeLVcuFs0QBRSNhFbPyAFE40ORRqWLAF+uxWY5DEDkVAOcNkGT5zfATAtoAALQk5gfmUZMLnMA6S6WoHoziaKbJnYK0GZ2Z2AeUB2JiyWDoxIMLMvUjy5A6dGjJCjBkliNI8Ij96G3x3IdrSFn34i3dbiqKlUFs6u+eQH5ZEebGX2NOV2N8VfeEU2mXLxhGKz6qpqcbnzmbTN51OzOXvtJBmrbfFJZdd+VB59t+P43j3+84YLIB2KxIp1gfd9YLSbOAjO2fMs5RXdD93b+6NflX/2oyMvMLMhtvIF15z5xQtOy2Y6f/XzfDRc8aVPKsHhBVqDKKQzImZvbMi2tSZfXxf5x9+d1ZVSfa33ynOtDSN3BhwGjoVzHAvnFPrCkV8/2vzdr7sXnxy4+LKxfaisi5ZGH3nafsIcSTFqX1n2Xn6B9/ILtEQyu69ZKS/zWsxK+cExFoXuvuhjz6a27HTU1lXf/oVjKsb/p0NV1QceeOC222479dRTgZtuuunBBx/89a9/fVCBlU6nX3jhhZ/+9KdTp04FZs+e/eUvf/mmm27q6+sLBEq92A6L477AmsAEJjAeTDBYxwJqMpHY/FZi3SqtkHecvND5/nPts6aOvJimJV9eG37yJfec+d6zL3DOmK34y456PriazZYYWJVr65Rlk2PaGJsqDoU5GKy87d+7f/2zyB+e9H3wsuFn9lxwZv8bW7p+c693+YUmpyv2xobUP15zzZ9Vdun1SvkoUj9sPo/4eTxa6KoaX7Oy728vu09aUPH5W63T6sewkiNBCfjLv3BretvuyG8eo6/be9nVI5gSDgfPoiW57Zv6fvSr8s999KAPsOxy2k84RKuu66lNOzIvr003t9tqaqs/+slS2kgf79i/f39HR8e55w62ZTz33HN//OMfHzRbLBa75ZZbhs6WTCaBwjiqc4HjvsByNMyuuOAaIKGZgB19EaBpyz6gPZEFIlnBNOgYdEuNywpUuOzA9FAZoKSiQGzbdgyZjiBgBIM1AMFjZVIYIp5cXyeQ7ekGCskkFKOezIBsG5RDxTM5IFUQMetgeBItii5aX5TZTRg0iSBUBgaQz2JQFwZLr2OQano+D2iyCP4uYOQ8aUPiyGWTAvj9AQxVU66gYuixRHC5WFbwYUIGJLm8gLWiFnBPnQu8vr8DeKWlH9jcVQBiaYByF4BNSQFzkmnAIegfYa9LJop/B74ndA2DpLGWBYGWvijQFkkAqYIKmGUJcFnMgMNiLk5xWhRA060cwAERzapAVtUweLVEfrBXo3AdljttQMjtBipnVgH2eDjT3QbkejswyDatkMeI/lIzSYxIeuH+EwbMCkcSIxzfYpKBKpcNmF7uBardNiDRtAvo2d4CFJLRwdNhtWMkbIm/AyZKTxmgqyEMvkq4Cw3uqkDRzul0A6zeyFGCJAvhWakzT2B4ZJqbEmtXxXZudzXUeT78Pvuc6aWWpbre9h/ftHp8Nbf/h9k/cn7mmKHm87LLMfJ8EHvkKWtDyeMfCSaHo+z9H2y/96fmaZOdJw33TFO2WHwfvz7x8tr+x36Xi8c9C+a633+h6/Qlo91iIZ/P93aPVl2kZTL7v32Xc0pd1dc+Nx6F3PCwz5lu/9YdyRfX7P/eNyqvvWHUwZ6yXHbVhzru+XHX3f9b/tmbh0ncUCPRxIr1sZfXOMqDptr6SZ+7aZwKsHcUNE3LZDJDpyiKohhPPDs7O4GhwvbKysq+vr5CoaAMeSpaUVExtIF9a2vrj3/84zPOOGMYRXyJOO4LrAlMYALjgTQakfsEgzU80lvfjG9Y7Zg3s/JLt1tqK0e1bHLlervPH7z5dumQPjlHHVIJeRtaMpXa0zTp00dsLz0GWKtry5ZfpG54i2ELLEAJBXwfvIwPjrzOfHtXIRy1NkySHQdLmhxVFdIofxPohUL4jw96T1nk+fD7R7VgEcnXN+mNLdE1r0myXMjmXJVBVcd2xhLbnBnmqgNLPVl2XngWAV/44ce1XNa96KQjrPLwkG32qk98Pvri023/9e2yUxcztc4+f5bJ4wK0ZCrb2JLetF1q6UjsbytbsjTwnvd5Tjp1xHUed1izZo3Pd0ARfOedd955553idSQSAdxDdHhut1vX9XA4HAwGD7vChx9++HOf+5zdbn/ooYfGP7zjvsCKmewrm3qA/dE00BLPAz1JDUjmdIzkHp9dAjwWE1BmtwB1ZR7AFO8D4rs3AemWPUC+vxsjKkl8OKWBwHEzDLBAA0FKuRzGrUroKgaingYMfS6MOHKxlEORAL8ToKDpgN3MlIAMTPfbgdoyD5DZtQ9QkzEMPdaA0UwxY6RDCbHOUGWikBpogg8Xai1LqjjUgeZ6os+grmMkSGGyAWaXF1B95cX1Cx7LOWkasLs3CqxvCwPrmwvAzjYJyOQkoCagAZXuHBBJZwCnSQG0fB4jdlxNpQGT3Q4DHIg4OBldBprDcWBfJAmk8xrgNJuAkFMDKmQZcDisgMNkAexmM0aCvPBISlIW6E3ngXhOA/rTOtAWLwBWJQu4LUkgaI9hkEyT/Z6GGQuApMsLZDqbgXykD4PYK0T7gbS0FyNK/sSaKmB+TRDIqxrgtJqBfDQMpNp2A92vC01eCwYrJuhGcVUIV+lAs0VvAIPHEq0VxSkeOKGCPRVEnaIAitUOhJMpgDVvcrQw4SI8epAqA9W3fWoMFVK2qbX/sWdrP/WFt6G6AvRC4bAevaEI//ZxV/0Uc9m4NCiHwnPamfv/3wuWnXttM0t4ZjoSEq+8Gn74r/agv6cnYgmWVR7YWjGXStPe7Jg1itS4lh9+yxIKlF9/xdjG0//L36W27Ahefmr9t26wBL2SLOd6IrENO6Xezs5vPm/xut1XX+JYOHfoIs4lJ5grgp3f+qmIdUHNAAAgAElEQVSWzXlPOf1Iaz4sZEXxX3y5Z9l58dfWJf/6cuxPz+bTaV1VTWazp65OlxXXGReUf3jasdOwpxv3btm8+RitvBScddZZK1asONK7QkEVj8eLU6LRqCRJB9VkAnv37r355ptfffXV22+//a677nK5XIfOM1q8gwqsY5FCMYEJTGB4TGiwDoux3Y4sddVjq5Civ3vCvWDRUa9mDgvFZlXjSSUwXIFV6I/kdjVWfvRTR33rksnkmz2v0NPPuAus2PN/Szz/t8lfudZ1QkM+nNh7+y+1dGZoboKttkpyjMJFmGnZL0PZJ64f24We3bs/t7dp2k8/ZgkO2n1sk0O2ySGg/NYLwi+92fXAo+q8TY6rLzV5BwdmmVQVvP2G6AOPO+fOH4Pq3ORw+s4+33f2+QC6/vZ8StNN+1KrX86F+xI3Xfc2bG5sqKysxHhQKNDZ2RkMBs2HfEg3btx49tlnn3rqqdu3b29oaDhaA3inFFhjTqHY3Z9Q90aArrgORFIAIhFd6Jy8DjB8Xj6rCaj2OACfWQIiO3ZipFhl2hqBfDRCkXWw2QDF7QUkxQOYrDZA/PgTfi7hFhRGP6GSMQ+EPA02K3VZLUCt2wpEyjUg5NIAr02eV24HFlQFAD3cDWS72zDi4IX4ZigxJsxlJqcHg8cSGNBRieCuAfJDsB9S8W8yK3imbHGpbL4AVPjKAadwIGZTgOJwA305DdjSGQY2deUwuKtsqwkwqzrQIctAX0rHSKISrf2EZ1DLivDxPCAC98VvKbEvfYkU0BpLA03RHJAp6IDfpgJWRQYCDitgMZkAj31wf21mEwafIlRl8VwB6FV1oC+tAcmsDhQ0AGG18dryQLUrC/Slcul8AZhTXY/hGxXKp1wqjiGGK0T7gGxPO5ASh93mwNh2JpUEcuFuINfTBmS7OzBUeoLjFD4viz8AiO70mm+QnTZZrIDZ5QFSuXzxpGSFQTJfAOKZFNCf6gE6kxmO6l1UkpBK12C9OwqsYxSKcyQU+iKZto7K60edNTU2mKy2XHP78MHxvd+/17Vgibn88I9Rxom8YlFf3+Q6Y3RPxA5F7OkVVR+/yHVCA2D2u2xVZdGnV/ivek9xhkw4IqdHccn2/vG3zgvPlJ0lCdQORdf376259YKh1dVQSIpcdtGJ/uUn9P9pXesd36r8j9us0+uL79rnzswvmd95389qP1tqg8jDo7SPaCEaTm7bomYzaiLhO+WM0Z7o/uf+Gt2w1nnaieWfuf7kU0558YUXxjTWY466urqGhoaXXnrp4osvFlNeeumls84666DZNE275pprzj333Mcee0w6qve4d0qBdYxSKCYwgQmMgIlHhIfgbb4dpf+xuWzBiaKb+9sA1/RZ6rDN/pIvrNazed/57xlmnvHAWlOrdY/XnwWYrGb3gsF2h/aQX609IGrVUlEumUu1C2TbWiRZdi8/bWyD0TUNdN+5C4efTbIogevOkoOevgcfDXzxEyb34O9w9xUXRldvyPf1mAPHpK4VSO3ZnVj5fLqrw14WspfX6IlI130/xyRX3vqpEs2MPY/8JtPSVPFfn7DUlhRs+0+EJEm33nrrN77xjSuuuOKUU065//77165d+9JLL4l377nnnhUrVjz44IMbNmzYs2fPZZdd9qtf/Wro4h/60Ifs9jFmlQm8Iwqs8aRQdCU0tVsHooK7En44CUAY9BwWgJDDBNR67BhxTan2vUC2sxnDRyaUNGo6g8E6CL5BRJlbROC4249BKRlB6nFATQ+GSIkWe7LdhUEsBVx2YGqZG6PXoZBAlTksM4J+oMKsA7EdO4uDERY2IQIbkO94AxjNDQWDJXyFIsBJE7IwYYKT5eK7gnKLp7NAdyINdCVSGJ47l1kBwqkMEHI7AKfTD8RzeaCpPwbsj2WArhhANC4DFYk0oEsA/QUbhklTlP5iDAMMVqEA6KpOUawm0uGdbqA/lQG6UnlxHoH8gO5IA4IOFcO4J5Lo7VYzYJJkQJYkQFBQjnQWUIZ0WhTyu/4kQGrQUkmfVQfi2QKgkXZYBtP53S4PDCS5Cx4rH+nBIOHEU7SBnCqzBWNvB2LrB7iuMAYDWkgJ6RuASUSdObLFkyUslgMHSh38pskLKi4j+lRmgXA6C/SkskBHIgu0xgtAEP1oFTuSjGQqdVXvBhfhsQvFORLiz/2t/H3XHos1Hxaqw5lbv9F9zuErifhLq2NPr6j51B3HTrijpVLplvbxK1zUbD6yekv5e08GdFWLbGn0LTmAFcu1d5vcpWa8df3+fsusKaN4Xn4gCt19smKSSuvr6T9/YXZ3R98P7w195d+LEyWL2blwbv8zf6n4cAlRYWNCeOWLsTWrvLOXTrr4liEPQPTwm6+0/Oh/Jn3mi4pvhBSM3sf/kOtqC33pk6V3Cv/n4o477mhqalq2bJnJZJJl+Wc/+9ny5cvFW6+99tojjzxy33337dixA/jBD35w0LKXXnrpOAusd8T98tilUExgAhMYHpIkyXKp/44uf/7OxNt8O8q1dZoUs2PG29cGznfy6fnuPhHychBS696IPP586PqPKJ5j+PWp+HyK4ygkBbjfc07fn15t/8ajXfe/1Hj7PYrPa597QEK9zee1VpeU+a4XCnou53//RWMejBIK6JpWED/0S0DwhnMyHT0HnQXb0oVmhgvuUpPxxJbhGjUOD9lmD8w+seqsy4fKS0DyL1zmm7Go+6FfHXFJALRcNrNnl/9j1x8v1RUgy/IvfvGLcDi8YcOGaDT68Y9/vPjWfffdp+u6y+W69dZb9cNBSLjGg3cEg1ViCsXmzZs3H2hY6O7uzquIDn5CZDPQJ84KRkRTfZkJmOG3A1MCHsBayALR3k6gEA9j8BADBjeHAzB7fYC1chJgr50K2KobAEtZBQYtJBiIQjyCobkpJGMAmsqBDJYNDZga9AEBpw2QkICAy27OJoHE3u1AtqOZYudB4fsbYj2zhmoHB+BwYQjFBIUm7v0DjeoEzzAkHFxkmncl0kBjJA3EcipgU2SgMp0DopkcUOYYTJkSTRsL+uCBtdl0IOqyA6qQuDlVwGsbTK7SIhkOJGYkRdA/FgwBk3ApJqIxIJZVMTgnoZdyFcAwWuroGFyNPOCC1DCy6YUvUmYw813VwWDCBJ2ZzoERPyb+Ws0AkYwmqCyhc/LIJgziTfCRwlFYSMSLGxXcleA1B3gscdiF2ROpeMCVIfSSSJ0R2mdxgsT1pibjQD4excjHcjpcGLScgCAahbxMJLpFszrgy+cto4/wPjxGo8F6NzwiHM/taAybC//uCVN56O1Ut5k8XsXlij73N997zytO1PP57u/8Uo8maj75OUtwvPE/w6MQj6fbOkcRGHoEeC8623PuGZHHnsl1pJwfuNw6rf6gw5hqbHYGSorTjK5frbidJv/h5VOlQJJlk8USXb01cGlJ2jKTy2Z22NLbdjsWDJocLTWVffv2HemhZuvPf5Dr6tQ1TTIpztlzjzDXcCjEoqmWPYFc9sACC6DyrCt23PvlXE+P5Qj5BUDn7+7XLcpB+SPJZDKfzx8qG39HwePxLFq06O3f7juiwBqKYVIodu3a9dRTTw2doqoqHHyhTGAC//IoFApHq8CSpJJSkYozv6sw+tvR6NEfcV/0vjGPcGzwnn9J/9OP2+fNtNbXqrFEYvVrmbVvSBZr5Sc+K368HVM4ps9K/2P9UVmVZFb81x4xF142mWyTpxzp3QPQ22U/55RxDsZ9xUXptf+gtAJLy+bz6Yxt+gGGNUkxmY/8TKriAzekNm2Mv/mGY/oYs/X9yy/oj4Z3/+abDVd/xuI94Hm3bLYEpp+Q2b9vmALLGQioJx2cEZ9Op9/5BdY/C++gAmvEFIorr7zyyiuvHDrlrrvu2rZxX9UQZZ7NLDrHSUC1SwEavHZgWsADNAT9GCnb6gDbpGHwB2a/DJhsDsASrAbsdTMA15Q5gOQPAR2ROJCM5zGimAKBWsBX24DR6m6oAVCQTLlYBHC5PIC3zIPBfuUivamuFiDb3Yoh5TG4KzdgEdxVdT1gr24AbIEQRi8/NZsBsuFuiia4bJqii3AIhyR8dtFsHuhIFoDelAaYZRVIFzQMNkgkSwkuymM1A3VuK9AbVIFcQQPaHYMx6pODOlDvtQAB56ChUnwVm2xCtGTGCLUX6jHF7gSyhTAG5yS+uRUZjNx2RbBTgrUCDH2VmCK6E2YLIsNdpch4CdmTBGBRxCUBRtNA8dou/iqSMCpaFKG7yhQPoIjRV1Pib6q4swO5aHYTxbQzm4OiGE5VMboNDvSyLAzy/wNdDkVIWC4DFGJ9GII5saw1EAJC3gCgahqQyheAaCYPuMwq4LVqwDiVAQdAkkovsN49FdbYbkcv/GPtqLaS2ba7kMo4Z88bz1C1dFpNJXK9vWavVzJbzP6yEYVEztnzkm+9kXjw8Y72dovLZbI7Ald+yFZXP55hlA5zWSDd06fn88c29EvXU53doRIy8XVVDb+1sfoDXxznBt1nnNT+xPO9f15XfsXISvmuB1bYyssOCkdVIzE1lzvSIuZAufec873nnD/mEcpmc/k118dfW7fnd98pX3JuaOkFQ9+VPMHEhrWeJScfafHE3t3OWTUHTSwvL3c43iZ/xnGHd0qBdYxSKCYwgQkMjwkG61C8bbej/K5G70mnju2wqvF4718fk5OxeGurrcyv5nMWlyvd06erqslq9UyfkTNZ3PMWWGvr5MOV46Fr/w3wNjfa6sa+g7qq5nu7TR6vbLEavbxGhqQovqnT0lt3OxaWFAGaa27L7mtBlpAk+9wZJbavybV3OYLlpbSFSe3c5pnWYPKNIjHr8JCkwO03dn3vlyanw3/Bke2Eut7xs2fS29v9n7zhoHdybZ2+WYe0ETzacC89TXI4o8/9VUpGAqcP6rFcddNznbuGWdBZVS27nMPMMIGD8I4osMaTQlHhNC2tsWLIibwWBSOrXbSfq/A4gZDHBaR72ikSRQyKnCxio7IMmD1lgLWqHnBNnQNEsQLbmzqAlmgKSOZVwK6YMPrQ1Ze5gfryagwXodiK4LEEL5LXVCAv3GfZDJCPhQcCk0SMlmICFI8fULwBwF4zBXBOngnEdRPQ2hvDYHQEY+TzlYtVYRBmAwRJKgEUUknAarZj6Gey6qDPbiAqLK9jOAGdFjNQ7XMBZpMJqPa6gCp3FJjiiwNN0TxGZlWlSwHmlLuAgNsJ9KoFDGrH7CvD8A9aAhUYXkhNkot7YVckwGOTMJingEMGvDYFsCkmjO91YbIT1I5QlcUyueLpKOg6YJYBXDbBfumAxw5GoL/DIgFBpwRM9liqXHYg4HIA6Z79FHv/DWWeLGYM1Z3ZXw5YQ9UYkrgBU6foJyjLFH2FqRigxiNAIRHDcCaKNpED10O4B1AzIuw+gcGc2fI5oDpYBWja4KkRB0d0IwgfRTGULJVofRIzH7XtvlNx7EJxDkVs1frQdTeNdim9UOh84JeZtmbX/Nm2C8/zTZ8ibh0D7+bz2T1NhUhM3fBm6tUVHXubJFmyen2O6bNy2ZxjxiyT02WvH3hwNpbqStPib/1Da23qe/01CSSzIslyIZ1xT6qTq2oDl7yvlO7Ueqg68deXRiiwdD361MuJFevQNEdllWSxaulU/PHnC5mMd+4MrSroPutkJXhEX2fsxdW6qSSGrPeJP1oXj4tELMLaMKniS5/s+v594WffCN5wtmt+/eCp0fVMc0/fs28kX92lS3Lov283eQ4u6VIvr7VMHntrbS2bTe3YqqZTmdYWa1WNXsi5TjjxsH0tXfMWOGfO7n/s4e33frn+8ludtdMASTbFO9uHMcpmYjFTY3OJZfEEeIcUWGvWrDlGKRQTmMAEhoc0mkeE7wYX4dt2O8q1dljsDnuJIiEDmdbm2NOPm1y2yq9+1hw6zLehZDbbZk8HXKcuBrxQ6OpNbd2l6Zq6aUdh18a+bbtdtbX20852TB+ddVFX1cjKFzJb31ILeed5p4fO/Kh1ap0grrRkOr1lR+r5V3ru+4nr7AscM0agYcrOvbDj55vT2/fYZ0877AzprbuSjz1rMln9F77Xs2AxQ+ixfE93YvsW2pq7v/VzyWRyzJsu109yLl0w9HGblskWtu91LT1jxJ1KbHnL6vcGPnhEIddoYampqvja58MPPxn5/fr9jX90VQRyqbTFaU909jkrynWbzXv9lfb5Mw+lLXMtHdnOnsp/+8QYNprcsS224rlcf5/idjpmTNGltJbozDW3JV9bq2Zz/jOX2+edcFC8lmS2BK69wbZja/uTv7f6QpXLr0nu3ugftlePbXJDQSndETOBd0aBNZ4Uihq3fdnkIEbMt89hA9w2C5AfYAUSQLKtG1DTKTBETgNRUmYM0ZJow2f2lQP2mnogYbIB29v7gG29cWB/LA+k8jrgMEtANCdClXRAkWVgcrkf46uokE4W1y90NuK1UOroakH82hOuOiEFE1nt1qo6wDNlNrCjoxfY3RcD+tM5wGoyAQ1+J3BCTag4+IEmevEIhrUt6/IAFTMXASFnBPDbMkAiqzPA2eGzykCly4ZhddT7OoFsfxfgkk3A0vJK4NSGmUBTbwToS2WKu1zjdQH5ZByQzFbAHKiEASejaLFnq6oDLIFKIJ3NAWZZBoJ2BTCbJMBmkoFKpwWY5HFgsHQ2RQE0XcOIOxfcVSwruDQVw5jpscoYKivcYOi6xJrdFhkI2C1AjccxpdwHaIlBH6gg/ww/qRMQnSvMviBgq5kCOBpmA+4ps4CeZBboTKaBgqoBDrcZCDU4AbueB1KtjUCmowkj5Ez0KFQTUUASr5NRDGYLXQMk2QRU+soxqD6HWSnu7JqjWOdIo8jBeje4CI9dKM5BiD23Sh6lfzC1Z1fHb+7xX36h5+KzS19KqSj3VJQDnHsG4NK05IaNnQ/+Kvi+q90nLi1xJZnW5q7f3Gty2v03XW2dVn/Qu7LT7jx5kfPkRfFV6zse+nXlhz7inDlcjSVZLLYTFvf85IGab33B5DvYu5dYsS786NPe084qu+CSQ4+PORjyB5cDAch1tsfeeK2w7q3WR55U7HbnzCmqxy07bJkNb1ora3xnnjP8TqX37u59/OHA7f92dEO/TC5H+UevBVzxpJZM5bt7zaFyn88j245oydJS6b4f3+8/+3zZNrprLN20r+fhB2WzYjt1UeDCZaJT0FBmLNfcnn5xdc+Pni1ffr7nrPMOepLrnDXXWl0Tf2XFnoe+o6mF+i9+dbhtdXcXdvf43jt2Edi7De+IAuvWW2+99dZb/9mjmMAE3o2QRvOIcBRyeAA2bdqUSqVOOWW8/qy3E2/b7cismOXJJaU0CSR3bA0/+Wjo0zfZ58wYee5hIMvOUxebQuXhnz9kDgRtk0d6Sqjr8XWv9L70bNm/XelcOkJSufvsU5Xysshv/mStHCEZvGz5hRa7o+9793pvvc5aVy0mFvrCsfsfzXb2Vn/is9aKkYPCLZXV5Ze8Dwhks9mujvSu7XI8TnePY+6isuUXHnGHVDW5Y2th++bIjq2ei8+2zzoKbacPC5PbaXI7zZUjJLPnO3t6vn+Pd8ES77Jzh59zKNRMJvLko+n9+xxnLvG99zyOUCNa6qotN3/AcenyxMNPtXz3a1W3feagh4aKx+e/9P3uM5cXohGTazghmnPWHD3SVvoIxwCHUh6wlkqsOpTIMR3M+PGOKLDGgwqPc2a5C8j19wD57n6gX/BGagHDtyWJDG6RUSSMbG4vGOSANJhgZHb7AM3mBDq7wxg52n0ZFYhkdCCV04FMAcBqUoEyWw4oS6Yx+LNyjw/DXzaQ2a1pMJCSJbgjkzbQUs5kd2EYzYRWyRKqBV5v6gBe7wgDO/pyQCyjY+ROpQsqUOFyAEERzZXLYoh7hgbYCWHZjFAACGfygEVOYzjypvntwJzKAFBo2wtEN60D0s17AC2TAhSXF7DVTgGC9bOButopgNU7+FnNxaMYQiWHPhNQKyZhREYJ7speOQnoy+YBh0UBJnntwCQdwGMzAyGXAwh5nIDbJnK5NAyfYDydw/APikB88Z0v2Cmv1QQ4zCbAbVEAt9WM4Yt0Ws3Fdfqddi0RBdJdbRSVeaIHpd2B0WVSZPeLHXfPXAj0YQNWbmsGNvckgfa4GB5AmV0CZpRZgUVVPuDEGSdgXI0D5GKhCyMBS/BVSi6DwVrJoumkxw+Y3V6MTgB2swLIsgSMzqs2PI6Zi7Cjo+O888674IILjq8C621DbOMWi6fVMW2mtfpgZ9ahSO9v7Pz9/YEbrhpvdWXANnWy7yNXt/34Z3Wf+9JhZTpFdN7/Cy0Rqfr650tUl9vnzcwsmNX6k+/W3/nN4ed0nXpmIZ3q/OZPvCfM1gI+qbsvvm13+fkXBz+07FDJfGrn9vS+PSRiej4vV1Say4Pu+YuKfknZarXX1dsPMULG3tiQ6+zQE3FFlvLxmEmW0r29uVjMWua3Lphd/Z0vDcMqAWha8vXNhf5I/s1tismU7uqxej35TMY+axpVQdfpS4b2lh4Dcvvbon96JrN3v+fUM70XXDqKBbs7O+77mTnoD33132XXoIlPS6Wzja3Zxv2WygpkybForvjMmiuC/s/cZFmxrvXH36m6+eO22skHrVDx+kZslZNu3Jvvaj2mKvc9icJzXZnSZ140/ji1Y4njvsCawAQmMB5IklSKKrk4c4lz6rp+ww039PT0jHVc/wrI7tufa+vK7dyr5FUtnpTtNs1mUWZNdZ9xEpJU9ZXPpF/f1Hn/z80Op6W61jptpmP2vKFN4ovIh/v7H32o/JbrnIvnH8Xh2efOKHv/xf2PPBi6+fYjJSbE1/4t191R+Y3/OChQYHj4r32vumNvaveOEWVevuUXupeeFvv7q1pbs3X2QvfpF9km1R08hrfeSK1ZVUimbKFJlkC1blHVjr7k5k3hp56wT51RdvmVpsO2cdT1+NqVkTWrbIvmUuXWnE7FXGPyuHzlZZZgmeweIe4r19wee/jJXHu3bLU6p063TJljq5nkstkk2ZTr7tASidQrbySeWmGbMsl12fmW+pKZSF3Pd/UmN2xUEunoaxutXp8pEJr02f9UvKOoFOL/eK33ycfKrn+f87QlxdUm1r2hvv5WbFejb2qtrqu0t8b2tMUeftJcU+m/5YPi9DmXn6bm810P3FPzmS8K8cOoYFVMyin/hLjO4xfHfYGlZ1KJPVuBbHcbkI/1YciPhCxpoJNgoAowu3wY1jazzQGHaa6WU1UgLlQ1mobR5E6Y3YTuSoQqCXGPoMAyBQ1I5vIYXeREupLI5jYPRJDrHJiWVLA5tIwLg6FR7C5A9viBLW3dwIa2MLC+NQvs7QJIZCQg4BaJUFlgRlkCqCp3YrRHFAxWITkoQRO6qMDis4ATqwOA3xYr7vKUgBdwpiNA35trgP5XVwKRLU1Asl8DLHYAT70H8MyZA7hnLwYcU+cCtopJgFlQL7VTAL16cvHoiBwsTTYB0WQGQ0cluCWRHe+124BytxPIiPF3NwOxwqAnUcRE2SxCsyUDIshK5HWJ9Cyf3QqEXHYM66gFDcgnY4CWTQJapB9IdWcH8q6SMUDPix6UVgwdnqAVRZq/e8YCYHckDby0rwX4W2MO2NoqAdG+wV/bbr8GzJuUxrA3uq0WoDZQAaRb9gxeA9kMRf2fYilOF0WM+AU/wGlpOuCwWgCn9SgFuBchjcZFWHKB9d3vfrepqWnevKNjzjruEH3yxcTK9aiac1KdEqgwVfiUOquElO3uSD29Kr329dB/fkIJ+N0XLnNfcFaupT2x6tX8zrea/vIni9ttn9xgnTHXOXuubLUCqd07On/7K++Fy45udSXgvvCs3o1bex75bej6jxz6bnL7lr4Vz1d+7XOHVldqJB65/5HM/tZCOuOqrZJqq8tuvGrw8jCZLMtP63vij44vfGXEMZhcbv+Rs52iG9b1P/tkcOn55YvPkQ68Xae7W2Nb1u7/n7sC77nce/LB6uy2n/9QSycqvvLpQzVew0PP5jq/+gMtnfUsOTVw2XXmsoOdBNaaWsB75jlqPN7/3JPd379X8bhdly53Lpl/mDpV17P72wrdvan1/7DqUnjbTkcohGI2n7i04sO32uoOZpJGRM+jv0/t2R76wm3WhoGQejWW6P3O/6npdOUtF9TedZVkHrgdVUJmf3f/H9e23fEt/4ff7zp5EeC5cJkejXf88n8nff7OURHSWiYd2bIpdOlYNPjvWhz3BdYEJjCBcUGSRtHgtrQ78uuvv3733XevWrXqU5/61NgHdnwi19yeevw5NZIou+hy98LFhx6xiN2hOoZkvkuSpa6m7IYrAXehkGtuS6zakN38Ws+fH7b5fZKsaPls8PYb7fOOzpPBQ+H/2PVtX/q2v7/v0Eqi0NzoueAs5ZAGMmokGvnx/Uqlp/5bH7ZW+pPbWnoeXBm/5/fOG6+WjR8A7mUnp55dle/tMZePoEAaBoktb0VferbhqtvtocNQRPZQrX35BywVDT0vP2Wvn2IZotnSNU1PJco/c+Noq6tCfzR2zx9cDdO977lCFLjDwOR2B6/+UCCbDa96SX91S8tvH/M0TFZNsm1ybaal3eqwx3fuVbM5ZNk/a7bJ7LEtOHHyZR9UhtU5DQNd06JPP55u3Fnx1c8oxn5ldjf2/fTB0OUnB64549AUFdvkUPUXrrCv3NTxyz9bKkOWyTWA9+pL1D37I2tW+s5cXvrWY8884TvjpIP65ExgeBz3BZaWy2Z7O4FsVzOGF0zIcszeMsDsDxZfO6rqgPZwDIiG+zBa3dnMCkYElNWsACaTjOFJrFE1DP7JasoC4YyKEUHuNMsYgVJCEhTP5gCTLAHpXB6jcZ4QPCmCejHbAKvNIWKQxDDMdhewvy8CNIYTwPa+HLCzA6CtWQFcKR3Y5Qdw21Rgf2UKOLV+8LoXUfKZri4gH41gRJCLp5mcM0UAACAASURBVA9V808BPDVBjJglr1kC+t9YD8S3bwR6Xt8HbG00A22SDlh0CZjSkgamh18vHmST0GYFa4CULgOdkQQQz+Qw6EBVH2xoL1yH4lCLtoxVPg+Q6mgG+na/gWG1E/SSrJgx4qYE7eetm4bBgQmKTBvQb1mAGr8HKIR7gMzOXUCsvwujY6OQWA3I8swW8YIBxsiMobiSB1KvgoBz8gygKZ4DVjX1AC/uyQGvb1WAyY2NgCfRBEiyAuje2cBbWhkQ8uSBBaEkUF9bhtGQcaCgEeFrJgWQB/RevuLO2sqrgHhOBZLZHMaV6TAfZZv0aB8RRiKRVatWDZ1YX19fX19f/G8ikbjuuuu+/OUvn3RSST1D/pWg63rXt//PPX9B6GO3HOmopjZvtC47/JGRFMU6ZbJ1ymTAk82p4Wh2X7N93oxDA5OOIkw+t/vkRb2P/b7qloOr4cgbrwVuu+7QRTrv/lHwvUvLrz1T/Nd94lTXgob2bz/e9oVvTPrfuwc+ULKsVFeEX3o2dO3BcZqlo+/JP/lPOO2w1VUR/rlL0bWO+342+b+/UZwYe32DLmGuHVkmfxA6vvp916x5/iuuLX0R2WoNXHgJ4EnEcz1dia2bNdUuO8pMU6cHZp9kq58yYqFWCvRCoe0n31W8jspv3lGsYgu9/T0/+lXljecFLlkyzLL+c06QzUrb935Z84MvS2YzkmS9aFnfvX/wnHyGXFrHre5HfpPatb3mB18e/468q3DcF1gTmMAExoVRBo02NTXdddddQ6fdeOONN954Y/G/t99+e21t7R133HHURnj8IN/e5Zs6zf/+Dx5pBjWZKCST5ctGVv3LVotcGRzRgHZUYD91Ue4vKw+d7ps5S00kD5qYb+/SVbX8A2cOnSiZ5Jr/ukr7z98k//5W0WnoOPuU8AN/GvOo1GRC0gktPaIZsAj/vFP6N67I9XRbgqGBSR0t7tEkWQjkmtutLnfwyiOevuFhcrntLre94fDJXuOBls2EH/mt7LAEvnBbUf6vFwqRXzxUfcO5/mGrKwHvGXNSa3bEnlnpvfwCwHniPG3JgsTf13lOP3vEZRPrX1F7Oiru/PSxbW30r4jjv8CSJD2fxci40jJpQLJYOFBP46xpALZ39AB7+2JARJjpTDIQdFqBWq8LqLSYAZ/DDpQ5B6OYyhw2oDyWBLoTGSCWK2BosKwmGcgLm1s2j9E4T6xfOL9Esz/RwdBltQBeh02xWCkGvus6RlJ5VtUw0qrCcRmo7EsBlmQX4ExXAvvLLMD+WBZIqRqG7EwrFIBcJAEQTWAQJ+JQCJLGWT8TMFksQKqzBch1twGZzg6gp90E7CYDNOfjgIwEpCUv4NsnA54ZnRi+RWF2297ZD2zqigAt8TyQyGkY6d9eqwzUuCzA9IAbqA94gWRbIxDfuRFINW4Dst3tgJbNAopTCKHqKMqVzBaguroeQ96kmEyAWc0Byb1bgFTTDiDTtg/DXqrnssVLQvEIKV5QxOWLJomyzQGYrA7A5PIAtmA10JfTga1dYeCtrhyws00G6po7gFzfG0A21Q6YTDbALpmATP9pQPj/s/fecXbU9f7/c+bMzOn9bC/ZJJtkU2khkCAdpIsUARGQojQRRUQvVy9f6/UCItIuKF0RBBQkIL2JlFADIaRnN2V7Ob3PmZnfH7NzdrPZbDYkcH/RfT3yyGN3zpTPzDl75j2vz+v9emVLQLpYKl9q0xLMPAVTWGYOSYnUAI7ayYCnaQbQk1OBjngaUDUdCLrs5U/OrsQOThHuueeeIwqs4Xj00UeffPLJjz76SBz/Pv+FUFy13n34MWOs0PvXh2whv7hDb6Jh9N9yv+LzqLLkO3ShXFu1s6PcCqLXk9y4cetOwoJg01543b3vHsMXZpetcoT9oziiCQS+srD9hr+5993DJLFce8yMGnp23RpX86eZ30wvWyo7XMJWMtlRIbl8ibdeq/jSqYChadGl79d+ZWSJX9jYriVSer5gn1Qvm8ZgWyLx6FPypClb/zkUe3tizz2l2JXCwIDSPN09a469bqQS/7NDKZ1q/+3/eOa1VH7vnOFji/15cTGRCI4vWxpwfmFG+01PmgUWYD/igJ7r7/Duf+BYGUeG0fvgPZl1a2t/eZUtsMOi+An8O34JTmACEyjDnCIc77/tabDeeOONWCzW1NQkSZIkSW+//faDDz4oSdLixYs/n9P5v4Vktzsamrb5smEYA31e6w43LhhG6o+Pi6m86K8VuuN91/8udusfSgOxnR7pFij1DgSmj1IDVXzpVEkX08//c/hC59yWQjS59cqAd/40T31FbsXawd8FwX/UwaW1Kz7dqNwz52ilbSYfj1y5sk6pHnS7SH/yka958vCCIPXa24nf3Nn/mzvV518pPP9K769ujd18T37dhhE7sYuSZ88t2CAtl+246dree+6wSx5n5QzPpHlyUu25787+e24vdO64I5Sul1JJs5dlnCj29vTdc5t7XkvgG2eMqPzErt66735p/N6/gQNm2Ww2M9UeUCbV+aY2ZVdv893RVTX2+EMUszU/u3Kiuvp02O0ZLFFWTPsoU/FgGvKaaYBSIAI4aiYBbQMJ4IPOKLAqmscK4ws4hroCqz0uwOt0ANmedizhjtmC1xiqACq9FcDmWBLoTuWwzMRNi6ZiSQMShgFk1RIgmTZX4lDLm9k6Z6q+bKJYyqYo640UB1Dt8wDV7hQQcuUAh2LAoAE9ahKwZwRgU2wSsDmpAT2JDOD3h7CC80xoedN+KQWoyShQSsWAUiYF4PaW92w+x4iSDbb4Qy4ZevnnrFECiuqQpEByeYBUyQCW9SSA1zblgA39AOk8gF0CqA7oQL7KAGq8DsCpyEC8ZzOQbf0ESK1cBmQ7+wC9qAH2oBvQ8nm2JH7MR2TF5cEiL5Pdm7A4sEzrCiDXvglQ4ykYpNGUoB9wCgCSPzyYRBmuxrIKM/WnsscPxDJ5YHM8DnSlC0A8ZwC5vAiEtAKAMWQiLwhm358M6BKAmSphG6Y8NZVepnG/SX6auitn4zTAM20usCldAJZ3R4HOdKG8bYPXTCnYBXqO4RAEQRx/TO/2CqyLL7746KOPLv96xRVX1NbWXnXVVXvvvfenH+Lug2I6Y/KsoyKzeqWay7r22IE03+6f3SQUSrXfulKQFQ44WMtl+x/5Y/dPbgxfeKZz7o4F3YyB3OvvCMYosz+CJAVO/uqmm66Vpzbapw72uyl1VYZuZFZuds9s2HoTaXZ98qEnnL+4yvzVtXDvzh9d7znsmE+hQ5ICwVIhH1u1NNiyfWuAVEerEhw0a0i8/LxYOyTYz7y/LPbnxVVfO7j+56eZHXZattD5+2f7b7qn7ob/MsNGBzdc1+Y9bmhDo1TquOlaf9OsqoNPHU7zVBxwQmzl2+233xg88NDQF4/b7tj0QiH94fvxl58r5bKCaNM1TfH56i77/qgh3MORWb6s++E/VJx/mmu/kVdAS6ZSbe0N83YkSlIQREUqtG52zp5mLihVR/oe+7N71ijdqVoq1Xn7jYJTqbpmYmbw02O3L7AmMIEJ7BR2ROS+3S7ClpaWlpahG/9PfvKTmpqa4SXXvzZkj9t01hgVpc1tviO2n443tH4soceSdZf/0HyGBGxOV9XXL8q1ruu96z7fwft7T96+Pmn7MIz8mratFe4m5EhF7bkXRX/3YOiKC+SaQYVT8PQTYn/8h/uXZ21NnwQPnxd/9gMMy0I56A/Mn5dY8npwRzzKywgc+sX+Nxb7m2ebPiZjnEIpm4rss5/5M2oxdMZgtmBm6SfJB5+Y8quvu6bVlle3uewN3z2xx3gy+/xr7uOHBmZo2nB3qL4//8FXM7n6sNNHHE0QxdDshd7Gls1/uz0dqfTsvc1JOkNVU2+/PvDCs+EZ82oOPc07aYZgkwyt1P3Sn1MvPu0/4ZRtnpGuDzz2UKFjY/UPLrJPbdr6ddHjNqyLPH7YZFmurSz/Gj79hOj6zelPlnlmzxu+WnrZB7FnFvsOX+Q+5pAdPcQEhmO3L7Bsin1Qy2J3AjathCWyMXUttmAlsHLVRuDDnhywfkAHShpAtV8Aaj0lLGulQmIAy6+oGO3B4sYKoSrA1dAMNEUiWLyX6ZVlKrpMNyxD1Sj3DIoClkLLNBYf3quo5zP5rk1AMW76MQqAo7IO2KexEehK54HW/gzwTq8baMwFYZA4EbMC0JcygI5EGqisrAOUSCWgBDuBUjoL2JyOoUvk9ACKLwjoigNw1U4C1Hg/4J6yFqiZ0gU0f+IAVFkHioYOVGIHfH4NUEIRQKmoA9r6E8DHfXng480AmzskwJEFyLsA0tUaEHCahmEaFrFXSkSBQk8nkNnUAyTai4BWEgBPJgHYHN3lI5rNfeYtR7U7sUL9cu3rgUzrSiCzbi2Q6YgBak4HFI8NkNxOymmJgYijpglw1U8GVFHCijjMxZJYjZCmos5U2nnsAJGADgxEJgFhLQdIzh5AlNxAITQbCEc0oNIzZNOlayXKJJwngJWGaX5K3VNmAb1FgPc7+oGPenNAb0YHHBJYCr9qb9Yczy772vsMbBr+bVHK5dSBftMnaWvE334z/K2zx7+3+AOPOxom2TwjLTGdU5rrL/9hx63XGyXVd9oO2H+Pivzq9YamK5XbbL93Tp3mW3Ro509/W/fz70sVIcB9wPyuJ57vvOOZ2ktGCs4cDRWGoasdPbLVz2/be3bfHQ945uwhh0eRPWmZdOqj9/WOzYXebkdFlSop4aOOs7kHTzlw4KH5FR+3L76z4csXj1G5Jts+0bSSaUSeWb1SL6lSZFBRFrvv0eDRew2vrsoInX3w6otvcx55oCmJM4pFBIYk5JqWXrNy2tk/3NZBZW+w7rgL1j14g71pqhwazQrfMDb89zW+hinNX7tKCQydu2CTqg75yqq7rnEuOECpGuWya9lM7/2/K6aSNT+9QnSP5qEKgigKNjH57hr/fjO2NcIRUAeS+VjS5hv2cRJFx7GH9N/7Z1fzDJNi1AuF+DNPJJZ94PvSke4vHjTOPU9gW9jtCyxBkobH4Jj8vOQJAEqwEsuUYX0sC7RFdaB9ACzltds+5CDgc9iBfG8rkNu8Fsu81Lyp2JNxrA5/vy8IuJWhq5cr6UCqWAJUfWj/dpuAVVqZDfaKzQYE3U4gtX5lpvUTIN+5ASvrNxuIAJ5Z84FjWvYABnKtQCxTBDaojUA4ngEMASCVB+hI5YAD5kwGnA3TADUZB7R0ClAqqgFnQzPgbmoBOrMq0N4ZAxyyDZg9x3r+s6Tr+4hLgMhqJ5BSBSDi0oDwdA/grJ8COGsnARtb+4BNMR3o6LMBtd0pQCokgKIzBPQ5nEAsp2GF/Jgwc4RMuwo1WwLyOZFBRwUceR3Qi2p5VOZVMg1UzSWlxACgRnuB4kAfUIimgEJSs04IURIB2ecH7FUNgKupxTNlJtDaGwUGMnmgaEblmNFJw0rkGrcdmFVhzpaqwFqHBmyqngEU0jMBbADhkAbMbjCAaUEFCLvMHO4SVo1rdhuYn1hHbROgeULAirZO4OO+HLCmTwMSOQCvA8Bv17BKwF0IQRDHuHVtvfIO7XzJkiU7PqLdGIrPu3U9ZELP5xFwTBvvnI6eL6gb2msu+u6or9q83rrLrmq/+VqxKuIZR0/iGFBXtQYXbedW6l10oKAo0RvvDl35DSkcRBAiV3yj539u8+w1xbf/yBt8sKVJS2fKs0quPWdHzj6l/4G7Ki/41vCou2JvT/rNV9MrlsuRoH3Bns69m/VcXlzd1n7jrxz1DRVnnm+25lRdcGnffXdseOS3k065TJRHn2fMrnk3dPQJ5s+lzW3ewwdNRwsb2h0BT805o7s9yRGfu7Yi89b73kMWAoami/IQT6YO9HsiVYp/lKKwDHuoyhWKFLvaRy2w0p8sc4ci9cdfsLXWuZgccPgDSuUo/Qpqf1/H7TcGDl0U+fKRY1PLkYu+1v7rB2z/76ueOeNyK40+/IZ7xpQRknbX3nOK7y3r/t1NjllzjUwqs2K5HA7WXfefO2TcP4FtYULkPoEJ/HtjR0TuEwzW2FBTmVJi9ADa7NqVNrt9/GRh9P6/2Hx+KbDNBBWb11t97kWxh5/SUiOdFHYIyVffkpumbHc1z/z9HDPndf7Xr7VECpBrqyq/f/HmGx6PvbJsxJr5ZDq/pnX4EvcB822Tajf9+heJZxfH3/jHwAtP99xxY/v//kYtJCuvubzix9/2ffFAz8J9fIcdELjkrOqfXoEibLrup7F/vAQIklRx3iVSOLj2D79KbRhFkT3w4WvRttVlcXr8nbek5ibz59TfnrNPrxnrQ+t35FatH/zZGOy/NpFbv0bTSqNvNQSjmM1mtqETjz/3lL122mg3WaPzhQfFSMXWAyt0bO7439/4jjrIc/JR2524d85tqbj8/I0/fWjDVfemP2w1dGOMlQf+/m7/q8sC3xzFgcJ31smOw/fX9VSplKm4+pKKH182UV3tKuz2DBaGNVcHWAzTYEiO2wvE0wWgP6cB8QxAKicADtPxUTAAj2wDwj4XMPBxO5DvaAPy3R1Y6m+TCVEi1UCpkCsf0ZwWTBZKQKygYTFYZpCORxYBhzTEi3jsMlBMxoB8Z2tm3XIgvXYlUBiIA5LLjsVphQo54NQ584FEcQPwjF4C2jpdgCgaWBnDPRkV6M+pgGvqHMAwmaFcBlAq6wD/3P2BTQWA1zZ0AaujQxrqlu44cPiUOUD1l0zHywrAs+w9IN87gCVp906fDjgbpwO63VU+bqYAoKsCYNMKgKAXAZtWBDTNCagaWI6sqqZhETlmsrLskgCnuzj4zoIjIAGy34uVz21zebH8FCxLQxsMKvPNbyXRJAvdIiAqIuCsCQOuSVMBz7R5gGfa3Hc3dAJrB1JA0tTU20Qg4jQzpx1AxO0Eqr0uoCnoBmZHcsCG2hywKakC/VkNq9HBZxeAyX4FmBF2A0G3AzAMrTx4sxXDDB131zYBK7oHgI2JHNCV0oFoBiBXBDC9RUvGWF+gnx4TU4S7DqIs2etGkX4DCKJ3+vbrmEEYhrqmLXziSPXPCNjrGsILv5B7+hXP6Z9yorDUF7UpimvqyBbCUiqp9vZk1qz0L1gohwe9uEJHHS85XdHf3BW68ps2n0dprK349nmdt95nxLOhL+9fnrR2Bn3C1JGcSujCr7o3tufe/rC0cqk8dZJtzxkNR180XGBehi3oD3/3/Mw7H6Uee0ZMxjxHHGdzOiNfOz/20rMdLzwYmjbPO2uhs3LwIseXLxl478XwcSeZ39LF3h7Z7XTOGLzOslYKHDWWQN49r6kQGxy3INuGf7jttfW6dzsu8LEV79j9PtMbYmtUnXth+y03OGsa/c17lhcamtb7j0cNXa08feRkcX5jW9e9d0QuPNO556yxj1uGY8aUumv/M/nsqwN/eH1Tx6ORfWeW/Hbf/jPksFfyuQ1NV/sSqffW5t5am4smq6/5rs0zStKl6HL4Dl04ziNOYIew+xdYE5jABHYCgiiMZYSz1cqf6WB2d6jpjG0bQSiFzRvVvoFR7m+jIbNkKQiulu3faN0HHb7hV9fI++9pnzTuvOFhSL70uuQLjKib0x9/2PPwA+Ep0/VcrvP9d3RNqzztLPfM2YDvoMOKfd2dP7qu7tqrRZfT0TK15mdX9v/6d/1Pv1d/1Umu6XXFnvjA8taKI0eZlbNPqh//IN0L9nDuMXPgxruj1/+s7qLLlaqa4OFH+w84JPrUY/1/uVV2uuweXz6Z0ErFuku/V1Z39T/5mO6wl08nsX5TbcNYTq2FzmixZ/BpWZAkQ9fL8nzB4Ux0bKrdttyx562nBz74R93Fl5vPS1tDDlfUXvjtjt/fEn33BffkuYaui2j9H7/lqKyq+fZVI7bKb97Yde8d4UvOds4dr6bKhOhxBU49FvD0RfMr1hQ/WB5b+0ZqU6cgirqquqsjmk3ynHRscGbzxNPR54/dvsDS1aKWz2DJcUwNlhlrY36ezJyW4eypeTdxyAbgdwpApdvBkNp6M5Dv6QTyvX2AzaEAsj+IlaZsNqsXSkM2komiyWMNHcv0JnDYDKw2ftN01GWXATXaBxT7OrObWoHoJx1AX4cNMMgDVRvexDIgqFIcwFdmTQfypQ7AqWhAIjt0oERBAzbFUsA+zXOwQmZMhZOzphHYXAB4Zm0X8PL6IrCmSwAKqgDUhXPAmugG4OSWSmCPk76BpdyyUopLgL2qHssVM5E1XVUMwKUAuLw6EPOHAXfOA6SddsDlMsqjNd8fM0fI9EdQIlWAq74XsNljMKhic1SGAdfkaVicmTkeJVhRfqNNDkwrZAEtncQSPMmBNCA5nZS5q5Z9gMDcBcDbrZ1vdcSADYkSFhFY4RIBpyQCblkCmiJ+QC4VAC2vA7ODIUCZFQB6EmmgN5XBUkeZnzeXLGFZ1JrGCqJWBGSfOeMTAGRvAIhlC1gKMDMYx2TCTAbUKYOlwQrabYDf8RmEPU8wWLsIisdjc42uSrY3NknF0e2jtob+0arAEWMZlpZhc7qCey9Ql674dAWWki+K+2wh4cquWxN/+ompZ3y3HFCTav1k4IWnky89W/XNb4l2R+SUM23yo8nbH/B/+1xBkaVQoOon30ssfr7z14vVZNpml51N9Y6tGKztQNeLXb1qd6+WSLvmzpAiIQRBtCsV/3FJdsnS7nv+173XgvDRJ4gOR+TUMyOnfDW/YX0pkwlU1diCIXFYpSLrqv24oa5A2ekwxuR9JQTKtKIgCKJoaJpZ+tirqiWnI7F2mX/aHiO2MjSt/83FyfUf11xwiVJTN8b+7bV1TT/6Weyfr2iGkV+3ztEyO3LyGZ5Zc0f8HRU6Nnfd/b+RS892ztmx6mo45IqQfPD+HLw/sGP5ixP4zLDbF1gTmMAEdgY7mkX4mQ5md4dh2/Y3qqYl17aOh8Eq9Ufjy1Y0nTDewBb3fgd0/v4Wz5eO2IGpXgvxDz6uPmdR+Ve9WOy673dTTrt8ePyfd8psz6SWzU/8ruOm62ovucLm9QZPOLXn3tu7/uvXNb/6oSCKgiIHTj2OU44tdnQrOx7/l136SeLPT2jZvL+5XisUep98QVNLwa9+yb1wH0EUXfvvJQZ8A3f8iWQ8dMqZgs2GIDhGi6NR47F0Z0dgryHaTy9phY4ByTd6yQsk3lvrOmiLiGs9nytzkI6Zc3v+8ZirepL5LARgGIl1yzpfethRUVn7nR+Ox9xLkJXQYUcBHD66WUmxt7vzrtvC535lh6orvVAsbu7MfbxKCvpL/VF7cxMI9imNWzQJTuD/Grt9gVXKZUrJGKBl08Bg+m8xh9Vu5lKcgE8RAZ9LA1TNAAJugHqfDWgIeIBc9yasxJhifz9W2ozidWJJmswnD7PZJKfmgWxJA/IlA6uR3vySswkiIA/aNAiAItmwonK0ohnvk1GTSSDeKwLr8wKQEjSgaq0EGNpSLO1R3UnfBI5vjgAC/cC6AdPsAKzk6d50DuhKZoHa5tlY8TttvTHgHxt6gVdbi8DbKySgcUMX4CvGgYynHngs5gbSxR7gKy1h4KDDTwaSa5YBamIAy+pTCYQBk14POxWgKVwEMkUdaHcIQCqvAIqsA9UBAwi7TTJvKAnbHaoEHHVTyhfZXhkHRFkG7JV1gGvyTMDdPBdwVDUAA6b9hCAA4ao6ytoshwuQA2GglEkCppuoyX6ZKrQVPXHgna74R90q0JcCkCUAWdStN3mQfxIS/UB8zTKg0LsZ0At5yv2AwQqgobK+PFR7MAJoCOWLLw3KwpzlkzJFY2YaUjKVBlRdx7KiDTpFrMQks5yp9olAk98O1Pg9bGvS4tNBEBl3FyE72EX47wb3Htv0U3VNn9m/+C/o+nbLoOTjzwX2WSDIW1CVmTWr+h/9kysUFiIV/iOPlYeJ3+01dd66utzKtc7ZO8Z/GCVNK6r22iEOJte6Njy1xVU9kn8SbLbGky8deO+F9puvrbvs+5I/UHn2N/v+8Pv0A3/znn3S4B+MIOxodaWlMsl7Hs63d9Zcdqxv3yEdWGbl5r47X0g98UL4O+crddWOlqm11/5H9OZ7O2++tuLsb5g2NFsju/KT4IK9hj8t+L54UPYfK0Y1RAWyazpkp9N/whHlJYrXM9xmPXLCyelIRdsjN/pbFoh2B8VMdMV7jlC44rSz3OOYvR0PCl2dnXfeHD73VNe+I3mybUHtG8g//WpsyQfeujpdEKWa2mJ3l9YezXS066WSVih46ms0QZD3aBHsdufsGXL1WI2QE/hMsdsXWBOYwAR2CoIwfpuGiSnCsTHGlRQdDgEKbZvtY06fGYVi+oPltedePHxh7wP3ZFvX1R91lqjYu199rP/Be2su/d4WW0WqMk+9sqMFVnFzh2S3DxcDpd5dIgnbZGXC848sxPq677y17oqrBVmuOOeb7TddW7zzofCFZ+7QcQfHrJZ6f/Zb77ymxp9+W5C2uG7umQ3u35wffeb9rv++NXTeae758wS7Ev7+hakX/tl+6w2Vp57pmTNKOZJ59037wi2Wuxbt0/Gf18mz6wMHzh559GKp8zdPyLNnDC/I1Fxey2RMPy0TnoUHlnRdSyVzG5crk6ZUfu18x6Sm0U9H04q93TanS3S6xmlbX+jq7Pz9zYGTjx5/dZVf09pzw52Rgw5ruvqnomOw188k3MyKW8/niz3d2XWrhJ5svm1Z8m/P65rmb56sOhTXwr2VhpqyQ9gEPgfs9gWWls+YPpNmu5z5aK/nMkApnQJCFUGgxiMDdf4S4FQMIOIWgGlBBzAp7AdiqzYDRdNOKZEBStkSILl0sBrWzLBeScHSygwGnogALnmIr/IqIhB0SIBHkbA0WIO2TLIdEB0um92O1Q9YxACiRhHIogHuNjvgef89wFE/Bdj3hK8DaZP7UczUah1wywKWHVdPKovVqZdXS8Ca/gSwrDePpbtq2NwPaP3vAmohpMQbGgAAIABJREFUCsjpVsDLQcASlxMIO2OAS5GA+TP2APJmDLMpRJNkwO9yAM1hb/mChB05oCOiAamCbl0hfA4BaPRJWHlBZoaxEqrEUlaZaiozsVt0ugFHdSPgmTIL6CnowNp1m4G+TMF6T6hyO4BpFTVAZL9aINveCpRScayWUmddExBFBj7pHQDWDKidcYCk6TXlBEs/55ZtQKXfAyQ+eB9ILl8CZNavAorRePnzoAQDgLOuEXBOGiYUq2kC7OEqGGxvzKsaVgS4pqtYGj6Tu3JKElBtqtgMgAqXhuXCVe2Wyxe5JrCLpwAmpgg/NwT2XVhcuW7sAivz+rvhufMck4f6DQvdnflNG6aeeZVpDjzljCvaHvr1iATl4GFHd9xyrV4smt5R44Shlrz1Wyi3lLoGJTVWUl7tkV/tfu6P/X++v+Jr5wuyUn3epZ2/+232zfddi/YZ/3FNJB96QvY7a688cVsrhI7Zx9D1vj89rtTXyNUVCIL3iwcZki26+FEjlfDuf+AW5b5hlLLp8AFbJAnagv7gKUf33PmCurY7eOK+UnjQpT2zcnP3zU9JkYqgZfhuwu7ziA4HWyJwwMFjnEWhqzO/dlXijVe1QkGUJcnlLCSSdr/f5nQ7917gnj5LCgRG3TD14Xv9TzwavuB0196jJNWMitJAPHnvX6rOOGeE8fpwiA6HY1LT8CpQS6dyG9v0NavUl94eaG31TGrQqyOBU46xebY5czqBXYXdvsCawAQmsFMQxPF3EU5MEe4MxOra5HOLvcOyWUbCMBJPvhj+8hbuDLHHH/FN3UMZbI9AsEm+WfvHnnjUdeWPyutIPh+CmHzm1cCOJEmr7d35RGL4Ei2Tzm4nw1iIHHTymnt/4Vq9wj1jlhwO13zzso7/vdFWXWGf0jj+Q2vpTPLtpTPuvnzs1cLH7VsaSEVvubfqlz8wl/gOO8A1b2bvf9+WXrm85rxLyjVWsb9XV0tbZxJ7jzjQtf/e0Zvv7X5qiSPoU9zOfCxZKqiBU471HrjvSLF5PGnoOuODns+n//lS32uvBBfND114hn3alDIPp/b0p9/6wOhu3fjkY/6mJsMf8uw1317fKNodRqmUa10bf+4pLZep+uElSuNYGvkR6P/Nna7mmSOqK71QSH3wjq6qhU0bHJMmG7rm3XvB8MAfm8frmT3P3CqkaZmVy9NvvdZ19bXBs092LxgvczaBT4fdvsAyigVdLWA1uJl/MIMG39kkEPa6gAafExjIlYCwSwOqXBLQHPICejIKFAe6ATURB0pZFdBLZjciWA5bw6cAzGgdr10CqnQDi6ox+Q+vYsPirkzPd1OLYwqPAuFKwFHb5Jo0BYg09QB1ywQggwwUDB2IGgDxtjTgW/0REJ/8DrCgZV+sHrr2VN4a46CNU1EzLb8LWFzXQF7FanLMFUXArRUAwygBhl4E9FIWUPJRoCfZAHQkdWBzIgPUx1NAZSAMFBNRLImbzWYDZtVWAhGPC5geyQL9mTyQKJhUjYZFfpiWYxUuO5ZVuuL1YTFVpl7KNHGXPH7AXdcErOkeAD7sigLL+3NAd0rHatmLuLLA9GgGmFPpA6bVTgPCHmf5KsWzeaCtOwp0Z4pAumBmGpXfTbA4yIBDAYxcGih0bgAyrauBgQ83AtEuAShpAuD1xoDg5C7An4gChqpicZxmdLQueIBkLo8VBz4IYai3NOx2YOnzwi4zdskU2AlAyGkHmkJ+IB/tY9diwgfr84J33l7Jl57Or2l1bMMQK79ynTMU9gwL39VymWJ0oPH4i4avFt7jwL53nlf7++TIkAdB5Rlfj//9L8YJR4yfj5QbagzfFhVJ6LAvbrru51ohO+gzNxokp6fuyDMSr77onj4TQVAqqiInndZ3491V11wuV4S3tdVI6Ibsdo4hPy+j8muHJF9drnb2lkP0pEio8j8vS979cOyxhwInnCqYpJ2uu7ZxdJvHXfGflxm6Xli1HlH0+L1yZZitHioMtaTrmhIa1ylkVi7ve/RP3r3n1F//o6115XJVJPjlLwLu804trN2Qfv613Jsvda1v09WSYLMFZzRLMyZVnH6CIO/A/Te/ap2WzgaP+3J5SSmdiv39b/n1a2WXx90wQzPsYk8s372x843XEPAfdJhr5lx5y9MRbDbPnD08c/ZIfvBO7IHHbD6Po2Xq+MewNTJvfvB48PGd2cO/Nnb7AmsCE5jATkEQdkTkPlFg7QQEAbcv+ddnHVdfOurr0T88Zq/bYgIx8dbrdl/QZt/CWVuw2SSHK/3JR8GDhwTazinNA0Ut9fQrvjEYshHDkWyJjRuHS3Jsbo+zprbnlb/UHn3OGBv6p+3R888nUh++791rPuCdt3epq6P/2juqf3mVYB/fHKUgqOlcoXPAXrudgkawifaaUPKl18Nnn1xeKEWCwe99o/snN2bvvKXuW1cCWj6f7e33pzOjemkCgig6Zk0b40D5Na2SMi6r/f7H/pxe8XHk8nO3VSgPG7zN0TLVLGJGcms7iNTjz7vn7T1UPRtG7z23G5rQdNp3Fd8IWZWRaW9NrHhz07NPVZ92lnvunlvtDN/eC2wuT+8t99b+8ipb4FO6OhiFYvTBx2vOv+yTjz/+dHv4l8e/QIElmD19ot0BlsRJEACjWAAoFoAarxtIFlQgXdSACrcdaAz5gELXemCwGzFv+mkZgGgTANNnZVAKajJkahHwO+xAndeUKymAQ7JhCYxcioyloTGVN2YsdCJXACSPE/DNmm/uylBNE/T3AcdKCegtCYApBygVAAp9vUBu01rAVd8MzK4OYymxTMLDHICZJy0PslmmQsuG1Z5WHdCB9so6oKa0ByAV+gFB9gPRUAMQ8uqASxGwOvX0YRdWH+YRr6biWHosn90JhHweQKoJY5nap/IFLOpu0OTJJgAOWcJioRR/CLDZHVg0oTknsrE/BqzuM8Okc8An3RrQEQPLwcvrNJm2HNCTVYG+TB6YFPAAXoeCpUXLqSWGLPWFoNsA3HaAoBsg4rIBAae9fGpqMgoU+qNAtFsANmZsQBYD8OVlYJJaACTXRkAJVwL22iYYTN4wWat0QS3/LJmOaLIEuB12IGgTyxfZXMf836TfnIoMhDwuINO1ixmsCQ3W54mqM8/tvOV6PZ0Rt6oDtGSKfCEyjKIABAR3Y8vW+wlMadFdI/dQec43O2+/UZ46yTlzFBeDrWGf3Cg5HfnNGx0NQ1Vd5XkX9911W/Sj10J7jBFQKET2PSKz/EOzwAKCR50g5LL9v7mz4gcXb00ObQ2b1+075pANV/+h+Y5v2Zzbq8nyqmdLcRUgyFLVf36r/5e3ZlZ94m6Z7Zw0ObjwC6l7/xq47OxP9xiQfuIF9177bne15EvP5tvWVl19qVwzejPjZwFD09TegYrTzhsaxpLXZcnRcNq3RuurENz1U931U4N7Htr13B/T779Tdc43ti4c3S2z/Pvs1/frO6t/esV43rKtkX7pzeCcPRYuWvTiiy9+is3/HTChqJjABP69Ydo0jPPfhAZr5yB5fXIwlHj6la1fSjz5olJZPcIIvrB5YzE9SrhhLtpf6GwfsVCpqPQffET/rfelXnyd8WmJlBlTYk88YjqPmBDt9tAZZ3e+tjj20WuW6mEUeJpmJ1avHL7Ed8yXS7FU7HcPMr5MJ/8JR8iVlW3fuTP6/NIxVos/vzS1qVdprN36JdHtchy6MPb03wYHcNjR6fUbeq/5TaFt83gGMByZZ18rdPYEhjGCoyL26gvx95dU/PjbI6orQ9My737UffX/xH51a9dVv0w98tRQxOGuQO6jFaIkDSmrDKP/2acqDjl17P5fZ2V9w8mXFbu7os/9fdQVQsecKGjE7/vLpxiSUVTjf3/JseCAT7HtGAgq4SnuaeP8F1TGOyW9fv36Z599tqenZ7trrlmz5sMPP9y5kxjCbs9giXaHHBr6rOuqimWGZELL54CQ2wHUFFxAVjWVWA4sViCWSWGZMAk2EbA5hj64kst0MBrqvC3lMkCVL4BFw5iUjM/pAGRDBzS1gOWYVTAEoDueBvoypoQoa45h5kEnYLmZS/4Q4Kh8G6heGwOKWQFwBQTAVF+WEgNAvnsjUD1zHyyZTqagAjZRBJyKhMVg+dUSWxJppneV11kCNtU1AencFMAuG0BtSAdm1AjA3Ao7UOd3AX6no3wxza9j03jMtNE3TB7OtG4SzARAO5amyuENAl5/EFA8fkA3HzENsPgkTbRh0ZCmB31OVYFMsQSkiiWsfsmBNEB3TASKaRHoVQwgk9exVGWSkMXSeNUZpoO8SU0pwCS/BhgYPkcJyKoGVtdnjVvG4iCNvOmsZsYdDj0TFwHICCbDZAOSaRsQjmWBUjqJJVAzb3LmZTeDF82eQfOtcSgSEPQ4hy6spmLp9mxeLxa9Z96wDEMHbMrILqedxYST++eLwFHHJ59/YuvlUjyt7DfyduU/8JDs889uvbKaHPDtv9/Wy4MHH+6eNbfnvjvST78i19XY58+VQgFlaqNtG/G94W+ckX7k7523XF91waVycPB2JYcrJl35o9ijf0qser/u2HNl7yiB04o3YFPseiE/OHUAot1ed/kP+//wu/7b/hC59OzxzLVFrroo+fKb/Q/9I/XsUvs+k4MHzbU3DJo2GSU99eH6xGNvZzsGan5yxbbiaBBF3/RBhk+w2Zr+46fpD98fuPk+JeiX582QJzc4WprFMWct86vWpx5/lpxa/92rt+XCb6KUTCT++UrogtNt3i24w+LGjr7f3OmbWhs5/QDn1Gq1P1ls7en//QNq82THl478FM6rW0Pt7vcNc6Yo9vWKouiMjFJ0joDs9jad/K0Nf73Fu/AL8tbB4TZbzSVX9N51y8Dv/hS+4HS2dZFHQ+xPj7vq6hz1O9DZMB6si+dTGxPbXw+Annj+iKrtrFMoFE477bTFixc7HI58Pv/jH//45z//+RjrX3XVVdOmTdtzz1HmVT8FdvsCawITmMDOYCKL8HOGc3JzT19U7eiW66qHL0+uXl9zwMgeQEfT1J7ezmTrMt+Uod6xVNvHhVTSNX3mqPtXKiobrrpGjUVjLz9vW9M5sOxpXdNssuTbby9xaqN7vy3DjwXBc/rxhf6Bjltv8MzbK3zslwVZBqRAMHLexT1/uHPdn64Pzl1YtfDYEWSJrpX0UknP58oFFiAqSui0szvvuGng2jsCl55t848eyzgcvsMW+Q5dmH7jvdxbH/Q/vkQQBNnl0NSSli8Kki34leOqLt5za+uEMgpvf6hVDHOaEEXP3vu6Zs/Lta3LvL8k+/p7/emMPRiQA14x4NcVWfC69WJRkGViCVu+mG7daJQ0/6KDfAsPtLm3Y4ASfWaxo3mSa0QSs2H0/fbuyKmLKk4ZNMR3Tq1hvxnhrxww8MgbXb+4ue7n35fGr/3fBtSPVxvD3F+LvV3iuP9mlUDEUVEff+6piq3ipQHR4Qh95azeB+7u/vEN9v329CzaR67avjFpoW1T5t1ldRd/Z5xj+D/ET3/601deeeXNN9/cb7/97r///gsuuGD+/PknnjjSHCSbzX744YcPPfTQ4sWLr7zyyl119N2+wJK8AUfdVEB0uAE9mwZME2STRDHTCZ0OGfA5FKy+LY9dhkGOwXzYGjQB9/oAe7iA1ZonBwJYZIxJz2j5LGB3uoEKhw1QUwkg37EWSCWjWF2NkjcEuBubsbiuaK4AtMVzQFFLLO+NAfvWzQJqvtQA2KsaAPfyd4BcZyeWEEf2+SjzWObh+ruByqo6LE8pk8ESdA3QCnnAowhATWM1UBfwAs2hBNBWmwE602anoYHlrh5x2oEGnwNoDHiB+qAXcAo6UMhlyqc2GPuoFgEtk8TitMwWThOm3bnkCwBysBJQgxVYMXymQ5U5k2HSh7pWAnSxCDh8AcDvtAPBwbfPVG4Z5bdGUgFQBSBmF4BoxgDihSG6yClLQKXXjcX21fiKQJ0v05XKAbF8EQbptEq3Havf0+Z0AUqoAnBUVQHBqgRQlQMQNQkwv+Rs4pAjmukEPfi/rmERaeb/5p7NT4LJd6rJOOXGzKLJespYTZSKPwiUELGaMR3hXa38mGCwPmcIgqOyKvmPJeEzt5BbeWqrhtuID64rijXfuKzj7tvy8zYFZi8SRFti1Xuxj1+vvejyMcoOQA6GKk85A/CdeBq6nm/fVNjUlnz479r7y12nHy+FtyAzwt/6utrdF7vzoa5br3fM3St0+NEIgiBJ1edfUuzq6H/kgbbWj50NM0N7HmgPWLHKb/3dEYlI/pGkiOQLNF51Tfz5v3dcfW1ov72Mxhp7c5NcVz3WZ0wQPF/Y1/OFfcOg5/J6NkdJkypC2+XA0m99oMWS1V8febMU7XZ3y2x3y2xALxZL0YHc5g1GPlccGDCiRVEtYheR/VJddc3hJyqRinF+qhU08cCRIq3M+x97asPl6mronCRb5MyD9Fwht/gF7wVnjGf/Y8Du9SiTJpd/dU6dXlJVQysJY0QzDYN32p79bz+zrVeVqpr6K3+cXPpe4aP3B954X83nXJURnA5bU73gdTtmTLU31Q+/RKVEMnnnw5WnnaVUb59C+7+Fpmn33XffRRddtHDhQuC88867//7777nnnq0LrMWLF1922WWAuON5U2Ngty+wJjCBCewUJqJyPncozS2FtctHLCwW1eyypcP15ibstXWVp5+de2/Jmvv/2ybLoqJETv7q8Hyb7UMUHY1NjsYm38KDoo8/3P3zm+tu+PEI2lKurqj8r8sLrZt6f3u3unal59CjzAJFqamr/c4P85s2RJ/4S+zBJbLL7amsy/R1qYVcwxVXj344QQgcdbxn0UGp997Ov/x2/K/P6GpJcbsQRXd9japptpaposPumjdTigRHFDei0yE6xzUJnl26PPanv7nn7mVSbts8dUVRqmuU6l0wT5fasCFw6EitffbF111zt1lnRM46ZOXXfu067YQRs4o7imxnt60pU/7V5nTJbnfskyWheV8Yz+beybM6X3507HV8e81nr/mAlssWuzoLPZ2l3l69dW3fUy8b4J02WQt67VOb9O6+5KtLpGDIPWu8/qj/h9i4cWNXV9fhhw/11R5++OE333zz1mueccYZZ5xxBtDcPK4GkXFity+wDNnhbpwG2JxurLA8NA2L0zKfnGw2EUv7ompDbXFmZpwpgVIiNYAjnQCGPx0qwQhW6pyZTmCY3WGJKFDKpIBCbztQ6NoAFGN9MCicUSpqAdNe2Vk3DUgWSsDK/iLQkTAUWxH4pD8HHNEUAhYe+zXAXlELZNYtA9T4ABYtN+gUZcq8chmgmIxhScRKagEopRNYpJrpim4SPnaHC5jtDQJ7Ta8BZLcXSx5kftGZFEspn8Mi6vTUAFAwn60NnTIvZYqTEMoXRMtlgUFbsmIe0HJphnok9fJlMZ/UB6Vyw6zL9GK+vKbpw15dVQ8UKgNANG92CGaBRE4H2jUB0FQBcJphgoN2ViKWfVR9yAeI6Xj5yvglGaiIRKZXhoCOeAqI5wrW6Aa5ImdVDVCYPBtQhzFMNnkTEOwCUFUB8Hg1QPa6sPinwdMslQC7bMMSxpn79zntgFgqArnEQPktNltKzcti0nvmvEw6kwfShSKWZG0XQtiRqJyJLsJdAkfDJKFvpBA7fPnXu//fjcqUZs/MOSNeck2f6Zo+c2fnmUCw2cKnnlm85brs0k/c80dxA7dPaWy46SfZdz/q++Of1Nlz3QcdLkcqAUdjU+23v2+USplVK0S7XUzEfHsvGJthkry+4KFHcuiRALquZdNqNKalk0bHZqErVez4JPvca8VkylNXbSiyrbkJWVKaGgQRqbJCdNoFSRIU2SgUAT2bK0UTulrUY0m1Pyr0DKjtXaVcoebcixyNTTt9VcYLX8sstS86QstmnzrJ5t12PpJdltzOMXoFxgnX7BlaLjd8SeXZ3+j7w53eyXOGgqjHgK7LzvH6ttucLueUZueUwTqjArRUKrX8Q7o6Sm8u0wWx9uLvKBXbkz59Xmhra/vxj388fMlhhx122GGHmT93d3cDVVVDo62urh4YGCiVStKOCM4+NXb7AmsCE5jATmFiivBzh5bNZLt7RwiUbAG/fd7M6N8eUcIRpbJ69C13BeSpM3IvvzlqgQUgCK4Fezr3nJ14+MnNN19f+eXTPHsPzosJkuSZs82QlrEgijaPz+bxAcOZD71QKHS2F9o3asmk1ruxuKIt09WFKOhFVRAETVVtdsXQdMlhL+UL7spKbJJUUak7gsETD1aqa3coF2jnUbRJ2jsfcujC4QvVQkFf2sOpozNJerGkZnKj8r655avjf3zcJor5RNJVEdY0zXXkgc55M6XgKIZZJUUqvrcksPDAstjfXlOr1De0/vmGKWdcud0aK715XWlYo+iOwub1BhYe+Kk3/0whiqJjy7ny4ZVTPB4HvN6hPzWv12sYRiwWq6io4LPHbl9gxXP5LDbAVVHLkEYqg8UbDT5mDfZhGUChpAMlvQj0JtNAlelalM9i+V0psX6svi3JGwCUSC2gBCuxmt1MqkZNDgCFnk1AdtNaoNjXjcVVmPs0ubHAlNnlo3clDWBlu5ArCsDGfg2I5fqxHK2OOOBoQPIFgXxHGxa7Izo9gDic+1FVhjikDFCM92MZ05fi/UApO6xNUhCxnKtMdn24Sf3gz/JQD6DkDQJyIAzIviCgOIfo7lI2DdjcXiyOzSQ5Sul4eVQmX2XSM2YH4mCTHWAJlcyRD8ZKmm+EaCufS8PkFkCvjwCFUi+g6TnALmlAOg/gcQJU+wWg0asAk0M+gFgvkFy7rHxNzE+DHIg466YC0ya3AF2JDFaM40A2D+jd/cCUlj2xmMtBXVRkKeDd0AYUYylAsNkBR2W4fNHMksU8ZdPvyucwu1CHuk1z/V1YcjrNfIN0HUs7aH4OTRuzgUyu/H85AHOXVToTU4SfO/RC3j2ag3bkgtOzby/t+v3N/sOOCiwaKwJvZ+CZs0f6pU1jryMocuDsk12HLUrd99fkG69WnHmuHN71NyTRbndOnuqcPHQptq+v3gpqf192Q6va2S4oimfeXvaaus/oMSB85LGbrvtZcVOX0jg04Rg8+ZjuH12nxtJycBSNfPLNlcFZ00ak/mnJdO+vblPsTt+Bh7umtdjcnlIinl29Qli1ufPhJ4OL9rEfvJ/SsMW0Y/Dko5P9sf4/31dx1jfKCyu/dn78pWc2/vWW0PwjQ3P2H2Pk+c0rAgcc8unO+v/nmDRp0ggGazjC4TCQSqXKSxKJhCAIgW0ERO5yTHxdTmAC/9YQBEGw2cb7b4LB2hXILP8wO+xLfzhc++0VOOeU+EvP9v/xzkLX2LGAnxJSIJjaNNJDa1QoddWh/7hYrAp23v7b7LrVn8VgdhJ6odB1923pt14x7CUt1tV5563tN/wi+c6berG4y48l2h1yMJR55Y0tFrqccnVl/x9fHWUDg577Xy5Vb+mYpZaiv71b8garLr7Cv2CRHAyJiqJUVAa+cIj/pK82/fAnaI6uX9xSWL9xi10JgvtrJ6Zb18cefUDLDomxAocfEzjuy12vPtb93P2pDVvYkpWRWP1BdO3HvoXjUmv9i6G6uhprotBEd3d3RUWFPKZubxdit2ewcmopmSsAvpAXKErmhRsyjhpuuGfyAalCEYtJyhZLgFpyA5Na9sKiatR4FItcMdVdsj8EyF4/FglUNBMMBRGLmDHZiEI0RllmZLdjmVeZCjCTecgUAOIxWzCmARuTpplWCQg6E0DQ2Q3sNXNvLL6qlIwDpjTVpFIklwewDWuWNCk6UypkdvaZnE2xvwdQEzGGlFJq+RINclpm85rbDSihCOComQQ4G6cD9ooawB6MAD3xNJYrukN2ApVTZmLxWzmnGyj2d2HxUiadYyq3TGOw4aIfk+XSTV/4xED5cpn0z+B+simgceY+wKLGCGDQB7iUAjCQMQCnDDAtZAOmhT1AjdcJRN99C0iv/gAodLeX3xo5GDHfL/OSBuumAh2JNNCezAKtsTTQFk0B0yLVQOMXTwcc9VOBzNplQKF7E2B+5Q2yXP4QFkFoaCpQymUBn8uFJVlTMymGmi5z5Ytg+imb25pKLPOzHcvmgf5sgbKl/i6ksCamCD93KAK22dO39ap7/jzXvJnR+x7tuf93rrpGx177embP24VX3ubx6pqGYYy6z1I0LoWGnu8Fmy1y2dezH6/queOe0MFH+g86bAeSK8cNLZ0spdOirBi6LofC4/QNMVQ19vD93r3neL822BQWgvzq1tQjT6Xe/EfFV89VqnaBtn04Ks44p+ee2w1VHa6sD118VuePrnPvN82334zhKw/89Q3J5Qp8eQvrjf7r73BU1AZP/uqoF190OoPHfMkxfebA7Q8ELvzq8Cgem8ddf+M16b+9sOn6n4ePOdG37/7mHtyz506+5r+Tb77W8fyfXIGwGKz2N89zROpBz3ZtyLYui29YXXfJFds1ofiXRGNj4+TJk1988cVjjjnGXPLiiy8edNAYEQW7GLt9gTWBCUxgZyAI4o6I3Md1c9U07eOPP968eXNTU9Ps2bN3befzvwBy/X2ByrE064Iihy88U88XYg8tHnji0ejiv3imzyBY4Zw8VfIHbF7fzsiPBFEUBNEoFgW7ffjyzLsfaW8vja9YG9xztnzoIse0pvJLrrktys+/33fdHfn1qyvPvXj8xmljQC8Uku8tKa1ekdzQKtntCKIky2qhoBULkt3hbZ6mhyKhQ7+4TYtR6Hnkj8WeztrvfX34QseMKY7/ujz+yN877rgpdOSx/kW78m6qRCpFRUm9usR35JAmyeb3+o49tOO3i5X/+bpj0iBflVmxufvhf1b/13eGjz/9z3eK3f3VX79s7HLZOXWaZ+FBA7c/UHfjNcOXC7Lk/coxyvw5A7fcH3/luchJZ7imtwCCJPkPOsx/4KGZtasy77zZ/doYiQNQAAAgAElEQVRjaiajeDyFVCpy9PENp5xqc+9UD+PuC0EQLrzwwl/84hcnnXTS/vvvf++9977xxhvlYJ/f//73L7/88v3332/f8g9hF2K3L7BEQTCT2tRMGkv6YzITJlmiOT2A5AkAasmUOqnAQL4IiOkhbmAgkwdqA0EgEK7ByozLD9qIF4FcPIvFRVUHKgAlncSilExtljmNoms6YDLVpuTIdOt2mE7x5h1Hx1EoAL6UA+hLCMDmhAZsiKeBhqAXCNY0AUXXAAxSCCZ3Jbm9gE1WsGLvTG5GHZboZ3pWDbY6DgwAhYEUUEyqgJofam+RHALgDNsBl1rEUoCZtIoSiABtvTFgbX8Cyz7KNBUzuaLmigAQaJ4DZF1eLC5q0A7KPiRjklxesORx5neNKGKpxMzRml2Egm2IzRIkBZi+x/4MpQrGgc6MCsiiADQHncDkkB/IdrQBufb1QG7jeiDb3gHopqFUJG6qnezVDUCoqQXL5b8tkQfakyUAssBHvWlgboUbmN+8N1DR0AxkWlcAhb5OrOxL0enCYj1N5Z9WLFDOsjR7V4t5yqyV2YxpSuIUpbyt5HQDWZMsLJm2XgZg2+UUkiDsACcxDh6lra3tlFNOWbp0aSAQiMfjCxYsePjhh5uamnZmjP9iMDRNady+z4LosIfP+wqQX91a7OguvvORvmlNpqNb1zS9VLL7fSC4prcI/rB/4Rd2qOSyKYqh6cPfy8Kmjuj9f6m75Niaq7+UeOmjrpvuDp10lPvwoXklKRSo+n/fjd54d/99t/uOO9m+cx5Iuda1iaceB1ton8NrjjhHcgyrAAwjH+1JbViVX/9J+7s/s09trvzKWaN/RAf6wpeeM+pLgdOOk5vqkw8/Kdod3n0W7MxQR+756BPT/3iWI7cQffuPPUyujLT9x/3hL+2n1IXV9T29f38nfOFX5eoh4ZqeL2T+/krlWeeP7SsxeJQDDkm8+mKpPypFRgQ5Y5/cUHvDj9JvvJt44cnok38JHnPiYN+AILinz3Rvw3723xY/+MEPNmzYcPDBB9tsNlEUb7vttnKP4TvvvPPwww/fddddEwXWBCYwgc8GgoAwfpH79gusSy+9NB6Pr1u3burUqStXrjz++OPPPvvsf/7znzs1yH8hGKWSmsvb3ONtm8dkZWZM4bBFgDl7Z6glLZ0pbmjX+gaSz7ySeed1zwGHBPb/wjhrZb1UMgoqw/JzUi+/5Z3bFDh0LhA6fl/3XlPWffdOZfaM4SWC6HRErr409qe/ddxxU9Xp57hnzh7/KYxA/6MPhuZ+ITL/8FFeEwRHuNoRrmafQ7LdG9ufvjex5PWtiaj8htZiJm2f3LCtQ7gX7CGF/D033Glg+PYZJVbo08E9Y2bvn+93r1rv2LJNwTV/nqHrhRVrex75p3fPWTW/+P7wmVYg+dRLotPtbBqluWEUiKI9Esm8/7H/qNF6HQTB84UFnoX7JF96o++vD8af94dPPuPzdKzYjSCK4h133HHdddetX79+1qxZw2upu+6666677hqx/rp163bh0Xf7AsvvUAKKCKTXrwPyXRuw7JdsTi8Wq+SqaQRKugHECiqwOaUC+ZIBtMtFoDtTAGqSWazQOjPCz1RrZYoqUNB0wCHZsJQxcxunAcVoH2XBUDoFqKlU+egmS2HSMF7FdPEGsHv0RNYJFBQBCMkalkzHlIul80WgsjIEgxyPSc6bJkmpXB7LXV2x2YBAuBLLw72UjAG2WC+WKbkomVZMBlAqGkAxJ2Cp1JSSASjuEgz2qpkEj2kSlhdlYHVfL/BhbxroyWhYvFG9r4CVGzinJgxEGpuBQr8Hq93SdOqS3D5Acg1ZlKlZ0yurWB6zST2a/I9J/pVMudv/x955x8dR3+n/PTsz2/uqS7blbgM2mJji0EwvpgUwgZgQwAFCAqmXO3JJ7sjlkrvcL5dcSAJJCIQeSgi9mGZDCJhq0w3GVVYv28vstN8fX81KlmVbsuUQBz0vvfSSZmdmvzOzO/OZZ57P8/S2A8X2FqA5UQfkNB3wKiVAhLg0hHxAVdgPZDb2AEa6DyinkoDWmwdM3QYkV8qbSQKWUFBJEpDXTaA1YwAfdNpApggQ8OjA2r400JItAQuaEsCcQ44Fcps/wvE/G2zxJbkHNsQx6R6woRc3skJgJxgscVgdek/GyTEUNGHYowABVQXWjiGPNZpHhDvtIiwWi08++eSvfvWrqVOnArNnz/7+979/8cUX9/b2io6ecZiFgjsQ2E1NlaQqSiyixCJA6IQjtY82Jn9/t7F+bfzs810jcDxSPB6UrQ6lEgu7Bz3M8jQm6s4/KnvnA/FvXrr1G0uxCz7j/dSc7F0Pp59+NHDw4d7mZk913aiEWbZlGcVi/ICdP7zz101qPOGCzufuCR9y2JDnksW3V4WO3UnSsGdac2zJmen7H/M2TRwzPZYkhWftU97c6t2mDzRw8AEcfEDkosXbLmSbZu65l+suunzk7+NtnmqU9R3NIcvhE44MHfPp7LLneu+7A8kVOfrE4P4HjvwtPjkIh8Pz5s3b+Xxjjb2+wBrHOMaxOxBdhCOfecczZDKZSy+9dLB1cj6fB4z+56HjwEj32bvtPDkEnmnNtf/5rd6f3dh2/c/rv3iVHB7GS2kwzHLZLm91RMx8Qe/rGjwldOS+rbc+M/QBFQC+2dO837sy/diK0vtv9D72gGWasqKofr9pGNHp0zVbrjrtLJdv+Hhp+ptCbKusuZSdPywLNE0ziiWttWUIQ5N5a1X8igt2unjo8IP0dZuTD9xTe/mYBedZgZD5/jpOGIW6q7DqXdnn29amfwcol8v2pu6dziYpSnjRsaETj8o+89feR/+ceuqx6MmnB2fvtyd6EcYxWuz1BZbfZafffRUoCDVMVytO95bwrBJCJaF6MW0byGgm0JmzgEzJxrH/TpVsoK9kADGPBv33eILlypTNyt8eWQJ6i2XopyNmz5zL1uZP5b5OKtSR8H83TRxurCHsAibWWB2qC4gqFjAhYQP1IRmIelVAVWTAsCxA9QeAsmECPZkcDoVW0g0cB/ZCWQfq6yfg+GYJIy7R5GgPusi5lBSgZsqApQPIHhfgjvoBkbsuzOs9VfXAxmQGWJcqAGt7DaA7C6DINlDQdcAnF4CI1w0E6uKAL1GLw6iJbkexQ7JFDdDLBuD3hgBfwyQqKYe6aLG2qTToeXw43J5llAG/xw2EvG4gohvOcehPHlQEJSMa7iQJhy3rzyqWHFe0QYmBAiLSMaPZQFcaoDM5UHz0ZE0gXy4BRaMbR7O1X8NEIBivAYxcpjJ4MWzZ461sfj+kAfGZoOvEhguRmTLIXt+tyEDc7wWqXRJQHfQDLzJ2GKUGa82aNRdddNHgaWeeeeaZZ/bH6tXW1v7mN7+pvLRly5Zrr7328MMPH2ym/EmHYfprhvN7sqzePz6oyrLe2SNPavTP39/dNAq7UUlRqr59We/1t/fedXPigkv6Ix+2A9nrkZStquroKce0ffd/yp0pd23/g6386vWJudsV9EiqGj3jeCAB2LaZzWFj9KWMzm5Wrt7yf//laZpQu2TpsB8tJRhKHHJ436vLao46eySbZlmWu2arz09p00Z3KOAbzktsW8SWnNn5nZ+kV/41cuhOGK8RQglH5MDoSmRjzbrw/AXbTi+uW9vz4L2J08/2T5s55CXfhGajZXjnhW0hKUr4xKPCxx2ee/G14kvP9/z5rtjBC6REdejAg7ftEbbK5fx7b5a2bJHzWa2rwyXLhqb5G5p0yeWbOtM7cZJaPdaBp59U7PUF1jjGMY7dwigfEUaj0UMP3crVcHsC9rvuuuub3/ymz+e7/fbbd2+I/1DQerr00ja22paVueU+7d01/hMOkMNxc1NLx4+ejyw8NHLuqaN4mChJiSsu6PnpDd23/r7u0qvYPjFplXVb02DA4VqOhv37zdz0nVtrv3SSd2J14cO2zpuf8R8xMumSJMnhECBHQp7JEwKHHqh39vT87w09t98QW/x5ebhHlr5DFmz51f9K3lD1ISds++pgFDo227Yl7lEr6Fu+zFRGTLsqsrrPtMIbL49VgVXesI74iAITKyi980H0pDO3nd5z7x2e6qbuu26dePUPhvRL2rZVamkPbbsMYNulD9d7pk8eWjzJcvCIQzjikMCW9sILr2cfe7DviYc94bBvwkS9qKk+X7m7w8jnS8mkEvC7JzUq++/j985Sa6qMbM7oTUktrennnujJFRSPxx2NufeZ65vY7B0UMj2O0WKvL7BKHZszq/4CFDZ9BJT7+gBJVQCrUQPcNU04+iehaMnrFpAu2kCqAA6D1R+0JwGYlmhSA8gbNpAqWkCuPHDjktaEiVQSCLrdQN2sAwGEe1ZHpDKnEB4JX/iYzwNMjapApr5cHRaiLoBJMRcwp9oHTIoGgXjAiyMFExbe2ZJoeCwC3bkikCuLoUo4hIoYYv2EKVScrmSZiqFXNA54+roBPZPB8c2S+rsFY4C3fgLgrm4EPIkaoGdDO9BTNIF0ERxxkqoA5Lw2kNXNyhiKZQMIhQfFQbo9QKpQAnpzRRy+TXBvVUEfEJ8ym0rqYiBEpZdQUQF3vBZHE1bQyjh8npDWCYgpRbHmYATH2MwdTwBGvggoRQ1Qgn4hMhMXMMFjeWQX4JYlQJJsnKBDlwbQacs49vF+tw74lDQOeTalKgpU1U0ALFPHaeQUPmwl3cRxsZJdCuCJJgDbjFJhsCQXDqdV0nUgKCg6nwcIeFSg0La1A+FuY7RZhHV1dUMYrG2xbt26pUuXrly58sorr7zmmmuCwU+iB892oRve5olDpnX913Vuvzzjhitdnv6nZjWdya5fPNb3v7+LXHSuXBUb6colKfHNpV3X/F/vA3cnzv7c9uZyh0O2aQ2ZmLji88W31rT+/C5PJKhl8omvXOidvosXV7W2qv6//yVz9yNbfvbjhsu/plYNdYFX41V1F1zSc88dtpavPuw0ESAxLPpeeqhq0WeGTPRgqWedNPLxRM86ufPff749669Rwcimi5vXVy++dOezDl6qqHmbpwyZWGptkWVl0mlL2x+/Of3XFdGjjhv8qnfi5PyLy7ddVf61t7Sn/lLq7LYtWw4FQqcfHzhkqLrI3VTvPu/U6Hmnmuls4e0P7HLZ2tJmNdXKzYnQ3NlKzVCnsSENqHpHV2nNenPNus7nng5NnqrM2i88pp2Ynxzs9QXWOMYxjt3CWNs0rFq1auHChQsWLHj//fcnT/6E3v4W1q2VPR5P09BCCtBaWyxVH8xMmLl8qbV98k1fq1RXgLs21vgf5635ws/tJ1YkLhhaYewAkixX/+tXOr77/zyrXw8e8Klh5zHLutGbVOuHPgnyzZ3V+ItrRv5eO4LLFT7/dLNY7Lr1d3WXfVUODuVifFOmN3z12+3X/1/y/dcSBx4VmDjbV7tVS6CW7OpccW++qz0xZCssK71hQ2PzZ0c+FjkSMnXdyKaV8G5lpNi63nf3rb5pzZ7JwxzZHSxlaprsH2pGVdq0QZJlkORoXe79d4cUWEo4UuzutU1zSDGUvvOBqnMPaz7tC2ZRSz7zZvcfH9Reeyv+5QuH/W7KkVDo8PkjH6qAWlej1tWw8NBIWU/e+2j6kT97JzW7q8afG44ae32BpXW1pt9OAfmWLkDPG4An4gbUcASwdQ36W/A0w8RhsEo6gG6C40olrjIeGcCrSDi0kD5Io6MZAJoOjjTKp2pAwpsE4pPrgcCUfQHJ7cWRQMnBCPRLguIBPzA9HgBcEtmyBQTdLmBi2AdMS4SBSVVRQB5kBS7azYTiKlMq44jAMpqBQ7yVRZid8MpySUBN83Qc5ZMaqwH0ZDcVz/RcCsdFvd+23hsA3NUNgDtRBxi22FEWDqXnVgB8bgCPAhD0SEDILQNBtwL43Spg9Gu/dBwGyzAHWjL7CiUce6dUSQPqwwFgQvMswB2rxmGwBEmkRmKA5Q8DbV1JoDuv4RibidOLoKC6s3mgtrYR8NY34/jg05+TmANkr3ewTsUo5oGaoA+YEMkBrTEDKGgmkM656HcE6/8MJPM2sCWrAzFvHsc1TdMNwN9/pdQru05MNwblCgjqTqishNhOaP5cpgbILhcQ9nlwjMGy69YChQ3v93+Wxsrae0y7CC3LOvfcc4899tj77rvvk5mrY+ZzmaefyL69GpcUO/G0bU2YFKMkHzRn8JT8S29UHzxLDg99lCYpsjvo928vlXn7cPm8Vd9Y2vWT613hiH/KtG1nCE6abPQkR7vaXUDsks9m//T4ll/8pOGKr6vxocoz2R9o+tZ3tfa23AvLex58TlY9nlDEHa0yS0WzkMkne+LHnFh1yOVDbgBKrS3+6irxUHKEsIolSZJ2s7rKr3k39cRD3kkNkcvOH9WCtmkNa5caXXBE6bWVmbVvFje/Fzn5tCGvujwef3V1eXPrkGIuOHmCGg8hIfs9VacdHD18dss1d6euuzW89DyXd4z9nCS3Gl9ypre5qfeOm2ouuUIORXa+zDgGYa8vsMYxjnHsDiTXaLoIXTupmV544YWPPvro9NNPv/HGGwdPX7JkiW/7bWX/SOi+749GV/fUz38n+c5L6eef2bbAym5Yn1i0lU2lvvo95YBhfDuTj76mZfKJ0UjdK3BPaPDNn5t+7H7/V/5p21q87FJ45wMW7igheKwQOudkvS/ZfesNtZdeNWxgi6e+wbN4SQK0jnZt8wZT02ytFJx6dKyqRgkNU0UVP/qAwOg+S9kVKxX/KIzHBqPc0VZqay288kKpuzu48NDIGceP+t7G6acZCkly7zO35ck71FCoZur0YV73BYpvvDukwDK8ntQjr0UOm91vOh0LNf/04g3fujH7xIrImSeObmAjg/+w+ZlnXuy84+aGL41ZJ+YnBHt9gaUne3N6Dsh1GTh9Y6pfCI8UQLAUwhc7pXUABd3GkTS5ZXBcqepDLmBy1A3U+D2A7JKAdEkH3LIGWJhAsmADQsOQLllAe14DWpJZYN+GSTjNbvogYyehs4nH/MDkeBgIeVRBaYQ9bqA+EgTifg+gJbsBo6zhmCp5fQEcBqjUr3YaIOTEhU9xmUC6VAa6c4XKXopVNwK+mgbAyOcAPZ8BjFwaMHMZnNxAoeCS/SEc6ZhAyKMCdQEVyEZtIOy1qajHIgowJeoHmqIhwIsBaL3dOEdFqMH8bj8OuyaonbRmAFlNB4q6ieNuJdrlQnUD90ypogZ0dPQCLek80JrVcBo8Bbsm9kM0kweqG2sA34RpgKkVcdRdwlUL2xYyL3FcxA6fWt0AHJgX1FoGCHhMoDNt4nBXIvRQ0Hhl065sgkgCcCEB/rIg1cRmmpVDppkmjhZQnKVVlwvHWU1kEgTcKhDxe3C0g1pvJ1Bs2wAUNonM3Z304Y8CY8pgrVmzBvjZz342ZPqpp576CSmw3Ko7PPdwxRcod6wPHznUSFNra1U8Hu+05sETzVQqdtTWl0abTdfcaXRm6/79G67gLuacJL5wTu9/XZd++cVtxd3x40/e/LMfRfMF12j8TncZ8cs+l7nn0S2/+EnN+V/wTR6GURPw1NV76nbuVmWnk+rcoT13O4b24mvBBaNwVSj3dOffWlV86/VyNotEaNY0df6+sYWHyv5d+Qy7vB7bsoZlnePHneRpagrM3HfYoi10xDGpJx/k7JMHT4wtPS/9i5u2/OzBpm/1q+YlVa5ZevymH90TPuUYyb1HYoyrrryw8z9+YWmaa4+Znv9DYtwqYxzj+GRDaLBG+LOze/fLLrvMHg4i1v6TgGJPd/tfHv7w9/+Wadvo33fOkFeTTz4sRbcqjm1dL/WlPY0DLqxaa2/bf95TWN8Vu+qiIW7go4MkuRfMK7z6121fUcIRb1VN9q5Hdn3lo0T43EXBoxd03fGHvmWPDk/njBjlti2u0dBRpfc/0jP5yIIjdj6rg9SKp4ob1wTOOqHhv/+l6dofRL78+cgpR+9adQUiLEHa3lYHZu23va+Vb8q0Uk9fuaV9q5W5XIHzzki/8kHLv9zau+wNS9Nt09JTedsy9Z7eXRzhzqDEo2o0knn95T20/n9U7PUMllXWzbJKv/E1qk8CvDURwNswAfA2TgFaetNAe04DstoAfxDxA0yKuoC51T5gdnUEh0wSmYPCbqq+LwtEPDlgU0bH6Sj0qhKV/sSyjpMcp4ZiONZTon/Q0nUArQhMTESARNAnZF4hnxfQkj1AftNmwCjmcNrQHC2LjWPlZdgDJJzDXQ3orgSE4EwMXnBCQpslaDmPPw4E4/VASJGAcqoPMPIZHMsu0f2nSACNkSCOAiygFoFs2QR8igtoCvuAmTUxIOF2AfmW9ThZhGJfm6UC4G+cDCQCPhwlmeDhioaFk29oWgM6LUHtiOY70S/Zky8BHfkyTldjybBwWv98ioibLANdmRzQVD+RCoMlK4Ce7AKsUlH8KzIEta42wO/xA4dPaQASfg8wJZIBNqQ1oLdgAboFjkov5HbhdBFqg+Rl4jCJ6WVzgG4ULZYiG0DMIw6ZT5FxaMKE3wt4VQXwiE9XMQ+YWZGzmQKQx5DBkhgFg/VJlFWNCo1X/ZNtmkZfrxwKu7xbNfObhbzWuqX6W18cPFHv6vNXRSs7tuf+ld13Px/89PyG/3fRtg5Go0XwsINS9zxqZNPKNuqZusu+2n3Tr1P3PhpdvGg332WEiJxxvGfmlOw9j7T9/HWlsTk4b35gxqxd8MO0y2XvjJE2T9iGkb3zoaqzzhvVzlRtS11wYGD06rftYdf0iJKqVp14auHPT7i/dvHg6Wp99YRr/yP34uu99zzTedPTQGjKhOgZJ7ob9uBtTPAzJ5QeWs6Yhmf/w2OvL7DGMY5x7A4kSRr5teeTqVsfLSRZHtaqMf3kI56GmiExz7aul9K5/LubPQ3xLT/+U7G1t+rrSz1TRmH5vaORuFUlGNBatyizhhZYLrc79pnztlz3c7moBc4+6W/zrNA7a6r3375W+nB99uFn+x65tzObDzU22h6fOmWaEgz7Z8waVqQ1BMVkMjFihXvfLfeZZSMwe79RjVMvlaQ33uGIg8bED902DLB3rVwOzT9k07PLPO+v9c3eWqQlScHD5gcPm2/renlLxw4yGccKvjmzkn+4t7j+I99wbRPjGBZ7fYHl8nj8dSHAV20C7ngECE6bDYTnLAAC0+YAL7y3AVif0oFsCRzvq7qQhGM9dciEGqApoADFto04CpjaSAJonjEBqG7rBqp7MkBnvlwZRsyrAh4hFhb+4bKMQ0HZwgOpXATKmSROGF9AVqxyGcj3tgF6ejCHZOAIyOz+1jMJJ0lQfFO9igtHeySYnohXxfFS9yoKDk1SKA1kBRb1AT/3gKoA1UEf0BiLAR6fHyin+3D8sbS+LqAuVg143QpQEywAeV1I02SgNuQHYh4XkN+0Fii1bQSMbLIycrOQrbxv9aQZOC11gldLlco4HYWCmROjFZSPUGsJBitZ0oGcblXmlwZ1TQp+zsKubKkhyYAnUY/DzAlJnJFNiyMiLO/L3a04XZ/u6npg//pJwIyaGLCxNw20ZgpAX7EMaOYA/xRQZZzEQDEYcZjEYRM2XSJcUrCb+bJZWQP9h9KszCM2IehRgVggjGMD1p9XKNItxzB4RnKNhsEaFxXsIvqeXVZc92H1vw+VCXuam6quuHDzj253ya7AIfPqv7LUNeyjKMvSNrRIHjegNtSO/GrtDgWV7VQt7tr65u/+MLf8ydZ//q/oYfPt6njw8INcvq0tNC3LKmnDD2lX4Z0xxfutKYBVLGnrN2trN1rJ9vzbr/c9ej+SFJ4yVXf7QvPmD3sht3UdcI1M5K63d5XeXlP7+dF5VgHVSy5J/vEPyRvvjl06uobB4YfR2uGvqt61Wk1ye6oXL+m67rb6f/+GMpwdmqSqf4PqCpBcLv+CA5OP/tl31T/vuXep88b2jww1DNse3vS+tedGMibY6wuscYxjHLsFSZLksfTBGse2KKxdk3lhRWjRMcNWKt7Z08JnnazW13qnNw95yTbMwqp3cg88WU5nZEX1RMKlVNo2TTUS9h12YPDIQ13BHTJPtp1v64hu/6C53J7wiad55x2cW/1a5uFnMg8/g2V5ohEtk1U87nI2Z9u25HKpAT+qWvX1S9Ta4UJ+dhUun9e37wzfvjMqU4yevsJba8zX3+q+51ZsQgce5Jk6Y3CMjJHLyupIddz5R5f7mqeOKgFQQHK5omcv2fz//oOf3xi59Pyd7OSdofjqW9IOk4t2jMDMfQKTp6V/e0f8ny+XRrztewLRz5zU9uKPC2s/8E8fXZPByLGpN59e27Xz+QBI9eYZG6p3T2GvL7Dc8aroXOE75QY8NU1AcOYBQHjfg4FnP9wMvNSWAzb0WUBBA0gEAZojKrB/fQyol3Wg7+XngOKWj3AoHDVaBfibZwEzZx0IRH1eYHMyi0OxBNwKEPN7cWLyiiLmT4TrGWXAtC2cPkdLuHMhCfrE7O/pE77qJRy1UH+OnqIChiWswMERh4XdCg7hIfoQRQeiSOhzSS6gqOs4vuopoUwqlHGoFKGgSmsDme3T6xKAnk0DRjGJw6gJK6ZArAqI11fhuKW7hPbLMoBiRwtQ7unA0TkJTk5ss1USblsDRlC1TVOAoCcO9OWLOKyV4KvE7hJ/2/1qM8FUuQC/IggkcOzKhAtXlc8NVPm9ONbn4uIiojbUcKwyHklWBMEmNk0Yg4nfgs0SJJynphGY1dAMzKhtAtpSg4IgDdM5Sv1knkf4WrlcONIxMWzBYznzmzhCOjHd6J8TwFPSgZCnDMTLBqBGEoC7qp5Ks+fmPGOE0Tq5j9X7fnLQ/ee7Sx++W/2NpZ6p270ahI4cJpQmu+KlzP3L/PUN4SNPCOyzXz95CZZWyr292t6yccu3fxSaO9t/whHbW3Px3Q/9NTWepp1chdw1tfETFsVPWIRt6319SFiapgRDLlJ0Dd4AACAASURBVJ9PGDgZmXTu9Vd7/ue3ngP3jS8ZJvJlrKBUxcPHfJpjPg2UW9oLy1/sve/OTDAkVddFjzjGU99gZjOexIiE/2Ymm397TeOu0i0ur3fSv/4wu3xZx/d/GjrzhNBRu2hpYfT0pZ/9a9OXvrFriwvULLkk9cDdXT/8ZfX3r3J9fDWW5Fbjl3+u7w93e674xrbOsePYFnt9gTWOcYxjtzCmNg3jGIxyR3vu2ScKm9bHPn/WDqqrYWBZvb+4qbSxNXHGucH99h/yosvjDc8/lPmHBo5blFr2SOdPfxc77vDg6cdtS29oz70s1w7jsLVdSJKaSGw7WQlHokcf5506vfWGX0bOOF7eVeeIUcE9od594dlR286/+mZ++Uvtv/9VoKHR1HWjPKIH5MV3PvREokp419tBJFkOH3eKbpiZPy8zP9oUOvdUOTS6DTdT6eS1N4dm7uMegf3EDociRU47J/uL/87eeE/4svN3v/thl+HbZ3om6G//7S/qLv3q7uzbTwj2+gLLWz8xdthJgBKKAv7GKUC3IQHPvrUO+GtrHvig08JJHvS7ASJeCZga8wH7NlQDnSseAtJvPA/kN60HrLIOeBJxwEj34ZiS18z+FBCsT+CE6wlaJRbw4XiCm6Uijo+8ZeiAZA2k0QmJFdiCJLOE4/k2gXTCAUuYeAkrcCHuES1m3v7WMzdQFfIBiWAAhzBzyTKQ0xQgWyrjSHx6SwaQLJqAKkuA0AJFvW6goVTGIV3EJpjFHA7H1j9aQewFI4CEDBiFXGW62AqhdhIj6Z9u6DhclIhrFH2FnkQdMCESBxRfHCeGTzBkeU2vjN+vloGgW8ehggR8/fozN056YzzgAyJ+b+XdTUMHXG4voIaiiB5JoZcyTRz1lZlLA3qyB3D1dQF6XyeO/b23YTLQ3DAJqAkHgEyxhEOziZ0myEXxeRDbKg6cOFjyoDZPGx0o6FZlTuGqVRhs1p8rAE2J2v4lQBbmZC1/Yaww3kU45rCs9Ksv6es+zK1bG/jUnIYrvyuNOJkYsDQt9evbXGW76Wv/LAd3dA1TgqGqs8+PHHNifvmytm//2P/pA2OLB8Khi2vWFde3NH79O7u1LYPgnTgpfsCBuWf+GjljJwnNYwlJChx8QODgA8qtHdrajYrLFawdpgTcFlap5Kkdg666xEmnRY86tvuOm3p+9KvAqccEDz9ohAtm//Jy+p7H4guPCx9xzO4PQ1KUpq9/J3n3Ld0/vLbqX7/yMfJYtf/21fyy5zuu/5lv3kGJ407e+QKfYOz1BdY4xjGO3cF4F+EYQlu7pmvdB8WuTtnrkZubGn5y9ajl4bbd/ePrsKSGL39zhA77aiwePet8+a1V6acf62vpCC/9rBIN27qevfdR78x9x9gZsqbe/PC9sVzhiOFurHM3jqZgsim2t444JXtHkH3+ui9emXnt5d4/3m+sfj/42UVK9Y6KPG395tQt95nZfOyUM8KfGubh765BkuXYORe0/uqnuZvvC3/xsx/b3Y4kBU46SjfNwvMvF996/dED9pQe6x8Ae32B5WuYHDzgCKArkwdWt6eBN7uywOqOMrCuC6A3I+GkDUZ8NlAXlIFpiQiQ+ehdIPfBKiDz/ntAen0KsAyAQF0WRwilhGOAEo4DwcmzAF8kiCON8rkVoJRM45A3/ZIjwdts9VtMdzZDlnEaxASDJfoHhWZIDYaBdL5YWcKvKjjCr5pwEHAbJaDQ8hEO8yTyB/11E3HMwcWyubIF9BaFUZMNqC4DaAhqQKGsAyFBaVgmYAuVmGCAPD6c5koBl9gt/iBghWNUTJuE4kovA4adxsk6NPNpQBOeXqUCoPd14RAzIg9V9gUBbyAEhEIRoDYSBDKFEo7RlOhAVGUZCHvdOHyVlk4CRqoTyHVp0E+6uNweQHZ7AeEJJPsCsi8AuFRPZTZBv1nZFA5113+kxKMxsVskCfBW1wOBaBgoG4J6lHCyBbc61i4XkCtqQCBfxKHcvAUNRwAnrLwEvSU+S4LH6s0XK7s6FogBYcFmPfUCY4XxR4RjByvq8y84MNRUp9bX7toakjfd4wmEExd8sVJdmcVC1923+Tze3JbNgQkTdV+g6pQztiUwQnPnBfeZ03X7jV3X/J9nYoPe0a0Ew/ETTtmt7dkGnrp6Y+3bI5nTNkwzlTGSKe+05o+lFAgf82ntuVeyq14LzRt12vHwK5x/SGj/A7Mr/9J+zc+D+870HrPAN2urPkczk8s8+bz22lsul+Lb94DYwmEe2u4mJLe78av/3HfHjd0/ub766i+P7cpHheiiY6KLjtG7eg888MA3XnvtYxzJ3zP2+gJrHOMYx+5gbLMIP+HwNDcFDhoqmRo5Mk89X3z7g8av/0slGzi5/Kn8qy/Jbp933oHBqQcb+Uz2xcdSxXz8sxduW7VIilJ70eVmPtfz6APVS07z1Dft+pZsB2ahYGjaDmYw0pnsYyvY3JbZsMkbiZqaZku4a6qq/ukySf3bXm4kyXPYgb2P3o9LCu3/qbFZpaqGjzjGv//81DOP9/zyFm80IkWCal210dEjlfVca7u3uia88MTwAfPHxEBr+DEoSnTxki0//+/CylX+Q+ftoXcZIdSaxCcnpGEXsNcXWFuSmeVrW4DWbAn4KFkG1vVYwOZegJ6MCyc3MBGygEQIYGrUA0yvjQPdz64AipvXA9nNaSDZLTyNABSvDhi5HBVBUmlAZeWJ+nFa/ARJIyHhtAH2pxD28x8uHMqncgLtt8sSPYOilUxRAaG9cMeqcciMgkjCs8HhrqpDAUDV8kB+y3qg3NOGozoSZJvgnPyeASVH0bCBTNFmgA8zgVRJaJ7KQNTrxUnu28qESfTiBSOAqXqAZG6AV4vEaoCAoIU8XkDz+IFyXyeOiksosYTgSRf81qC4RknwTN5AZQ+o4QSgRhNAKBwDYsJ9HwlH7lbubQP61nYCeqoHsESrnXCiD4QBNVEHyDUNgCcSB8qG6YtXA56quspblIIRoNzdhtM+2Q/Bb+llHIrOyGUrw1AVBce1v5wt4RjH94vqXDLg9geB5qoYTptnIFsA+vIlIDuofVLq57EGzOsNqwD0FUrsCYionJHPPI49A21jS+ahZ6rP+ZzstPT3PfZg/s036o89L9Q8uzJbdNan2h79fe+f7kwsXjLseuRAsPbcC/bQIMubNrj3mzHsS0ZXX+qO+/XNrWp1XfioE6ounCZObnoqmXnsgb6f3hC76sLt5Sr2XnertnaD7PXYipr4yufVumFsWncB4ROPwu1OPvSgrZXDBy8Yk3UCSjhc9ZnPVp15brm7M/vGq0o0bhMIzNq3esKkkd+r7A5kf7Duki933vwbdVKjWj+yfWVZendveXO7y+fBtt3NE0Yr2B/HLmCvL7DGMY5x7BbGHxH+HcC2rNztDwb3P7DiOd731OO5Va83L77KE60ePKckK3UnfH7NjT+In7lY3AINhWW1/uqnskSxtzdx7Inhw48eq7LYLBUzq19LXHTOti8V3/0wffOf8Prrr/y2EtpKmK9GY4nzL2r/3bU9P7ux5t++uu2yhVdX6xtbJv7gfDng7br5mdSvb41961IlOtR6ftcQPnqBHPD33XZfef2HibPPH36P7RokyV1TlzjptDFZmZnP5d9/N/fS895QMNPS4q9KaOlMeMbMYj4fnHewWlUzJAbbU9/gqa4uvvvhjgssozeZXf6StHFL+qONvmhUUhRPOFzs7TW0km2YoZlTzXgkfOKRSlV8TLZiHEOw1xdYvYXyO915oDVrAG1pG+jMABQ0CVBkGwj7AZoSALOrFWDfmiiO11GpbQOg9fQAWs4GTNMFeNw2oPoEERIAZH8IUPp/B4C8pgGGaQFetwoowTBO/mB/2p3oGZQGmK3+S5rUL9KShVTL5cLRCamhCFBGBpK5Ao6jlRD6BDxuwCcD5Do2A8Ut63AYLNEW5y6XAHeiDvAEYjikSFG3gZwGDrHnd9tAWjOBrKYDSjzBgI+8CchuH07Hn+kNAhu7kkBXvohDvQherT4cACZOn4tj4KR1tgDlvi6cKD1BAvWruwo5HApQGqyXCoQrrwq1lvhbcHJilxq5FFDuaQe0rlYcRZelFXFYNHd1Q2UpqX4STmteazInqEG/GHZiAhBvnAwUWjcC5d6OylDF8ZIDocoBGqzZMk0dMEslHN7LzGdxeCwB2esD9GwcCMergWBVDAh780C6KARwBk6zZ3+3KQxMtywcOtO2x4xLGvfB+ntA989vVBVP1Wlni38Laz/IrvzLxNO+OKS6EpC9AVl159e8F5xzwLav9i57RAl6wl84J2ya+bse3vLqytqLL1djI+q82zFSjz4QmDrJv01CX9/v/lh4e03tkku2G6IiSbUXfanlpz8sb2x1N2+VFKS3dabufGjiNef5pzUAE76zuP2Xj3b9+NcN//Ovuz9ggcDB+3tnNBfuf7L1Fz8JHnx49Mijx2rNYwPL6n3wnsybq2Kfmus5ZI5n9rQat1uSXd7uPlsr8+Z7xto3u//8njsQlANBuWliYIYwfbAxTSW+3TI0/diz5Tfe1XuSntr64KePip+7dEgyppHJFD541/rwva4f/dqlKuqcGeHjjlTrh/m8jWOXsdcXWOMYxzh2C+NROR83Cm++r29qjV/8pf6q3bIyjz8Y2+8wf8N2M0Nsyxrca1JBzz23FdZ/GL/i84LYcH/zi53/fV33zb9NfPYLnobGbecfOfKrX89/+F711VcMHfzq97QP1k/45r/uOEbQ5fH4Jk8prHx9SIGVe2W1HPL6pw+YddV9+eS+8/7HyhV20z99MORoJHTxYv2uhzIvLjdb1geOOt7bNHGsVr47sA2j7df/i8tu+PG35a1JO7WhFggcvD8QBL2zJ/fS6/r763reWe2SZb1Q9DbUDss86R3dmVvu03v6PDP3q73oSpd7eNJOCYfDBy3goAVYVmHd2uSyhzte/mVo6iSmToycvPDjtYz/h8FeX2CVTUu0xWkDJBFBL4BHsQEhrKwKAsyqVoDDmqLAnKYaoOuFxwFNaG4KGk6jWDBoAf4ogL+pCvA2TgK8jVMAX0MzkC5bQE+uAJiWjcOFRP1eIBKvAYxSgUrb3eB+tAoTYA8E0vV35Pn8OFqovnwByBQ1QLcGWCLBYJWT3TjMTT9L1NNBhQdS3YBVEiSKhEONFMo2kC+Bw2DlvQA5XcTk6YCJBCjC6colU1EyRauADzp6gA96MsCWbAnHzEn4wtelC0BXtgBMTkSBxOwaoNjViqPHEkopob4ycmkccVu/QqusAZJcBCxPAbC0AmBqXpzGTGGFr6d6K1utdWwGtO5OwCqVADkQACTVA1gN5cq+3dKZAlZ3pNpyZRyWqNavAFNjAWB6dQPQ0DwD0JI9OEZl/RSjx4tjqSUMDsTxFYMXZJuRT+PELwptlqG6cUg4YWrvjtUADbEEjoNarlTGMQATRl8lfSCQUdNMnH7DscRobBrGNVhjjuKb76Vvua/2osu9jf2Jcp233ej2R2oPW7S9RcrZlCQRPmBoc1zmtZWF9Wtrvv9VJeZ4nbtctf96ZeG1t1p/d238hEXRTx+5a4NMv/hc31OP1X3/a2rtVgyHmc4k/3BvzecuGklIc/jwY/ru/yPnbTXRLhRDB28VYyzJrvDkhuL7a3enXWBYxM873T775OTtD3TdeoO3sSl89Ineic1j+xajRc+9t6mJcPzrl+xUB6nWVsXOPJGduegnb72vtPo97+Tpjd+4oqL03QlcLv/0mf7pM23DSL/6UvntVW3PvKjWV4fPOsk7Y6SxgOMYFnt9gTWOcYxjdyBJo+kiHC+wxhR6W2fvjXcHZs+tECpGNlPcsK76tKU7WCr9zove+sYhl+TS5o2pJx8JnXXSQHXlwD9/bgJSt93vnTBpF4L5Sps2pJc/Fb9osVo39PlR/rV3ZJ/PN3k7Twa3hnfCJC2VNjM5OTxQjUnpLIltnnOpsplMj3acI4GkqvGLF1uFYvfPb+y87YbAhGbfoYcHZsze+ZJ7AKWWTYUN6+r+85/GquWwsPq97MpVE79+tRLdFf8vSVGiC45gwRHl7s6+ZY/2XX+HEvSHPnuqb98Z43dWu4a9vsDyKK4qn4xjSh73W4BQNLllCYh6ZWBCyAPMrAoDc5pqgeQ7rwDFlrWAkU5Bf2qdL+oCAqoL8NXFgND0WUBg2hwgOG0/IG0rwLruJNBX1HB4qKBbAeKlMhDXdCDi8wC+YBgnMs8e5JBkO/RVPxFiA6QLGpAqloB0QfBDBo5RuPBtF3GH2XQfFavxXmE43oMTy6hqVThSMNOygKJhAUUdoKRTeUfdBBDMiIjG000Th6rpt3eKxIDubB5oyxSATekSsDGtA7kygOoyge6iCaQ1A8fkaUIkADTE64FwTSOg9XbisFmChzPSvVSC9kQ3pcdHxR8rEMZh0QQzZ2oKTmdi/4MVw8Bh7IxCEfp9pUTrn5C+WbIKbEzlgFWdxY+6baBUBgj5DKA5oQFzUgVgdlUImBgLAbF4FHBv02cuHNtN8btUqOyufnf4QTb9lAps7ewvXjWKOZzGzIQ/CIjLj6AwcyUNx9VdfH5M8ZkZw9PduMj9Y0J2xUu5h56pPn1xYO5As33qoT/VHnhEcML07S2lpXp6336x4SvfHDxR7+ttv+n6+IVnBQ49cNilAvPnuryetuuua7j4S95Jk0c+yMK6tR233lB91UW+fYYZkvHGO+GFx490XZIUmjip8Pb7ocMGzNBdquryD7VCtfIl38ThH2gaqXR5fYuNrcZj7uZd9KFw+X21373SKmmp+x5LPfrnzBOqOn124sRFf+MImu67bomee+oY5g4VHnq6+ozFu1ZdDYa7urbugkswjMw7q7N/fCSll8OLFwUOGqq9G8dOsdcXWOMYxzh2C+NROX972Hb+2ZfS9z8ROujTg6urcndnfv26uiVn72DBLY/e6J3YrMYGxDe2YSTvuzNwwD7bq64EfPvNDBywT37lX0ZRYNl29ulHQ4cfNGx1BRRbO6KLRlGu2cGQvrmdwwamWKZp5rbyH7FK5XxbT6h6GHWR9tHGvt/e6Q4EJUVJdXdHP3NC4KhDd/kz6fJ64ks+g2UlH3hSf3PN5v96OXTA/MjC40byuHP3Udy4ziqXAwt2dMhGi3xrW+1wfQ+7CEUJHzA/vP+nks89nbrjfu3lVbErLvjb+FD8w2CvL7BiXnVWIggYtoVzl+9TFZxwuuqgD6iPhoFCZwvQ8+pyoLj5Q0Dr3AKYmgYofi+g+DyAGg4BvqZmIDBjfyA48wBA80eBNW09wIZUHkiVBL0EEPYoQNEY8DQSVFDY9AB+t4rj9O1yyfQbqUuV2QqaDqSLJZyIw/SgDEHh3i7C7AT5oedSgJ7pA3ShZ8rnANn2s3Ubo5DyCAZLiNVElJ+4YRPe4x5ZwonME4M0zIG8P/G9KhslHHlQwRBNbQB5zQbkfnWZOBA6YNl5HDOn7nwJqPJ7gapgDKiumwCU+rqoaLOyKcDWdRymSrh5CT8wt3D2UlTALJdwTNj7WatMH2DkMjiEYr9YSjBh/iDQlysALRkNWN9jf9DqAnJ5CfB6baAvJ2RqYjPF3wZQH9Zw6EO1P1XQBXgUGQh6PUC/L7zXT8WUv+gGJF1ENJo47Y0C/R2IYvDZNE70pLDgF+b4NaEwEPJ6cD7V4vf7jBnGo3L+xih9uD75h3sV1dt41bcH10lA5803xPY5RNCZw6LtqTvUgD9x/he2mnjdz7xNNZFLz9/pW8c+f1b71T8JdbSPMHu47+knJNUV+9wZw79s20appMZH0Z+oNk3SN26dtFMVt7OZwRPablimxiJKYigN03vzvaU33q1avCQwcx9A7+3uvvMP2eUr6/79a7v1iM3lip11EmedVHz3Q2PVu5t/+p/+CZMix5zgbZ666+scAbLPLoucefzY3rFILrlf6TuWK5ViC48PzTs4/fC9PT/6deSixe6Juxdc/UnCOOE/jnF8siG5JJc8wp/xR4S7Aytf6L3utt5f3eqdOrv+S18fUl2VNm9E12s+vd303LZn7s61rot99oLBOTnZV140i/nQBWeO5FLt8nl9DbWllo0jHHDxrdc9xx62vTXbWnlU1Xn/Oje3bfW/aeZWra/8p/dk8is/DJ523JClCq+s1t58P3HmZ0V1BaiJ6vrLv+6ypeT/3aR39YxqDMPCt++M0AWfqf+Pb1IT7rj1hu4bfpl5/RVxs7ctbNMsrl+rtW4pfPi+tUNr+2FhZDOFLS3+sVbxu2TZ2s6AdxNKJJJYshTV23PtTWYmtyfe4h8Sez2DFfd796uPAx5FAYI+D+DSNUAT1EjLRqDzTSFR6gL0ZDegpwThkQZcigJ4EnEcHsJdVQv4Jk7HUV/5GicDb7Z0ApvTBaA1W8aJ9hPEkm6JaD8J8CkKTl9hwKNSae6TJBwVDrYtGj2EGEtE2ok0QOFHJX6bNoAqu6gIcbQiFY8oYblUyONQcf30iUvG8ZQazGCJzkHBNnndABGfBNT4VaAm6AOsQg4oJ3ugv/lROLlHfCEg6nUDCa8GZP0WoLrAacfzKQOn42zZAgxbA/qKOrAlUwDCbhWoCqSBupAfqJs0CwhYBmAIFytZAdRAGOjN5YHNPWmgqBs4RE5jzQQgKOzy+5s0JUDp6wIkxY1j0S5SHbuLGtBXMoBUnlzWBQQyNlDwuYA+nw0kCzaQKpk4HuvhsoHDWrktkRvoAnTDxPGsigYjOPSbEH71m3UBFe7KMql0HVpZKmZg+UzlYA2m3IxgFEcA1xgfYLPGEOMM1t8Atlbu/uXNxpb20Oz94pd/Ta0exhwys+zh6oNPlORh2uNt09jy2B+0dHftRZcrkQFqJ/vmG6lnl9V854rtOaRvCznotwxjJHOWO9rL2Wxg/pztzuFyjZaA8U+eml/53OAp0TNPaF/5Rv7dzYF9J9q61fKDu8InHR04eKvnXH2331989a36S69y12yV8Ci53Q1f+aeeP93Z/ZPrE1+9xDNpt3woBJRELHHJufYXzi6sejf7wJN9jz3gr2+wg2Hf9Jmyz59//x0Fu7BurV4oKD6vJx7VUhmzWFIDAd+cebFjTxrhE7T0iqfC8+eO/KiNEC5Vtcplkeg69pCk+qVfyTz3VO9PfhP/5tJtKcZxbIu/rwJr3bp1a9eunTdvXm3tLkaljmMc4xgdRpNFyIizCP8BvstjtQnpx5cXV6x0+QI1F162Xfsl285taWk6cZjmwVzL2ran7pQDgforvyVKcAEjm+l54J7QSUcp1aN4SGemMuqUEbmZl7s6/Y11OyihJNllm+aoTG9dXp+xdeKT5Hb7D53X/n8Px887LHX/K+VcqeqEIwbPoK3fXHz1rfipnxlSXTnLS1WLl/Q8fF/Pz34fPOnIyMljYyIqyXJg/tzA/LlmLp956i/G+i25lc95EzE9nWF6c/SSxZ7pzRWnKFvX08ueL69+b9N/vRg79qTIIYft+JGlbZrZ1a8nvnjeDuYZOaxiyehJyrFw6S+vuVRVGBrvOYSPOj773tt9199W871hTPn/bjHC7/KYn7X+XgosTdPOPffchx56yOv1lkql733vez/84Q9HsmDA667xuwE9mwaKbWtxrKFEopyw9tazScAqClcqQaLaODSPGokBovAXhIe7uhHwNU0DAk2TgfZkFugtaECmbAAlwwZ08ci7Pz+u8ieKkDSpCo5GR7FMQEulqDhjSS7xfXAL8kPsCsPE0S3lymZlul+VB96oP9GviJPrZ5UFZWLh9CQKfZKgQwTrI4YqLpE+N0A0ANAUduFYQE2qigKp914HtK4t0C9oEgblgUkzgVm1cRwuLe4t4PQMGrZNJYpRAscerGQKp3gd0E2h1tKAiKcA1AXyQGM6j8OfBb1uwNZtIN3eDXTmikBnrlTZ+W6XC2hM5YB96xJAdL9DcOyptM7NVBztqxoAJRQFSvkBVZmqoHotIG+7AE/AAqrCNlAbkoD6oArUBLxA3O/Foc3E4RACNc0wcDr7hPArFqsCbDGX8O53DTQ8mloBxzFLdBQKMVn/nCLw0e3FYbxEa6QgEYUBWMg/xgrcMWewdvm7/PeDsdqE0vtrs396HM2IHLsodMCO8oaNdEpW1MGVrlkq9L3918ya15Ds2CmnB+duFetrG0b3zb+NLzomcMooSgqrqOXbOqsuHJEO2izkd9LgJsuyWzUL+ZGrwl1+/7bPsKLnnpZ2uXrufCF83ulVc2cPLtcKb76X/MO91ecs8c/ckZNC1Wln+6bOSD3+oLG+JX7p+ZJ7zEwy5WAg9pmTKv+Gh5tHUtXoqcdy6rHFt9aUn31x84qnIguPjyw4Yrh5AfqeeMjfVOfbf9e9IYzuvtRjz8jJTPaD9S5FkSRJkl22aTV+9V+G2LXvCTRc+tWuG65N/emx6Dmn7On32n2M8Lu8h85au1tgvfLKK21tbYsWLVJ3z/j1Bz/4wfLly1988cVDDjnklltuWbp06fz58884YzviynGMYxxjhbG2afgYv8t/V6cjvaun73d/VBsn1l+6dKcqbJfb7a2r/+DGH4RqG4xS0TL0Yjrpr2vw7H9A7KjjXNtsTtetv8PtCpy8cFRDKqx+11dV7fKM6CmzbZmipt8BFL/fSKdGXmBJimoNap2pIHLOosg5Q41Vbd3I/elxz4QpO66uBAL7zPFOam77zbVdP/hF/KovbGvZ9TeAb+4s39xZ1n2P5VY+X1j1SmzRZ7yThhp1ljvacm++nrji87uwfksr5194Nff4Cmxkf8C9z5xJpy2RQ6GxGPsoIClK8JiTko/cx95QYI3wu7yHzlq7W2C1tLQsXrw4Ho+fd955F1544cEHH7wLKzFN8+abb7788ssXLFgAXHzxxbfccstNN900ks2zDF20nmk9HUCpfROVbMHOLYCeFAZLA91bLsEnBUI4TWpqJE5FrBOtQic+bAAAIABJREFUAdxVdYCnphEwFS+QL6cAy7IBt0vC8cpSXDbgVSQg5lWAuM8NVAV8QF0kCLiKOaDQ24nj8S2YCUl1q6Eojt5ImCrpgyLnsrqBQ4mFDKUyACQLsE0dEIqKfu6q38NdBVxeH453eSlr4vBJgggT4Yz1EQmYGfcCs+sSQPrDt4DcB6sqO1DQJ2qsGidJMNA8C1gwdTLQky0AmZIGlA1B6piV8QvCrz2n4WQd9hQsoGQAeGQT6C0KqZPg7XQcjZcQq6W1MtCWLQGbM2Wgp2ji0EUt2TKOTGp+UzVQs+9BQD4cw9GoCT960ZQnF7JAlU8BJsRNl0u4pllAVQhgVrUMfKouAOxbGwcmxMOA0s93igNk47R5ZksajmeV2HzBbFXFqgBpsGv/oPty08rh0JD9bJY1KLnSGhC9Oa+ald+WMUxAyu5gbBms3fku7z4+9tNRBaUP1yd/98f4SacH5x2087nB5Q/UXnql1tZqFnJmLueuq/fU1G2vLOu+93azkK3658tHK4HKPbAsesLpI5xZDgT08k4U056quNbe5mkYqR+VJEn2oOyKHaPvutt89RNi5ywZPFHv6ix1tkuyS/b5hxicyoHQhG99N/vqyq4f/9ozZ2bVCNoq9wRiZ59in3li6u6H++6/y7Zxz9gnvvA4ORC0TTP1wvL088/GLzjTO3N0DulmOpu6+5H86ncT+82Jnnh6aM4Bw342rHK58/abXFoh39lZffrZoXkH7SFflcDMfZIP/an0wfrRbsjfGCP8Lu+5s9buFlhnn332xo0b77zzzjvvvPPXv/71rFmzLrzwwgsuuGDChAkjX8mmTZva29uPPfbYypRjjz322muv3c2xjWMc49g5RhP2vNPz9cf7Xf77OR1ln/yLkqgZYXVVwUjiAnv+fFdp8/rqf7pstBJpvaNbzxdH7lru8ngsbSfVvB0J6n2j6OCzbXuEF/zs8pdK6zZVfWMg8jn/3tvFlS/kW7f4ogmXopTSfbhcnslTE6ed5RokPAoddKjk9aWWPZS788HAOafs+HFh8c33JY/bO2PyWHmpC0iyHPvcmbZlpf78BC3tm/7fD23LkiQpOLExdPJC/yHzdr4KB9qGzeXlL6deezMweUrj5V/z1DfsYObSpg3lji1VV35B/Whj7q/Ppp5+vP7yrymRoc7+YwI1ELDyhT2x5jHECL/Le+6sNQYarIkTJ1599dVXX331W2+9dccdd1x//fXf+973jj766AsvvPDss88OBHZ+Fujo6AAGy8rq6up6e3sNw1AGpSmtWLFixYoVgxfcuHFjfW2t0KwIs8T+e329TMVHW6hYXBIgBE9qNA64q+oBT3UDoCbqcIL2RLuZGhqgPZK5AfZLdAUKjkpxGTjW5yKGr8rvBiZEg8CkRASw0z1ArnUDjibMyKWg32ze5Qta1Q04Sil3pBqHZyroJpDRTJyLWthj4Hhi4RZte+Je0K5soOhJFF2ELl8Apymy1JcEBN3vUcSGAEyKyDgG934tC/SueQPIvvcGUGpvw1EyqbEoTupfubcdKLauB9RYDVAbCFExcIpHAF1SgM29acC0U0BP0QDKBkCmOOCb5ZIsIOQ2gJjHBAJuC3AP1qPYNo7oLVW0gUIZIFMyAMsuAG65F5jXWA1UT9kH0JLdVLopZQUIed3A1Khf7NVstQUE3S5gctQH7FcXB+q8ClBo+QjIbBi4fiiRBOCrmwCE/BEqDJYIcLTKOA2boq+wNprA4ZwcV/ciQKk/0xeHy+w3LZNcgCQOpequHERhYe8ORQELCdA0zTOyBz07hySN4uqyswJrhN/lPYeP93Q08E9fOnDQ4bu7MVvDNoyu236vp3urvnbJqITtAtkHn4oedKg04o+NEor0JyLsYJ7JE8y31u94nsGwy2XXCD4GVr6Ye/jp+Glnyc7x6nv68dzLL0b3O7TxpKUupV+kn29dl33/5Zaf/sg9sbn+80srH87gnP39M2Z1/uH67L/9rO4HX9/eJpc7unp//0dvItzdlfQfOi9x4Tkj35CRQHK5YuecAsTANk2rqMmjia/OrVxVWr6y1NoeP+bESVefNRJxlZHq809o9Exr9kxr5qSFuWXPt//m58HDFsYOHxvt/wBsu9jTE50xGUin02N5OhpTjPC7vOfOWmNZtk+dOvWggw469NBDgeeff/7yyy+vr6+//vrrd7pgKpUCQoOeJYdCIdu2k8nkGA5vHOMYx+5jxYoV0ta45pprKq/+/XyXP97TkWkYpXUfjn7U20Vxw7qW//1Ps5yv+bevqQ270uKkrd3gm719z4VtIKnunRo6KFXx4pbNI1+nVSrKI/AZyf/1NXdVTWj//raA5IqnMy/9penkL9QuWFSproBA49S64z7XeOIF9HT33nFTf+IZAC6Pp/6yr6qRWPb2B9nOQ0mzN+Wtiky57kvV5x8lJzPDzjNWkGR55NVV/pXVqf/9ferOB9WG5knf/c/w4QtHKF030ik7NPAuwROP9B29IPXssuLGdbsy6O0ju/p1dywyhiE/FTT5o4dWTRrhT5M/Oianoz131hqDe8pcLvfII4/ce++9jz/+uGEYxx577O9///szzzxTkqTf/e53X/nKV2bPnr1w4cIdrCGRSADZbLYyJZ1OS5IUjW7FbS5cuHDIeq655prO3r6y6gN8tU2AWcwBZiGL06nX37YquXBayYSyylPfDHjrJwLeRC1OUJ2mG0DesgAzV8TxOhI2VBHhaAVAQJVxOgd9qgxUB7zAxHgYINMH5DeuAYqbBlzjhfOWaLVTInFhjCTIM0+iDjAsC8jpJpDShOUSQMRj4hAkIr1LSHbE734ZrMr/Z++84+yo6/X/njOnzOl9Wza7m2x6IwkltFBC7wJSVFAUBdu1XfVe9ect6rWLiqKIiMAFBUQpilSR3kmAhIT0sr2c3s+cmfn98d05u9lsds8m4Upkn1de+9qdfOc7M6fN5zzf5/M8mO2QVpcPsLk8QKEySDWi0QrgdUhAs9cBzAgHgNxbLwG5rW8C6Y2bgMyuHEPOTSj+OFCOJTD9sUo9uzCFa0OJgS5v9VqUxlagLdoMJApCQVUErPJoiavgsYSgTVCDDV43JlmYK6mABQnIqzqQLgs/egMzV3EgrwG70gUg5EwBzvow4I02ApqIAsQAIh4XINZI2oJe4cPeGPAC2mA3kFn7FNC5bT1Q6u/GVEHZfAFMXzSBwLwwJt0o7MoKFQ0oqBqmgExERjqEt7t1xFKFeCa0CibnKlRQovFbdnowdYGOSAMg+0JATyqHyZb9A78vnnDCCaOYm5Go8b389uEf+3FEvEv8HrryktjPbjZ0fX/j7Qwjs/b11KMPSJLhu+A0zzGH7ds0hbe2WCyy0jYJxYzF4TAqYwjSR8K5YPZgoYCmUZvTR7m3WyQ0jANDVTMPPlF/xdVDuwz0ZZ59YvqZV7ibx46U9rbO80z/cteDt3Rd96OGK64eFoRZLPUfvKrr2u+Vrrs1+ukP7bmjvak+kcwCFsW2tyJsCLqe/vtzhq6rnb3K3JnOBbPlwF7d9vcH2ZdeKz78VCmWDJ11fuQDV0924VIf6LXM2s1mPXD2ScqstoHrbw6d+17PogPja6rlMomH7g9/+oPiT7/ffwA/jroHMsX13ROPAyA+kLnwQHwcvX2fWvtbYP3lL3+56KKLKpXKqlWrfvazn51//vmh0LA98Ze//OUbbrhh3bp143+iNTQ0YNJ0Ar29vdFodD9bgaYwhSlMCMMY+pJQ4+Dx8Y99L79zPo7srdNsoUDm0Qd8p50z6csAQ9eza1/TejpTr75k93utC9tDl5xjcdTkXzUm1M5eR23xOLthIsGU5LDbPG41mbCFIzWdRjwmOSZ4GLPPvWqx2RyNQ3K0/KsvuptneabPGe80LHLzWR/pfvyu1P13Rz/6aclc1pFstvB7Lu6/81ZDVaU9nj7Z7zWg48u3ZHb2KYvn7m3y+O33qOs2SxbZOaNdylV4+a3u2+/zzp7pOv9U+4GwNh2CYeT+9mziTw8FVq5quOrUkWvxermUfOZJSz6X27je09xSyKQjF31gTGWVFo8pjaM9OJR57c6jlg/ec6drzryRPmr7jPgf77D4PY721v2f6u1Gje/lt+9Ta38LrGAwKD7IRA24Jx577LFodIKO2ZaWlhkzZjz22GNnnHFGda/jjjuulhPoyxTWdQ8AM8J+IDRrEaYFlNUbAvRiFpBsDsAerMMkV5T6ZqArngJivUnMiD3hyS4cj0T8n8ies1ksmHmC4tVvly2YDJYwqQq5nIBikYDMQDdQ6t4JFDu2AoXuXYCazmBG+zmi2SHD7nwGcEoSpspKeKCnirp5tCF9knC0sth9VGU64qdwbxdu74JP8vgxGSDhqiXa38QFCuFR2GkH/IoN6O3rAIo9nZjcVX+vDFR0CfCmdUArxwG9rAKVbAaw+QNUWzI9AaASScFQzKE/GAX8igOT8FOsFcBpH269bPDIwMyAC5jfEAJCNgkopxNASHECzTObAJ8yCCjWJLDFVgJSRdEXKVFVaBVVIJYrAE67D7ApLkyiSJEtQLPfBVQK+eJAN5B4429AdsNqIL1hLZDeOggUUgZgdwL4Zwaqz7ujoRXTfF88HfFCGcipGuC2aZiMpmBDxetBuLqb6sAiVS+0ochIO6ZgTii9HNFpgOEOAJv7YkBXKg9kyipMytxxAhimxK3GweNjf97L+49/+MfRSIQ+95G+r19TSKfrL/rAxKMBqCQTmddfzb/2SiWbsbpdjkPmRz5/paOt1h698Wbe1S0HJifbMlS1FvpNqYsUtm6uscAq9/c5Zk1wYy69stY5b2gpUy8Uki+90P7+L9YyedOqi3f84Sc9N/ys6ZOfr250ts9xN7ek7n8scOEeGUQWS/BDFxm63tDWbA2NUa8Ymhb/2c1aXzx03sXOmcPstV/Tsq+82P/DXzlamyOf+fABsN0yjJ6v/UDx+Kd//isjKye9WOy54WdaNmNzef0LjnAedqrF5tB3rO/5xY/lcKTpqn8ZOYdeKuUG+kOLxqgUg5ecLRcKg3f+b93lH93PM82uX1vo7mj4Vk3PyD8cNb6X375Prf0tsI455phjjjlmnAFtbW0TTiJJ0lVXXfWtb33r/PPPP/LII3/7298+++yzjz322H6e2xSmMIUJYRiGXjOFNWGP/T/2vfyO+jiyuJy+S89O3/GX7MvPeQ4/epyRWi6bePJv0kBPevt294wW25I54VOPswYP5CKUBEy0Njf6rAoFuRbpT9hfScZrnFPOpY2WCQosPZ50rTxN/F7q7VZ8AbsvNP4uVTSd8oGtd/4YXR+5uGadMbvSM7YS37V0wd6mMiqVvv/4scVmr7/6s6PCZyRZ9q442rX4kME7b+359++Grn6/Mne/kqHzb2ygpEY+/XFphKRajQ3G77jFokutl/7ryPxv36wlpfjAtjuvUeOxkUnbxR1bnXXRvVV7rvNO7f/GT0s93eP3IY4PQ9ezTzziPvFIi+vt9Ys/UBj/vXzDDTc8/vjjt9xyi8PheJs+td4pTu5f/vKXd+zYcfzxx8uybLFYrrvuulWrVtWyY1+u/HpfCtMMaU4kALTOXwYU66Zhdm+JBjebPwzsHEwC2zftArozBUwTJstQs54ViLocQMSlAF7FhmlSJThzwR2IW43oFxMcgC62Cb+i0nDGXDkVB0qDcaCczAMWmwgKtAnRmGgl04dIEeELpQPpkoEp6MmqOqbQRxahdUPRdQogO52YbJZwfhKyoXShiOkILzgecTMdyiK0WgCtmAe0Qg7Q8gWgLHrdKhagIpIQyxKgFnRAzRUBOZvDpOKGfMtlKyAX8wyH8Q0LkqyC/hEuXA4JCDktwJygE1jSFAHc2UEgtul1oBzrxZQuORpbgUVzlwFRTyNQ1xMDOtJFTKd4r31YBSKUatlSCQi4nYCEAVSKBWDIOK2vM7/tTSC97mUg9up6YMcGCdhZkQEVA2iQLMA8OQV42lMwxGMJvrM/VwR6cmWgWNGBoGIAkYpWfZ0Ik/2hh1doBMVDVCkDIntOsjsA2e0H7KE6QInUA291DwIbB9PAzlQRSJQ0wIcx8fpNbdANQ5vIT3Lk4AnH7PN7+Z2DA3UJ7sMPccxsGfjeL1MvPtdwxdWyZzdPSDU+mHz2yfLmjWo+657ZKq9Y1PzZDx5AF/KR0J0OkpPTcauxAat7Yl22pbFO29BR45z5rs7wRaeON0LXi/Gko2nIViP9yov6ZF7n9kDU7vLktmwc6UbhaG7Jr36+9kkADGPwBze4m6YHL7psb1yx7HLXf/gTqWefil//O8+px/r2I6Unc9cDoXMuHFld5Tau7/vdzdOOvyCw6Mg9xztC0dDCFYmH/lz3/iuqG7MvPus4dNHeDmEN+j0nHt178/WtX/nGPp9n72036Vo5cs4p+zzD/z3GeS+/9NJLd95554033uhwON6mT613SoFlsViuv/7673//+1u3bl2wYME7s+dzClP454NhMBkGa+Ix/wTv5QN4CdZwsO5r/5K8/d7OH3/HM2OmEQhLNpsx0FdJxguxmLO12XXGSveRy/dHX1UL7I112q43J7VLJZWUQhOzaNZwUFW31DKhVsirxYKtcbwlWgMMTbPYhx4NSZZ36w6pARbZatldcS/J8iTSNgGI33inkS0EPnjphCvx/mOOs4ZC/XfdZvG4PSv3xdgWqGTzyvTdiL3ya68EFx01ZnUl4KifXtrUNTxDJp3bvqXh/Xssg46A98wTck+9WOzYOepYNUIvFNSuncF/kH3rPmOc9/KNN9544403Tjhsf/BOKbAEfD7fsmWTMGEDUiVje0rYDecwbSfKmgaE3B5AVnyYVuPd27uB7ckssCNVAgbyOmZAnssuAQ1uHVNxJZQ0on9QtojmNQ1IFctAuqQCJU0HFFnG5LSCrggwZNEuOsjk4cfZ0AzAsBgARjU30AYUyyqQE22MZQMoqgCyxQDKmgGo2gjDJKsdsNidmPIdwWaJZknxM10oA+my0G8BlCsGUNEMTBMvsw/RAYh+YIcHwJvTAWG85XHrgOK3AHa/C7B5he7KB1g94nc/pjn+kEW+xwdkBruBojbcEWn2MNqAuRE/EKjkgdirTwLptS9iunCJr6/OxmlAsWs7EFx6DLBqdjuwsS8GDOSKmCSiEMOJ34c6ECUJcCsOTOZPeOVXsimRWZnbsRPo3gywXtOAbiMPyFgABTemgb5YKbCH64GOWArYlsgDO1Nq9dm3WiRMpsdulYFKJosZ5qjlMpjsptjDYrdWnz7hwWYPRoG+VBboTueAznQR6EhXMGVnY2ai7RuMyTBYtdtw78N7+Z2GA3UJst8b/uTlpe0d5Z2d6tZdkmST2htcM48IL5yzvz2GJgy10vufP3LURTSrNXTZBXJgdHyK+4ilXXc9ECqVaszJASqdO6X2hgmHWUPBXCpVy4S5dW+4mxrG7zeULBYkydA0URIpbTMKXV3jjB+FSiGbTwzWt+22YFfq7pK9kzAUyL7wamHdxsarPztSF59++Xk1Fsuvf0OZOcuz9FDniEO45y+a9onP9930C71Q8u2eVF0jrE6HGh+UvUNvazUeS218a86Hvz7ePrpujDDRSL3wrKM+Or5/h2S1ek4/PvXAPcrHP7cPJzl4zx2epQucC2ZPPPSdhxrfywf8U+tA+mBNYQpTOOhgGIZe87/aC6wpjIJjxnTvCUeFrrwkeNkFgfNOdS2ed6CqKwwjd9uf7H6nMi8q6/n4Nb9Su/tGDbG4nK6Wabl1r9U+qxYfdMyc2AFfcio1viq0gT5p+sSdjHavt5IYEnU5Z84uJge1Yq6W+YHuh29T6hpG8VV6b6elhuMOwTBKjz7nO+4ke2SIaSvu2hn/3W/Tf3vEmszbvXW2nDrwu1sGbvqlOjgwfM519cGzL0z9+VG1bxK+9sO7t0wrbRtmAfVi3uH2yI7xdE5qNmnxB4d32bFZOXZiCw/30YeVErFyf++EI0ehPDhQ2LbFefrxk93xXY53FoO1bxDrG0KII5RYoolMsE2CS0jkS0BnpgBsT5WArrQGZIZETmA266k61b2Ey5GYR5AigrvqzRaBvryKactks0hAf76EuYyyvG0OUIr1YMqJKtk0Vccj2QLYAgGrLwRYvcHq5MLDvaQZmH5J1iHHcwB5BGUtPkcEnS4Lqky4t7t9mPbf2VgO00FKaLBKFYBCBczuQuwOwCakPw1NgK81AdiUbPVY9oACKHVhQKmrB2yhKCZrJQ+pvkKYNmPu6bOAjngSU+iWKFaqD6/XLgH1bjswIxoAMqufBDLrXgJiL74ODOwcfgRC9X1AKDaAKWPyL1sJLJ23DOhOZDDdtgTDJwinVKEEZEsqoOSKgN/lAALRRqAc7xfKPPFciGdNMDnCpcwpyUBIkgDvNDfgbJkD+NoXAI++vgV4c7AE9GUMwGkDCCuCqJMAxW4D8rkMVW82oW4T3ldCd+XyVF8AQ1kCHh+Q7IlVnyDx2q69129S0Cczc61M1xT+D5G4+Q8M9LV954OS3Qokn1jX+c2fRq76gGvZwpHD3OedEr/h995lh9firqQODhYTiciC8cwRhqDrxlj5zXuitHWT68KJ5TtKQzT31rrAsScCtkDQO3te37MPNJ108YQ79jx1byWfbPjEbvSMXiym1r7e8I0v1HKGQPLeh9EIHnuC+DO/eWPf7TdFlh4/60MfrNZtDYaeXPtsx89+6F9xVPjM94iNnkVLSlveSt54R/Rrn67xWFW4zzm577u/8B1/srg7yG5vOT9BTZnf8aZy1NHmSb5ViMcaTzhqwgNZXIprxbL+225q/sJXJxw8DMMY+N1vlbkzbfX/gAjtgxpTDNYUpvCuhmEYes2YYrDegbCks77Tl4rqCgicsChy1uHFB/9u7L7yq8yfhVVOvfRcLXPm1r/hnjuzllLMKJWsrho8ynW9EI852tsmHKiF/IW1w0yb66iVmW1rM9vXj7dLMbfrvuszm9cE3nOxkElUEbv3TntduPaWzMJzr9rmLhDftg1Nyz72QGT5iXVHnzmSFZMkS3DJypazP5x/bXWpZ3gFM3jme9SBuNofq/FYVdinNzrCwczLL4g/rV6fVXHke3bsbXwp0Z/t664K+UtrXnYdvqRGQtR7+vFGpZzftKH208s8+4QkE/zIJbXvMgWBg57BCjktMwM2IOq0Y1qBCxcrQfmUKzpQ1EQbnYapuBJMkPhQclglIKhYgLAiYzq2i3nEyHy5AvTlSsDWZAnYntCA+IhvGlFvBbMnUdhNLVxwOKAXC5jclS04TM86og3ClMsRrgeS6RImzyROXnjyue0S4HfIgNtuBfSKCkOsi2hDM3sJh/MHrYoTKFUymA5YQk0lfoqjpEoq0J/KAd5pM4DSjHnVmZ1NccwsP6svIE4YsIcbAWsgQpXBcnsBmzcIKNEGoDddADYNJIEdqQKm3E0oycRD7VfsgF1TgXj3diC3YzvQsxVga94CCHldQ04C2o1dmNb84hrFtTe2z8cUPAnyUnCBmfywpk2QkW6bFZgecAPzFx5aySSBYm8n0Nj5CpDdbAX8kgfwIwGzWlXAv+QwwLfkKOCVHT3Ai905YGOvEHsBRH1UH2qh27NKAPqItkrxYhLKPCFfs4XqMZMx7aEokM4LKk7D9FoLK1bMpsGiywCYhC5lAhiGMQkfrKkC650H3SKV+3frEGz48Ckd/++2xC1/DH34opHbo//6sb5vX6e0tA3bnY8FQ9eTTz4W/fyVtRy9uG3XKBeDMZHdsM5is9aihQqce0rvf15jVCqiq05pneE7/qTOh/43vPS4uiNPH6U6V3Pp7r//sdC1xX/oEaEPXCb44Cpyb72Z37KprmZKqfDmJjQjdOJQn2PfLTdYra66I08fc7C3dZ5+wgU9v/ll8+f+TfSHWux2z6JDMvc8FLp6DOez7ItrCk++qPYNuJsbi6Vy+COXWOuGTRYCV71v4Pu/cs9fKPv8WCzuI47pfeLume8b226q78k/+ZceKg6a37Qh8eba5p/8Z43XKAd8waveN/iL25o++QVrIDj+YKNS6b/rtuL2LQ3//XmL8+DrVvmHY4rBmsIU3tXQDTTdqPFf7Z7vU/g/gzxvVv75TYY2gq+SCF1+Qn7NWr1YGjnS1hB1H7ks/qffG+OGDGaeedzq8zhmttRydKlv0FI/sbVSJZl0NNbVMqE1EnQ2N2ZfX13dEjj2hOgll2W2vb7pN//Z8/Ct3U/8qefp+3sevnXb7d/b8r/fke0EzzovcOZ5o6orNR5LPnCP98wTbPU1maAC5a07XbPmVHm7cm+Pf/F4onX/rKVWxZnbOMyuOWbPJZbcc2R+9drk7fcqbYHmL77Hdfwcm0ce/MEvB75znZYZ+oJub250LZwT++PvxJ/eQ48opxPJt14eY6qeHcV4r/+kIauw8ltveg4/ZFQXamlHZ2UgXomNHaWnzJnpmDOj6xfX5NavHXOAXirmNm2I3f+Hjh9+U6rkA5edLwcOYF/NuwgHPYM1I+A6vrUO8Ch2wG23YfIHItRPtNFpIyymBImiWIVCC8BrtwCNbjswzecCoh4nJoMlTJVE3pzQeHVndGDnIEBPQgJUTQICbh3Il8uALMUAkXbXvuxYTJqn3N+FaSxu9YddLbMBzeEG0sUsYGAAHruE2ZIWVCRgmscORDxOQM0Nhy0Kssv0xHICFrvC7q2LQsUljKJUjeqFC7et/kweqG9uByqZVPVUtXwW04lK2Ivbww2YRk2i5c3qdAO6ZAGyhRLQNZgGdiWzwJZ4HujMVIBEQa9ekeDnnKLJLp/BFKip6TyQKVqAtFQByoYOOAw7kI1LgH9gADMo0FHXBZQCEcAbjALxfBFIF1VgZzoPdGTU6tEFGj0ZoCuVP+noUwFDUzEtu2yedUBrvwoofhkILp0HBA4/EdAbZwLPvLoVWNutAzuSRtF1AAAgAElEQVQGhi/H5xw2LVOsMqCVS5ge7pJ4GD0BTKmcyBVw1DUBSrQJKBkWIJsvYL6G6z1OTKpPvIbFsV548wD5uIPBZBisib3c39WoJFK5V98ACcOwOBy2xqg1FJhsotxk4TtlZXz1uu5f/nXap8+ubnTPa7Z73dmnX/KdsluJEHzfuQP/8/OeX/208erPjjReqiL7xprEM080/Nfn9/yvMWAYmdXrGj/yqQkHqts3y7PbapoT3Oeflvj1Hd5lh1UfOve8he55C8sD/dl1r6nxmGRR5WgweNxKe0PTmH2RajzW9Ytr3Icu8p1+Qo0HBcpr1nuOHnI/Ku7cISH5Zi4cf5fg4mMzr77kO3SF+FNpndl/1+2jfFFzq9clb/3jjO9c7pzRAHgOmRE+fbleLHf//IH+/7om8OFLnIvmAIErL+7+0rcTjz8aXHWK7PE2fuKzvb/6mYEUnDesXq8Uc7v+/OvI+ZcIw3c1Nph87dXG7/zbyMMN/uiGUke33eMsxNINX/2UffoY5W/4k5cXN2xJ//7Pib/eK7vccihi93izWzcpXm++v69SLDoCPufyRYHLzx+l5BsFQ9e12hR4704c9AXWFKYwhf2B0GDVPvhtPZmDHZX1W0u7+kAyMND1UiKBhHvJfMcxhypzJhG0PFm4Lzpz4Cc3WSU5+rFTLKYYy2Kzyl7P6KGSFPn3T8R/enPvDT+NXHrFSCtwQ9OyLz03+Mhf/O89q0bGIvvcq0gWey0ph4WcfcbyGi9Hmddu9XsG//KnyLnvHbndHq2rrt+Ng9yGdYkH7nGvWBr8wHtqPKJAJZVRmod4Oy2XcUUmptwc4cbstmGyTXa5tXJ59Pnc+1D47MNFdVWFRbE3f/H8gT8+1//LW6OfvkKZP0uyWgMfvCB9232+w4+UvV57pC5wyhndD/wBtRhYdLQkWUqJgZ6HbrZH690Ll4hJ8m+86l4wZ+TCa/6FNUYiMfsXn7AG3N0/vr/07Cv2S88d88yV+bOU//xMccvO3CuvG5pe8dtlrdF+xCFOr8fR1jzOt4Lixq2F1zfoW3eVBuKVYvE2a03E5LsTB32BVWejxcgAeqYCQ+IhYenk8niBYCQMOO1WTD4poNgwfbdFjF3Q6QAavG6g3u8BjHKxegjd6gZKmgYoiRymjEkob1IZCyAXJKCnIAFWWQO8ShnwOWKAdXoUmL18JVAY6MEkn6wuj+giFObyItjOZZWBRo+B2TNY57ID7SEv0Bz0AeXu7dWTHPLEEqyVYLBsDjCD86wWTP1WwKljumopVjCbJZPFEpAoqoC/fSFgC0aqJym6hYf4Ko8fSOYKQKxUBkq5FKbxWKFcARLFMtCTKQL9eUH+CR8vMB3kxXXJFgtgDHlxyYCs2AGPIwcEC1ZMO/WABKC4hXHUsDmNrlUAvVIGbCLJsaIBg4USsDlRBt7q04HOmHjKJMDnrABvDcTFsAuOOp1qWmUoikmPCWWJZ94yILj8OOCJnb3AG31loGNQAjIZC+ByGYBVFjIvC+Cy2TClckPclS+ESTTaQ/WAs2E6UMACdKYLQFHVzOcNt8MG1Ps8gNdpByy6BlQKOeBFDhjEEmHtg6cwDlxLDw+ZazcCamwg+cRjsZ/f4jntOP9ZJ01qNqNSyT2/Ri8Wy1t2WENBrVJxLV2gzJ+1p5zZMbO16Xtfyd1x/8YP/Th06jLJrRS39pTSudCS+XtOK1mt4c9/JHbD73t/fa0hyd4jjtYKea2ns9jd5Z3XXv/VT9unTWx/BeiFYvruv9ZdekUtg3M9Pb5ZbbWMFPBd9p7Bn/zW3tjsO3yvZpt7QstlYnf/vtC1y3vqcb4zJ2etrhdLaj5frTjVZLyWbxN6RR1VUUmSNDKrp7SrqxxPRS8Ze6kxeuHRrvnNu751W/CKi11LF7iXLTJ2dPf8+trmL3wN8B1xtDJjVuav9/a/8LDLH8wM9kXPudBzqGlnWqkknnmy7t8/UZ2tsGHz4K13z7rmo9aAG4hesWrzx69znnb8XjX+sqzMnanMrbX01zO5wZ/drPbHnO2z3StOCNY12MKRK6644pvf2Hd3+H9uHPQF1hSmMIX9wYHNIpzCKNjC0eiF78tvXDpw9+3WSMi9oiYbw+KWHZk7/lzqG3T4fEpLm0X2SBVF6usp/unRwZ5bfUcud59z0qi7psWpeD98sXrH/WrZUVy90dbeEvmXky2uvYQJWizhj39AL5ZiN//BsBfVrdvl9pbgmce4luw1m28UDE1LXnerq22Wc8bEMXxqIi477GPQaXuHY2Zr4APvSd75Z71cChwzkf2SYeS3bi6tfyP1+mpHU33Df3xOrsGDfhT0bM7u9VRF9LZQpKKNp1QTKMV77A3Da3B6sSjb7SPpn/LOzsDiGcILZky4F7REL1nZ/5s7lO9/1eJU3GedkH76xdz6te4FiwF7tC78oaucm9+yen1+u90WGtaT5bdtkmzWkdWwns76ZzcrLUNmCragxxkJ6KkMByjXMnnTHZS06V/4mqWWkMop/BMUWLmt6wYe/xMmTyA7PYDNH8Lsz6pEm4BwtAlwO+xAQ6mM2ZPlURyATSsDhf4uILm9D9ALWUxWw1HfDMxpbgcGc0VgW6oMdHo0IJ4xgJwhwdDbSoicUgUD2JUuA4H+JFCqVICw2wPYFBkoV7RMfxxIFkqYVuBhlx2oczsAr8MK1HtcwPSwH9CSg0A5OYjJMA0lAA5dvhuQ7HZANGl77HZMDqxQEfmGOmCXJcBtkzH93EX/ndXrBtxNMzDvpvmyCgzmi0Ay2QfkysLRSqd60hKYojfBww15xItWTRnAaRNHFL8Lc3wJ08Ve+M4rjXVAQ9s2QOmtAIbwkQ8ZgH9GAHA2twL2SAOmpEl4gJWGHPBVYCCvArsSOvBWlwRYdgD40wOAZlWAR6b7s6UcIEvbgAuPOKk6VbFrGyDZ7IC7fRGQNKzAtmQeGMwCFFUJkGQAt2IAARdAxGkFPIoNhly8rO5hm3vRLlqQFWBtfwLoyRQwzc+EDX2j14XJXSnlHJDZvhYo9XUAanIQwDAmDPGoEYYxCR+sqfpq3+CaOz+w6rTk7+93H7ZkfCvz4ubtsetutTldruUr6t5/xKj4QiCQiOdfeb7nq993zpsV+tilo2J3Q5eeC/jOP40aYFEc0Y9fBjC5lTT0Ymnwe79E1Rs//YmJR0PuzTcc0fDE43aHe8VSJLL3PJJ94WnX8hW+ZYdVu96MSqWSTBS7OspdnYW31mmFvNWp2Ge3NXzjC/sckl0ZjEsjdKvOtpn9fd2GXpEse71LGro2+MrjkfcMt2qW+3qsuz8j6pr1ytwJVPaR81aU3upK/Or28OeulOz20McvG7zuVtesuZIZGeSaPW/PvbIvPT+qXi9t77T5dzu6AWosYW8br2m0RmSfX13a1dv8ha9Kk0wNfzfjoC+wpjCFKewPDIxaIpyrg9/Wk/knhv+olemn/1ZJpq3hvfTGG0b8t38ordvkPeKY0KrT9iaCsQVD/lPOci5Znnnyse4vf9t3+vHe008YU67+NqG4ZWf8F7e6ZswKX/j+Gr2XjIEey7x9kaC5j1jqPvyQ2B33ax2bu194qlIsWaxWXdMMTbO5XM76iBHwOY5c4j5iqX3clJiaIEk297CYyaI4Zbdr8KVHo0fuNeBv4Kk/ORubPIsOqW4pxwadzbsp0mTDqFJK4yB6xUlbP/drvViyKA5lzgxnY11u04aRM+8Ji1q2zd4tVdBaFyo+saEaBF/uTZST2WB7Td2gE0LfutN9yKFT1dWkcNAXWPld2xIv6oDV5wMc0XrA0TAdQLJgSohUhwIoHj/gdNmBSiEPlLq7gGzPTqDYswMoD/YAeiEPWBQn4GhoAbRCDljRvgjT2x3SgM+pAfHssEzY7wKIeiRMh/d0uQJ0JHOYwXkWJEAzhu5tgowQrWdRtwKE3E4g6nUBsloESt07gHKiH6hkEjBEkIiWNNE5KBIAZcWNyT/5nHag2efCNFXKjxT62KyYkYvCeGkwl2fYCr+C6YQumijFvoLwEP2A4pzFT7vNCliFVb14iw8xWBJQUHVAEZZjDitm4KPwtbJHmgD3zLmYeixvKl393R4MAkrjdEBpmgE4mtoApX46YPeHgESmgOl6Jez141mA7IAMTO9fB6jpTdUXRmth0auOmcD0YA5oD/UCi2ctwmRDBXsmWiYHimVM7Z0gp4JuHfA6JaApaACtQRlo8joBr+IA0EqY/uxKMAJs7U8Ar/d0AOtjBaAvq2G2ebb4bYDXYcPUXSW3rAEy614E8tvfAkoD/QAzT+AAQZ9MFmHtpdgU9oRVcZZ2du6twBr8/q+MXLHuio87atCM2+sbwxdf7u7YWXjuia7Pf8Nz4tG+s1a93YnRhqYN/uxmdVe375gTAytrVTjp5XLyjdcbv/mv+3hUSQq/7zwgCEalYpTKSNIo3u6AQMvmR6mpGq/8VPcvrlHqW70zRq+c6mppxz2/hEr9VZ8ZWQoX178hTd+tnFITKck28X3WXu/3tDem/vr34AWnA9YVh2Sffnz8AqsYG1R2X3X1HH148e/Pd3zv7qbPnKMOpLquuc9zzGFy4MCsD+bWvFl3+ccOyFTvHhz0BdYUpjCF/cHUEuH/DUodO9V8TpnZOub/qj395b7B5s9/tfYwZkCZ3qpc8iGeepzOjq7PfyOwfDGzW13LFsq+0QuL+w8tlcn85k6tP95w5aft0Uk0jqUefcAW9FtDgf0/B8lqffu4OovisDl3q9ts4Ujg5DM6H/7f4Nzl/gUr7IEoBqV4b2Ldc/nOzdZQOHTuxRb7bkVtZaDPd87K3ScJGOWJtVyAPLPOyAlnZRwzppcfn6CVRQmF9Gx+90uwBz75wdxdf15/2Q/ddRHDKntOn7gO1tLZ3Ktrte5eI5a0zJhub6x3HbZ41BijVFYLRUfDxIZnUxiJg77AyvcXMtsHAPc0FbB6vYg+jmpL3QiCR/A2lWIBKMX7gWL3diC/4y0gv2MTUOztBirZAmBx2AClvgPQMklAL+aAkxcfCbQEEsDWWBoYLJQxXbztFtFHJgNO67DYSMiS4vkyUBSReYbhkC1AULEDAY8DaAn5AEUrAcWdG4FyvB/QcimququhzkEHYHV6MG3BhyLt/EHAIsuAx2EHpgU8QNClYKb1CfGUZUQ3n9giuvDywvqrqAJpwV2JQEZxgbIFUKxWTLol4HQALvFFbYTxfV2hBMQLJSBXHmbOQsqw4b7sUDATDPXyEky3LaOiYpqeCxLIdOGqx+xqtLk8QLZYAgqqipldKCCk21bRXapmgEopARiGDlgdPeX0LCCRr1QvU5yMWPjQS2VMM7BwsAFo8SlAe0QFbLKOuWTW7LcAiyJOoCXgAXxOBVDzFUAJRoEtfTHg+Y4B4JmOAqYLfCovAX6XAai6CswLqQCahqm7ym3dAKTXbwSyvUXAmMmBMsLSDWMyXYRTFdY+wTD67rhFOWTB3uwPBq79rdIyY2/VVfqVF7VUIvXCM+72ubbmFs/SZeL9LhA8bhXgGezPb9uSfeSp9D0PG7ruCIcMq+xYOLuSKyhzZiBblDkzZc/ERupjorh5e/81N0ZWnRL5wMmTEv8ln3ki88aa+m/WGgX4j4RaUXOjEwD9R610NLeUN7218/4bMAxNVT31DQSCkcs+UjV0qKKwfatayCu7N0tqPm/mlc2BE0aXLHtCL5a15FDBZLHaytnMBDuE6/LPrx7lU2VvrLN/9soJDNpNGKoa+/ktxe0dzsaQa9lMIxIx4oOJ254prl4buur9I0eWtu60ezxvt6PbPx8O+gJrClOYwv7AmEzY81R5tW9IPnS/I+QPXHLW3gbYvG65fgxzBEPTMo89mFr9sm/2Uve0OQ5npLDm1eTfH3FGos4Vx3iXLKsyOrZInT9S5z/iaKDU1Vnq6Sp27ZIKVrpipEqZHdtT5bKmqoETjnQcdai9uSYjBgG9VM7efp9/xTG+4yeOah5x6kbysQcTzz8d/uil+1zY/V/C4vNYxqLHlOmtyvRW30kT9w2Utm52H7JgVAHqOnJ57LpbtHxJdk3ETXYk7IcOidbL3X2uxgnoIveCJb2332SUVWmEc82kkLrpLi0en/Xjj9obh0uycM/R2//tluLm7crsGdWNlXTWORnacgoCB32BpVWQZAmw+ryAUt8MOFvmAp72hYAj2ggkc0VAUnUg6PEDaioO6GoJEJl05dgAkO+KAcW4CkNkjHMgDVQyaUBNxYBi9w6grrkdmC6C+ZrrMBvihGxImFGpBsBgJgd0JbNAl+gaK2pAWTe8NjDtuIRLu0PNA5ktbwLF7m1AJRXDtBoXfYK2QBSwCXf1SCPgCEYAmzCLr2iYBvR2qxWo99kAWR6hjgJMQqKkqkC2WAYS+SJmgGO2LPRMFaCkDfuwu2XhrWUHGkTLm98D2EX0XqUMWHxuQEXC9M1KFUqY/JmwKfcqdkw2zhFuwLSJ0tXZgODebd4A4AiEgVS+BKTKZUAraoBcFhFskvlcDWU1ikDJiLcCvBU0AMndDNjLgsHSAMk1zRnQgQafBZjmcwOF3g6g2LUd0ApZoJJLA16bHTi0OYpJwk33FjGXzBo9dmBOxA9MD/kBNZ+tvhJi2TywaTAFvNxTAF7ZbgC9HVbAWTSAwShAxKsBhYqGSVVW0onqKzPXVwSyiQP8JXLKpuHtRtevrjXyqbr/+Nw4ze2WSEhLp/bcvvN7/+Wta26/7N+FlhTgqDP0cqn/lce011bvuP9u1/S2wOlnO6ZNH7mXY1qzY1qz77AV1S1ChlMe6Cu8sab3O9d5ly0MfvTSGs8/9qNfKw3NwTPPq3E8UEklem68zhH2N33riwdLyorF4Sil0xOP2wv0UiH+1N/qv3jVqO3K3Jn2pvquH97T8vVLx6GdM69ty+zobfrMkGl74fHnHG1jdA6OhHP2XHdrW+LOP4cuv2AfTjjx+/u03t72n37MouxWn9kbQ95j58d//fum73+1ujH/6lpjD3pvChNiivGbwhTe1dANNMOo8d+U0ejkYBiph/9iqRRDH7/M4hzPOsixcLac3iM5zjCMcrnpjCuGqysALHZHw9FnNZ19dev5n3AFp/Xe9MvuH/1P/2+vTz73VO7NNyrp9N60cvZovf+k05s/9QVtV1/qtntquYJKX6zY2e0/cxJGDuXe7v6bfmmtCwU/f+XBUl0B1rqQVioZ+xr8kv7rfb7DDnGMZaYavPISLVbo/J+7jPLYk5d7E53f/5P3rFXiK1lp+67KYKIWh1XvqtNLa9ZXAw0nBauqeVYtGlVdDU172Gx33W62Gorf55y3aB+O8i7HQc9gKV7JN3sa4F98KOBfthIILjkSWN89CHRs2IkpKhL0RmvQC8xpbAFKgz1U7aMEP2wYgEj5q5QloCIok3I3oKYyQH7XdsDm9QFCNiFZZACLsCNXMEkmZdpMIDh7CeCqiwIFdQDTNr1S0XWEqknG7BwsbN0KFHZtBAodWwEtlwEsI7RKItZUaWgBbNEmoDuRAbKpAUxllddhB8IeFyBXVKAYi2NagaNrmDSb8KAK+4KYDZKWfBHT10pEN1ZGyMtEhmDA5cDkrqRcCsjG+zEbMMVqvbCACvhDQF19qDq/aFsbcnIHwOYLADafH9PZK5UvAr2ZPDC4rQuTURP3DvFUhlwOwO9UAJ/iwJTfFSsakChqQCpfAV7XmoFwTz0gGQbQO82+crYGnNgSBNpcMjDw5LNAdtNrgJbPYXq7a/kMEFh8FHDszCagI54GypqOmQQwLegDpFIO0EoFwOYNAulCHujKFIGdcQPo7rMC0/tigKSVgS5HI1AogykdEyb1hloGRI6vxSoBTk+tHX81wpiMBmuKwZoEDKPzZz+Q0KJf/dSEXW/uI5Z23n6fLx4bmV1Tjg1KsjwUzDDmXo1t7sa2umPPLcX7Bl97ytrVn3zmScMwSrmMOxIt53K+Y45XWmcqrW0j97JH6qIf+UTHNd82vO7AeRMkz6Tufci3eJnop64FqReejT14X+QjF7sOH68D7h0IyWazuV2FLRtdc2t1Wx2CYfT/4Xa1e1fdf48d4GiNhkNfvHrgB9dv+ui14fceHTp1mUUZksYb5Ur/3c/G//yS9+SVvlOPA4xSeeAnv4mceYHsHa5NSz1dWjpV6NgZPun0kUuQztYZ7nkLB398Y/1/fHay11tOpqTE2G/n7GvbisnMyObD0tadnhXHTfYQ+4Bmt/eQumk1Dn7dfeCbOQ4sDvoCawpTmML+QJ+MBusAF3f/vDA0LXnvHXafy//R0V6gY0Ky2XzLFhbeWG07YVjnZA+GJEnKd293Nc0YZ1/AEaqftuoiIHo8gF5Ry8mB+PqXbYPpvqdudEXrrPMXBleuqt6bZZc7cv4lmcf/yjknj69ctuZLjkNqcp8HyoP9maceC77v3IOuuhJwHntY4YWnXXPm1yLkL/f3qvF47vVXKz0dWqUSuOLCcewYJIe97v99JvP35+P3PdX/uyetLsXb2pDt7K9kC7JTCVx2gfvwQwBD19O/uVOpa/QsG1or1Eul9EP3J19fHWydXRrsi3V1+M+7qGq4CniPOyn9ix+p3X22STqBOVcenrnj/spFx1r9uynk9EI5//wmx1GHDm8yDDWZVtomtuzff/T2Z4x1XTUO7uufqA/gH42DvsByNkXDx54CBI84GYgpQeDBVzcBr/cXgN4RDlVRtwVYnB3OGWxrmwuUY72AmhgAKrkcYBhxoJypAIYGUCnoQK47BeS604BW1oFyHqBYkABNkwBFMQD/NBkILp4NqOkYED76DKDO68RUYqVN7kC0GQplUlp4tQ/0VH9qxRJgD4Yw7cVt4XrAGmkE1uzqBXYkc5g+VR67FZjudwEuuw2QjTJQTgxUfwpqRLBitmAUUzAkIvCsI7glcfcV52k6s1sAt92GqbvKiZkHujFFSwKCGqxkUkAlkMbs/rMrLsAy4vNIlyxAoawCyVQa6Mvkgd5MAbNJU+jARGNmPQ4g7FIAn9MBOIXDlssOBN1OzK5Gjz0B1PnKQHebpXoVx0T1M9r9wCmzm4Deh+4A4s8+AqQ37gQqJR1wNXgArZjH5Cm9Cw8HFjW3APlSGXDabUAllwHUEQs9No8g/3TMvtGSkPaJrm3DAAyLDdDsAE47mP2noolSPClWrwfwTMtR5VkPHAxjMkajUwxWDTBUteOab9vC/siXrx71fJU7ezAMW310T2Gy88wT+7/7S+/KoXUiAFl2ts/uf+a+1os+I6SKNcJitSmRpqbjzgMix56X2fFW35N/yr/yYtO/fEmyDR3Xs3BJ5u8PJx98InDWqnGmyu7s8J1Wk8Snksl0/eLH4fef5zr60IlHV6HrhTc3ldZurHT32ZbMc7Q0KfNmTWL3Awr/OSd3f+l/ytf/JHLxZbbw7u6ghqHGBrPrXtPjg9kNbwrpore9zXA6/B++yDG7rZb5vSce5T3xKKOs5tess/g87ljSdeji6tqxUdH6vnmt4vHXX/kpsaXc3dX5q5/WLT5y7pX/ZbE5MIz4mr/vvObbbV/6epXfsoXCgeNOTtzw+7r/+tykLta1bFFpzfrNn/5Vy1cuci8Y0vCV+5Kd373bPrPVf/bJ1ZHFLTswjJHc6hRqxEFfYE1hClPYHxiTCXueqq8mhFYsJu661TWrJfCxSzGrK6NUTvzuXm3brnI6a/M4i/GUZ1ab/+oPjGyvs09rkF3O5BOPBUc0rIXPvSh+5609D95cf9L7RimxaobkbZvvbf1q14M3x+64NXLZR6r0jGPhUim+h/Brd8h2R401fe6Zx5WWpklVV4amJa/731Jnr3vxUsu0dmNzT+wvj/vPPdlz0jEHKgkKwyhu3Jb7y+MWTcNmk1qbvKeslH17SUW0WOq//tnso093Xfcju89nsTuUUCjf32+xWPIDAw6/z+rzWBfM8s0/zX3oYsserZGVZLq45s3sw0+6GuqKyZRj0VzJ53UfsVQO7LaSJdlte0ZSVgZimZv+IGmELv6gsIkp9/UM/u634UNWRo89x9xTCi1fVezblVv3uu+oYbct/4qjE088apTK0iSdZgOXny/9+W891/xZKxVdDeFSKlvJFGxN9d737Sa5q7y6zrN46aRmnoLAQV9guVrnNpzxfuClrgTw1zd3Ai/u0IDt/RYgn5cBu8MAmsOiOa4IOOQYEGhvAjxzlgJGuYTpmOUIdwJqOgVohRKgl0qAmi0BhVgZiPXJQGfBAnSjAmlKgCMrA22DVmBpagNg9XjFqQLBloWY7XiqbhQrOsPeVAB6RQX0UgHQikXAqGiYyiShl3I2tABv9caAl3uSwOZ4GShVwCTqBC1R53ECHqeMaUYvehLF74LBEh14ol9PCTWyuzpKqK+ExZf4fSThYejDLW96qQjoxTxmEqKwpRJnLri3IZN04b+FAcg2O1WaRxXe8WUgXSwDqZIKZMvDDvLCOcwxQgdm10pAtnNX9boEc3ZoYyvQGvICS+oSQG+2iMnPzQ57F4TdQN8jdwGDTz4A9Dy3C+jutwGSJAONyTRg9WzHFMDZo9MAq8sLuLz+UZcvmCfxkIqnUtjc+x1WIOwpA76IBnTpEUCXAaY1VoC2kAVo8DgBrVgAJPFqrGvElKkJTZg0TMLuL3SMySwR7kuFpWna2rVrOzo62traFi5caPnnddMxNK3zmm87WhojH7+iWiIk//Rg9onnA4e0ez9+qnfpDCTJULXYHU93f+W74Y+937VkfnX3wOUXJG66K7jq1OG1PLc78qGr+m68bvPN3/LPWR5cdKQSbWIfTNAkqem0yzf+5r/lJx4Lnji0Cqm0tMXveX58GYth6Go8NnJNakwUdmxLvPJC43f+bVInNfDt6xzuwLTPfaVaw/kS8cHbf5N+5Omm739lUlPtDV1f+h+r1e5evsJaV1eJx42+7u6vfNdeH92baEkO+PwXneU7//TKQHqBTgQAACAASURBVKywYbPkdrs1zTqtIVQfsSjj+SyUu3p7vnlteMlS3wmn2wIBS0+3USoVn34l++ATWrnsW75YmtnsPvyQPR0rtFQmdddfsq+ujZ55XnTFUGVZ3Lmj6zfXtZz2Ad/s0ZWNd8GRPY/fObLAkhyK4vdnX37de+zhk3pwJJstcMHpvOfUcu+AlkjZyqrrkPmjloxL23bFn3qh5V//36RmnoLAQV9gTWEKU9gfvN0M1vbt2y+88MI1a9YEAoFkMnnEEUfceeedbW1tk57oYEBxwxvu+e2Bq95XrZByf3+++PzqusuOj5w9bJog2eTI5SfkOwfUV95gRIHlXDQnH/DlNq53zxt2j5RkueHqz2TXvZZ94dnuR24tplKBlpmG3eubs9TTMmeovaYGSLI1tHSllhk2g7D5A2M6P42Ea2aLGo85Z06wbFdeu9q7csWk/K4yT7+kxpINH/nMSIbMFgzVf/Rf+n71k/zqta7lE5tzjo/ipu02m6PpM/82MmDbd+rZXdf9UO0dsDXsNSJQssq2xjpbY83OT4ZRuPvB0LHHB049W2xwzpwNsOpUDCPz2qtaOpV75NnMvY+C4Z83q1Qo2pvqizu7rLqR2dUZOnzFtI9/1tE0FMmsxmOxP9xWv+L0PasrwO4Py7bR68tWp9MWDdV6tqNgsdib6hlLwlWJJZI3/N4zf4nVe9B0g76jcNAXWK7WOQ9v7QPu35QCnt0EoG6zAOFkLxAxdKDgjgI7K3bM9MDN3hIwrT8BHN42HfBJEmALNwCuhDBPzwBaMQeID6bSYC/g2LkDUEtxQCpYgKRRBnoq2eqJqTYdqO9yApG+HkxPIyG0Et1n6bJe0gwgUSgDBbWCyb4IbmnI2dlmAGLR3R6sA/AEgE07tgNr+8vA9gHBMAGk/RoQcJSAWYUS0OIPYjqY6+UioBdygKFVAM2VBbRSEbNDUJYkzLupuPuqmoGpgiqO8NmS7Qpm+qHF6QIsFdELpw1fhV0BLDY7YLHaAItsrf4Ut2wh7hHG6KITUJB8gq9y2YSDF0DIaQOibidmD2Nq01rMvks1MYg5NL89Cjib2oCjmtoA++zpmMRSvmtH/98eAuLP/w3oe3EXsLnXBgygAx4sQCBvAXRVyKYkTLczEaEoiD2rzQHIigvQykVMiZtQbkV9IWB2yAMMNqmAVVaBwfoKYJMBZkYswLHNHmB2fRBQOzZhGoOJdlHROupqmw/wxEscIOjGZBisyVdYn/zkJ5PJ5JYtW9rb2zds2HD22WdffvnlTz/99GTnOTggS/6PXVqtrvq/90s9Fm/7wYfsdWMExTRedfqmq6/zf+i9I2//jlVHJf9y38gCS8CzaKln0VJAjQ2U+/tza15Ovvbozr/c5G1sdbUtDC0+UrZPvIDoCDcOPPdy9VQMraLm8uPtAMa0+vzqF0daau2J8kBf7OUXp/3waxOewEgUn37Ze/jRlj1qBYuiBN9zSe9vb1Dmzx7f22JCpG67x7Pi2JEPLyB7fZ6FhyRvuye6h2fVPiPxhwcqg6nGSz46xv9JknfZYUDg+JMwjGLHTi2XK29cb3HXW+ss3iXLIo3TRpaYWjbT8dPvTTvh/MDCo8Y8Vjk5qFd2y94xVDXb0+Pb/7jrkdD19OPPpe55OHLGud4jjj6QM7+bcNAXWFOYwhT2B28rg1UoFB555JGf//zn7e3twPz587/+9a9/+MMfjsVi4fA/oWbWcdhiyVxhKXf2aP2Drf/9/jGrK0CyyhabddTt333U8tTdfy127FSmj51aaAtHbeGoe/5CwNfXk9+yKbPm5fjqx10NrdFjzlFC491l9VLRNa25+qeWy7kmImk8Ry/vfugJvVQ05QRjoLB5k2f2jMnZtet6eSAWuXBsqyeldYa7dUby9ntDNbuh7gmjUlHjSe/yI/b8L4uu2+dM0Jg5mSMZ+WdfCZ/73omTZCRJaWkDxNM3xkyVSuKu20Kzl+6tugKKuza4l+zGbGWeesy3aI7s3YuwbI+z1bI5SZYlh12SR9OfeiZX3L6r/MbGwmtvKqGw/7iTpqqr/cFBX2BtHUx2bhnmrtikA8H4Zsz4OWxeQDIigMUiCBIwuQfhR7UrlgKmRaYB4aZWTFWNuJ8IRyLRI1bs7cD0SXJEnwXkpzcBaocb0Kw6kNNVwIYFsEhgZtsJEVKupALxYgXoz+qWoWy+ItCTzAD1kUbAFqoH7Nk0poe7PRjF7B/sTwlT+BLQmzaAvtQw52S3ikvTgVxZ8EwOwCIP65+GuCJDBxA/hVO8RWLIxGrogRpSYgnP94oB5FQNUyOVzBcAVzBC1cNdSHENo/q7UHcNpQd6vIBmSJg03hCLJqigoRhHK+B3OjB9AURjnTi3iEvBTFfM93UBxZ7tQGHXFqDU341p0C+4wELnViAfbQJkb6B6paWBrtzmdUBm004gNigDWRHRCIBXAvCHdcDZ1AQ4p88C3G1zgf68CiQLGUCxWYEGv6d6seVkDKhk04BVkoDDWhuBkFMBFkUzmPIyRZaBZr8LmNcQAfSBLqAY68PsW3TUNwNK0wzAPXsJwJMvc4Dwtmqw0un0xz72sZNOOqm6JZfLAZXdv4L/UyL+81ui7z9OmbnXiif+6BrZNbpqkWRZmdsev+fOps98ecJD2Osb7fWNgWOOr6TTiQfv23H3tTZPoOH4C9zTxu6oT77xjHXWzOqfubfe1CdKWbFGwu4ZLfGHH4ice+HexmRfeMpzwQR+WqN3eel1q91hC+5V2uU96YyeG38eVFVpD4qrRuReWWvzePZ0z9fLpcSaV5q+/aV9m3ZPZF9cLTscnsW1mlmMg75bfmW3OBpPfd/eBuS6tva9/lzbV/57+OhrXxt48vHmEa7re0PqgcczDz9p6Dq6YbFZK4WiZLPJsmx1OjW1LNtspUxWtlptHo9r/qLgmed7Fh2UXhvvKBz0BdYUpjCF/YFhTCaL0KC3t/fmm28euXHp0qVLl47dZFRfX3/99ddX/+zs7Lz22muPPfbY+voDupzxzoOWyWrFYvDU5Xsb8P/ZO88Aq8p76//2Pr236X2oQ+8CFlBRsWDBKBq7YkxM7NEkN5r7mhhzvekx10SNJdh7ITGKYFdQVKSDdBimzylz+jm7vR/27GEYBhiKSYizPuD4nOc8u0zZ/7OetdY/u7018tLHrpm9hDcG517QdufvM1s2dVc+KalkZusmQRCy9TvMfr8cj9vKK81en628UhBFs9dbeMGlciwWWfD31vdfkLO54Jhp/uFH6dvWgKYq4cV/zyUiBUdf3rWmKREzTdi/zsl19skdDz2nSWf1WutokpRPJpxjDjCcc1u9a8xebw5gL6/0Dhyc+vgL93G9UFB9QWbJMnNJL+382l9+1jVkgMnv2/Olg4PW2OYaeRiqq3xzY3rH9sorfrI3E0M23Ny08KnQSaeZnJ1koRRujy2YH7jwzL36IgFQU+n4X1+QWyKBk8/wjJ3Y1VNczefUVEpTVVXKi1abaLObXAfWNTK1bOnTzzxzQG/5WuGIL7CaknmpRQPCETNQpsdSmd0AthAQ9RUC+XKA4eUqUFciAgN8VsBvt2BY2HQCSY8aj2XzQCSdAxI6CSQKQKm7FBhz2mjAO+IowFE1H/C8+y5QtdwFNGdFwCUAlFbJgL20ArAVlgFb4imgISEDjR06kYTTIgGbw3FgQN1AINu4HdCkHAadpnNaFm8QSOYkjGgl3a6ns036v2K3r43gIgGDQutUROnqKJPePNECnbSV3qlQdxHque16n0STovNeYDBPybwERFNZwB30Ao6iCkD2BLoOb3Y4AYvLC8QzWSDckQJkPZpcFDBS7K1mEwaD5bJZu17V3YL6N0VXZel59x6rCYiHWwAp0grkwy1AtqUJUFJpQM/9k2Lhrjlmrx9AEAE5HstHI4AqK4DDpgGlsn7JACVlElB41CDAP3E6EDxqBrAmnATWtnZgkHkhhwUYnJOAYWWFgKD3EIy0Arm2hq7bXub2AVUFPkC0eABVkjDSs1Ir1mHkselmTP1dlkAR4KoeAqza2cJhxYEyWLFY7N133+0+6Pf791Zgdcczzzxzyy23OByOJ5544iDO88hCcsnn9gKf3ia1JzRaXvgw/PxHwSvOd04cvefrgtViGT88/MpzFbf8OLLg78nlnynZrGg2m512R1mJnM8LWlJpi+ajTZFt9WouL1gs3inHuceMtwRDRRdcgqbFP1+a375l/cN3WuxOe6DAEShoX7/CXTug8vu3dzE6ajYbXbe24qr998CxDxmQDHgjb/wtdGYvgVjJdautHvcBBQRokhz78LPy796y72mOyce2v/S0+9hJBxHZoMmKvLOp4LyLe4wriXhy3ZqS26870AX3gdQnywOnH0w3wB5oeuT+smmzzb2nk2vR9Z81Lnqu+PyLXUZiQr61ueFPvwt+8yzX/mrQ8INPK+F4+bU36Y+ALohWm67yPGi0vfZK3Y9v27Rhw6Es8h+MI77A6kc/+nEo0DT63mFQ06irq7vzzjv3NuHtt98+5ZTO3aIf/vCHd999N7B58+a5c+d+/PHH11133Z133ul2900sciTDPWVC+ztLUmt2uEZUdQ1qebntlSWpD9ariuadPbPX6kpuC8fmvai0RQOnnxNf9Hp6zXL3rBNdk0b3qnDygpJMJz/4RIjEdv7frz3l5aZBdf6p07wTJzNxsu+sb6Q3bshs3aSVVfgry/xTju0uEkp+/rFv9DDR5ezL5bjOOTn8pycCJ5/ea79qZ1XFnoP7QHzBu2a321KwVxNf57KD6+w+f/zN970zpx/Q+kBq/kJHaXmnla8bsjt3+IYMtJaXHOiC+4Aoitai/TCy+daW2EfvOgcOMXl9juraXktG34Sjoivfdw8YoX8i1aEpcmzTivDHb1i97tCs2buqq5amticedh0zYb/VFZqmNLcWXfytHtXVnlDzeWRZTiUFUdBk2eT2CBaraN3ru+RY1Gy3jR079u/z5+/nHL6uOOILrIykCSqAw6UCjWUeQDS7gYBPBQYXqsDQIhEYVeQAhoY8QLnPjRECrtM80XQWaE1mgNXtCWBVqwRsa9eAjjSAw5oEBha1AyfXuoHZV90OeIZPBAJLFgLJTRsAVVIw/vS468YD7uohwI6Vm4HGhAq0dnTyT3aLCmyMpIGh4Q6gsHoIoMo5QEknAYu/ADDZ7IApC+C3mYEir4Jh79J/a0t8AlDsMgMem87qaxgZVLoySddd6dyVaHdipFXpMx1m/b1mwC+ZAZOgdK2vJ7nrT+WsLAMdmRzgc7oBR6fKSgOSmTwQa48CsUwOoymkzpjoAVEeuxVDcaXnzjttFsBmMQEOiwWQFAWjx6LXaQekZAeg5NKAmt/F86n5PCBncoCQywOCKOy6OkEE9IeEYDJZfD7AVZUHLO4OoFhSAKvfBbgHDQb8E48HCqedCby9cSfw7o4OYEtE6bqQCn++64YUeZyAWxCAfLQVyDVtB+RkB4bgrDOVW6cYVZWunoO6MkkUALPLC9h0/6DLA+RFM9CUyOjfpMOUw3iYRe6TJ09evny5/nVhYSHwxRdfHH/88VOnTl23bl1t7eFTFv97w+R1e+bM2v6zZ3zHjRA9dkFRs2vqUztaXVXl1mlHe6b3NOUpiVRm9fr4y29q2Zx33ETPOZeEX31BTUWL7rhedO+rBjK5nb7TTgBc3zwrs+rL5EtvdLz3lmPAoOAZsy2BoGv4SNfwXnr0qplM+4LXSv7re328HMewwa4Rg1ufeKjk6p7cT76pUU4ke31Xr1BT6cSbH5Zc2pvhbs/jTjqmff5L7mMm7fsm7AZNa7//yezajZW33rFnHZP8bIkQOswN7HKJBHuoxbtj83/f5vT5ze4AmTWtW9Zrqlp+3ff3DEb3n3JGPhLe9Pg9Zps9UD040dqoZNO5VCIwpM45aXJg+oyuy0ms/KL1hScLr/5mrzV6DyQ++kxAtJaU9hjXZDmx/PPculWZ+h2aoihSHkEwmS2CyWSyWFRJVhVZkfImm9075ZjAjFP3XDm1fq2pD22gvs444gusfvSjH4eCwytyd7lcI0fueqKrqjpnzpwZM2a8+OKLwuHK5j5C4Bw3UpoVljoSQkMCu908aULh7FL7kAE9pqU+/kJZu7Hj81WemhrPlGnesRNMbg/gqBsubVzZa2Ehh6OxJ1+2mUzJbTsdhUFZVqxjhluH1DrHDHOOGZbbsiPx6qKm+39vDYa8J8x0Dh7as87QtI6/v+CdPNZa3deuuoD30nPb7vx9vqXJWrzbo9o1dHhs89o+LqLm8rH7HvePn2Sv7lOp7ZlwlNzc0PHAU/4brxTM+0/8yu9oSD3/uikjFV54mcnRy62zDRxKdGcfz7aP8NRUSW0tlr1nsdoDweCEk/11EwFPe9PO1x7qfbIgFH3zcqm9Nb1pg+b2WNsKbCWl9oqq7l2f0bTowtfSq74IXnZeX6orQIvFHXW7F9maFn3rjY6P3veWV1t8Jf4TjrKFSq2egPEZu9tERY6uXdq+9E1bVY1zcF2PV01Op730P1xMeYg44gssi4miAIDXoQIWswoUewRgaNACjCzyAMOLQ0DIKgCZ1gZAbm6CTkrD6i8AqkoqgdZEGohlFWBjswZs/NIMVDRsB7L5GLDKWQYsHGwCFm5dCVw6aiRwzPemA7EVi4F8eyNgcnowkuJ3RBNAYzIPxDMAqawgKwCRlAbUJyRgayQBVA6uxMglz3e0A3rOjU62BV1OYHDQhcFdtflkDI6n2GnuerXM5wakTArDzGhyuDG4Kz1/Rd/11xOqVEUBPA4rUJh3dK2Z2oN58tmtXV/rf78lWQFkAbq6CqazQHsqiyFoS0m77GN6z0RdhqZrsBwWM2DuVGWZAYtJwWCw9KPrOi1FFDEkSnpAlB6Xb3a7MHyXOnS1mf7X1uzxAWZvABAtVntZNeCsTWPk+OsknzVUguHXE6vqgBdXbQFe35QEVtYDtMVEwG7TgHiJChQ5s8DoTA5wqyogRVuB9Nb1QHrnDiAfSQByVgY0VcMg2ESLCFhcdsAa8gOO8mrAWlzZdZn6LdXD9A8jhfWVxjR8+OGHmzZtOuussx5++OHu4xdffLHD8Z//2de3970tNZONvbIgs3SFyWxxjplQddtPupTLOjzjj9r++nzr+s2Out0sgS333Cc3tvqm1LkmD/b7JoGQWr1diMXCf35MVTT3sRO9s04quPkqNZuLvbwg9d6C5icfCR473T5stL2sHFFU0qnWp+eRSxb85IYDuhaTy+k4ZkLrU49W3LybYc1eXZNpC2c3bNmzduwBqbmt/XcPi1Z70eVn9/24gdPPafzTb5ru+FXxj67dhzI9v3Vn6t3FyU9XesdOCF2818QE97CR9ff+wzF7psl/2JIz1aA3seSDPeuPLvhOPq3l1RdTjVutTndk1RLnsOH7CHSwFBT5CnrPzpAi4da/3q+oSvGPv9vjVqjJVHbjVue4XtjK3LI1jhHd/ASa1nTfb02INd/4rqOoct+XJpjMwVFH2wvKtj15f8WNt1kCu7Fuciyaaw/ve4V/T2zevHnjxo3jxo3ri9tmw4YN6XS6LzLTPXHEF1j96Ec/DgWqhtLnsqnvai0d69evB37729/2GJ81a9bXocDqFbltO5MvL8hurXdWVQdOOsM7cXKvihzBZPIfe7z80Wd0K7Dk9ojS3F77m6vs5bsedXqn3sJrTkks29z++Lut/73CPnGMb/YpwW+eBVg/XanubGqZd78qK6LFIqCZ/b7gdVfsmYG0X3hOOi6x6KOeJJYgBE87q+33jwTOmek68eheeCZVzazZkF+yLL5iXfDEU3zHHH9gonVBKL7yu4n332q58/f2ukGOYydaK8tMHpemaUosITW3ZJav0zbvyEVijoGDy79z0557Yd1hDgQdldXxJ14JXHfZAZzDPuE9e2bTf/8mW7/NXlnT6wT3yLGCYIoveU8o8rkmHx047oQDPYSSTCQ/eje85MPArBM9px7fvT7LbtgSf/pVKRITRFH5fJX9zJMsxbuJ20RVdQ4a0vW/0bcXKOl0zSU/0j9R9wXO0hpPUbGaybA772arqFS2rjvQa/nXIpfLzZkzZ/78+Xa7PZvN3nHHHXfddde+33LbbbcNHjz4a1pgBeymo8qtgMMsAuUeOzCk0AcMCHmB+MbVQHrxR0B983ZAikUw1DBmlxuwldZg6KiGlA0GVrR0ABoKUBxOANmW94FMfEfXof07ioFVG88CftQAcP7YOHDG4HFA3dSTAVlv/2e2AS07W4G8qhM2AA6blpN25Vcl8xrQltYzseJAUXE5dIpydIGO3vAu6PUDY8oLgDKvk64UeFEEvHYrUOhxAXYUIKfnm2saBqmmsz6dqiybs+trXc8UcDkxuKKA046htdL5M4vJBDisFsBts3Z9rfcl1HkyRVUx2C+dY9O9hxlZZXfFmM5a5WUFdqNS9PeKndcOBo+l5jTA6/UDckEpRuC+brvTt7DMrkjX9ZrdXsBaVIYhabIVlgMWX0gntzoVUaKIYXsUXT5gXVM7sPiLzcC727LAZ1tEQKgXgGAmA0S8TqDVIQPRrAJIqtp1G3UDY7qhHoiua8PoX5nK6yI2PapeA9xOCfAXSYCoy+Y0FSM1Xnf66D8kujDusCmwQNO0A2GwDqzCuuaaa6655rDlZR/RUHP59OerYs/8zWS1uMdNCp52niVYsO+3eI89Ydvdd4hjhrmMzaDovBe8U4d2r666wzN+oGf8wGx9W+OvX2n4/tLCG6+yDapxTRrNpNGe2TM1ScptqbcNrhEOthek6HZ6T53e/uzjPTK6fEcd7Rw4OPHG/PqXX/ePGp5DM5cUKuGozWJNrvlSTqfNdodv2ozKW87RKeQDhcnp9J96pn3E6PSqL9IvLAiH25VcHjA7nVaP21Y1wDzp2KJxk/p4XUWXzK3/1c/Mb33omXHsQZzMnjCH/O5pk8MvPVN23W17K1tdI0a5Rhxw5x9NUZKrV2S/WBrfsjl04jGlP7vFUrBbP5zoI8+mV64Lnj6x8LyjBVFsffr9pjt/V/XnX+yaoaqp5tYigxLTFCX24bsDzr+h79WVjnw6nW9r6Wrmo8McCCW2H+b91q8aP/3pT995553FixdPnjx53rx5c+fOnThx4tln90KpptPp5cuXP/300/Pnz//+979/cIc74gusfvSjH4cClQNhsL7KM/lPRWbNl9Ly9YmPl9mLiwvO/IZ71Nj9R34DIFqtvolTlJVfYhRYjpIiW23PGiX95U7RZhVtZmtpELBXFg74w7diH6xp+P3Dgdmnumcco08TLBb70P3s4u0X7hOPTix4X9sj/9MSKgxePNe5Y5sUaZc3bxRTopoTxZIq77RK97BRJu9h2I+zV1bvLd3+gCBarcUXX9X61COaonpP6SWH7CDgP++0jrZI5MUnQudd2sdv7t6g5rKJlV9o8Xhq5TI5lRRtVvep08uv/oY52LMfQOK5v2fXbRz4m6v07ztQcO7U6MLl3efk6hstbnfXNytbv81TVGYv6CUebB+QkjE5l3XV9dx/tASCFo9708aNB7TavxCKovz1r3/99re/PXXqVODKK6+cN2/eI4880muBNX/+/Ouuuw44lOb0R3yBVei0HV9TiCE28goykNi4Etj5zgogvWUdkK7fAWTbOgApJdMpvsLmtwPOqm2AkkkCIbsTmFQWBJY2NgFvez2AV1V6HDqXagFy6/4CBNJnAg+nRwBt6Qbg5I4UMCDkA8yijEHGlLgswMCQHuykpnIa4LQCuCwCRtc/3ZdX4i8ALJ4AXb65TBJIN24HHBYbUK3/8uish5wD1HQcUGINQFKWuk5YV1zpljSdFBHNVkD/1NXJPOmOPDkPOEUT4HKYAUHcZdbVFU560z0lGgWS+RwYpIvVBlg9AYxegbpsSGewlG5slh4tpnMxOjWiM1uqqgK6VisnKUAql8dI/9K5sY5MFijWxVImc9fViQ43IMfaMXovmt0+wFZcBTiqBgHuigFAUywZTWeAdE4GcooCpCNxoC3dBmzpyAGrW2RgTb0A5JtFoCgeAQRNAUyqEyNyzNItuEvpSAFKKg5I0SQQj4hAe0YEEkBXXrwmAA5FV2IBmHX60BsAzJ4gRpfD7kH2h1Eu/lU3e/7aQo7E4q+/m/74C7Pdbh80tOy6Wy2BA27HGzj59O33/D/7zGnW8mIgm0gq6+KhWZO6JjT+ZUH0zWW+smCiJWZ2Oar/5zK9M4//uBHOwWXbf/KUtK0+MPfgG870gOh0mN2u5KrlnvGT9nzVXlVjr6rxjJ14uA73FcFeM6DgvEtan5kngOdw1FiCyeT79jcbf3iP8sTDRZdefRDBXVI0kl67KvLWG4KA2e1yTRnvPHmqa8p4cS82vchfn1O2bh9037dN7l0Tsjvb5Ey2+7TMinXd24HHF39gdu1VjL83NL39vL26piuetDvM3sD/3XdfQfBg+0z/c7F9+/ampqbujSVmzJhx77339jr5wgsvvPDCC4FBg/bT6XwfOOILrH70ox+Hgq9Ug/V1gxyJJd5ZrDa15dZulOJJz9BhwVnnesftteBQ8/nowteEWDSxdYvFbjd7vLaxE3yTj+maINrtgWkn5v7xjvVbFwLu46ekn321+wpWWRt17VGD5ozSVG3jkyvXXn9/9U8udI2sAawlgeqfXbTx+gfcp7dYDp/byzlyiJLNHK7V/lVwDqkrveraliceljdt98+94ICCUnuFYLGU3Hlz/MGn2p+ZF5pzad8lbrmmxuwnH0SWLwscPTFw4ZmuyeP0hOR9QVXzazdW/vi87tWVpqiRx97zHLtb4WvKS65xu0bsHq/Ftp/4sR5oXPhULtpUeu3Nvb4aOGP2t66+5OWXXjqgNQ8jtm/f/vOf/7z7yLRp06ZN671obm5uBroL20tKSsLhsCzLZvNXUgsd8QVWgdsxotgPpLZtHh/c6AAAIABJREFUANo3rQJSm1YCqc0bgdSOFiDRIgPppAhI0q52ew5HBvDFt2CInESLDRh5ygXA6YM8wIbmBCA1HgVkky/3ehqJpncAx5pa4POgA6jwJIGg0wZUBDxAbdCHYb4rc6eA+lA6nJEx9mi8VhOGyEYnFfQcKZfbi8EYyfEoIEfbMPKxdE5LzaQwpD+dGVcWK2ByeTEytKx6FrzHB1jcepi4FUM7peSygNy5ZgpD76WzWeh9A1UFQ76m9/vT5+iJ87otTmewdAJGVzsNLKvC0Fq5rSkMLkr37butFgziRyf5dB5LlmQgmc0B4VQGCOs+xLyMkerenswAVUEv4B06FiM+Kh9t6zpPs9sPOMpqAMUTBJZuawI2hRMNuqMzpwJ5RQNkFSAja0AsrQFtcQDd+5i3AXR4A4BkFgCtUAXKAgBlbgsQdDoApT6FEc2l2yRNJg2w6wFYuhlTAPC7FSBUDuAdVAK4BgwFHNVDAHtpFWD1BoBMVgIK+x4I1DdoB1I29ddX+4aybovSlsAXCMw631ZVI+7zr3a+rbXhvt94y2vttaMKJp2Fpsa3rE18+H7qs09Kv3Nj1xPaN23G1p/fri54zzdzun3owNaWaPtrnxac0fnU7Fi9NVgzEBBEYcilY6x++/KfPzv8mR/qr1pLA4HjR0Uffb7oxz3zqxIffKpls7nVX1oH1SjJlHPcSEtxgSmwf42UbLMqq5Zz9OHZXPsXwlZRVXHzjztee7nh1rsDF5/tmrKv1j19gcnr9t9wZfP/+13jn35T9p2esel7QpOk8AtPxdevDp49s/zSO0THXttp90DsH2/nk2nBuuunK7OlueH380XRWnDRbtH8yU+WB87YlTKfaaynuK/R7bloa/Pbz0npjpJrb9KjQ/aEtaR05MiR/8ICS1XVbHY30m4ffU5jsRjg8ey6Fo/Ho2laNBrVQ/sOO474Aqsf/ejHoUDTDiAH60BF7l83OMZOCs6Y2cfJ+Zam0MBhxTOv6BopnFAUGn3Mtud+G/3bi8Fz5uiDgtlcePb5ifcXasdPFWzW4MXnJF5/P3TyOP35WnjFSZv/OL9yxkBXmQeoOGnAij8s6X4Uz9QhtO5GOGmSnHz274llq31jx5ucQTEpSltbpMZI25YtFpdTsFkdk8cKXrdr0pheH/nuoyc2v71YU5SD8CH+u0G02QLnXkggmP7bO9m3P3bOOsExetihLChYLSV33ZJ44pXG+35bfMW3zXsPx8ru3NEy7y/eMXXl9/zI5DswjZrvpGPV9kj9Xc+rsuQo8KebI2anw1RUELjmm913J+VIDEV11Y3oGrEPG2Vq69jv+lIqEVv+bmTtJ46agSWXX9kjQOTfCrW1tX1vLHHWWWcBiUSia0JHR4cgCH5/T33b4cIRX2BZUBOb1gDpLauB1Oa1QHrHFiDbGgGktILBV9ntelaWgNHCT/83FVYAcVM9IFo+AkSbAzj3jEuA9vR64N7kUMCfmw7EGt/rcRqqkgMsuRiQzjkwPusHnXbAL6hALtwMlAoCUFUcAMxDKltiSSCSzmI49XT3nJ4LlZUkwG13YXT063TM6flYrTuBXFsjIEXbASWTxlBT6YYdW0klYLK7MMg5qy8IpCQVyKeygN1iBhw2ByAn47v+7QjTxZDlc4AmS4AqSxjBUWoujcF+dcaUm8wYyqd8exMgdYSBgvJaIFhagNHBUHcF6l5FPb1dz23X/0TkFBmD69KTtBoSGSCckTBIF789CyRyEjCkKAAU1tYBWY+frh6Obh8g+ELA2oY2YFVLDFjdnmvs0IBUbtf3Uf9M2N2oF3Dp4xqQ9MkYbJbVAlDsAxhVYgKGFbiBgNMGtGdTXbfC6nMD/rIc4HBLGPo/u98MOEtDgLO6BnDWDAWctcMAZ/UQwFlcCURTGUBWFcDrPKTeYXtCBblf5P6vQHLVci3cGvtymXfQKL0rKCBaLFXnfm/jvF9YhwxzD+/0nXnGTUwv+yTywFOhG65wHzMx+8HSnb96ufL28wHvpMGJsQPfuuLFEd+aGBxdHF7Zoiq7qUWVZC65s7mrOZEmyTtv+Zl34OCKW27v1gVlJhAAORZNrl0lxFPJD9/reO41Dc1/8jTzgErHqF0hT5ayImvQF3391eCsw9CA798BgRNO0abNiCz4W8e8l2ImwTvnDNfEMQe9mmA2ey//hvLIc/V/+N+ya663lfaS5tr+6gvJlct8552+Z6Z/nw5htwevmKOpanbtRpPHbc/merUvxF9501pc0t1c6Rg4qPm9+4NHnWqy9SLt0jQ1sXl1cuOy6Ja1rqqasutuNfu+qsrjn4MejSV0rkvfKNTR3NxcWFho6a2L+WHBEV9g9aMf/TgUqJq+/dvXyf04XCiafUFyzcrwhwtb3n/ZWz3UM3yKu2IQYHa4i487K/nRe+5hI7sIiYILLt/5h3sSCz/wnHxc4NpLm+/8bfsLHxWcdwxQfss5ic83ffngG/bXtmWiyYqbd9skkuvDrqN2lQupV9701AwMXXRVr6dk9gf8R08DfCedpilKavVKubUx8pdnPMMG28+cYa3obOEXvP6Kjj8/2f7c4wVzLv0Kbsy/AILJFDr9HO2UWZFFr2fmv5Oe/5brnFOc43vJ7ezbckJg7gXWEUMaH/xj4axz3RN2tQtUc7n4G6+m1q4q+uF3rBX7iuza/0FE0TFy6N5elWMd2ZXri6+8tvugrbzKPWzk1md+Uzh1lnfQKEE0qbKUa2tINmyWWrd37NjoLCgUSsoqrrvVWtgz7FSKRlJrVijNTUq4VclkEEVzcVnhnEsO5RK+avRoLKFpWm1t7aJFi0477TR9ZNGiRXsTbB0WHPEFlpJJ59sagXy4FUOWpPsmbAV+wFagsbtRTtMDx9MZQOpIA7lEHsgnFCD+5TZA0xYCOg/17TMvB1RtLXC/OBUILCkC0i3vA4qUAhzegUAkWA6M9KvAQL8TqPDYgfDSt4D01nWAnIoDJqsdsIRK7GW1QG3FAMBZWQl0ZPJAIpcDspIMtCfSQIGundIDljrCGG4+OREDcq0tgJRIdF2sTZIAsy8InaSQHvqVyitAczyFwSF5bFagNOCBTnZFb40npxNd66u5DAaDpXV2/ctiqLWUdArolL7qaVt2ByBF2wA5Ee1aRxcVFQSLALPXs+uboqu7dBWX2QJk8jKQk2UglpWA5lQeaEoqQE7RAJ9tVx9GXePlsAYBV7AIUHIZDOavJZkG2lJZoDEpA81xrTUOkJcA7FYAhxUg5BKAQqcIuK0ihuSrM0Rd0wCrSQBCDgtQ7XMBw0tCQKatEYPk02k8R2UlYOlMXhYwQudthaWAvXwA4KgaDLiqBgN5mxNo7kgBifpmDFLT77ABod6a/h4KNI0D2SI8vAf/WkO0270TjvJOOEqKRmJvvdH45hOqLPsHjrQW12iKkqjfLrz2coHBEpnc7tJvXdfwp99ZKkvtdYOK77ih5We/1xSt8IJjAc+EQZ4HeqqsAE1Sml9ZXHhtZ6hm6pMvYu9/UnXrT/pyeoLJ5B4zDsb5TpiZ+PiDprv+UHTTVY5hgwFLcWHg5quafvJb4fkng+ecv1+x0ZECwWwOnXom2qzIe4uif30h88nywNw5++h2vG+4powzBX3xJ16Jvf9W8SVzLQWFydUrWl94KjB1Qtn//pdg/apYE0BNZ9p/9aClsMhW2jORIXTuhYmVy+Kffrjj9ccAQTS5C4twOBxjJ5TOnNmDb1OSicTyz+UdW5ObNgii6B5cKwd9jmNPNDnsmqLGn3619alH+a+bvroLObwQBOGaa675+c9/Pnv27ClTpjz66KMfffTRokWL9FcffPDBt99+e968ebbe/JIHhyO+wOpHP/pxKOhnsP7lsASCheddhKom16yUw+0daz6yhgr902f4p+yWhGktKim+6MrW+x4LXn2hc8ywoh99t/V//6xEEsXXzBRMvUf1RF5Y7Kkb6Bg1FNDyUvSJVwrPu1jslqEvRyL5tpbk6uWOAYMFs9k1fNSeyirBbPYee4Iqy8qK9QwbrA+afN7Su76fev61Hb+6q/x73z/S95J2gyAEjz/ZN2Fyy2N/6fjTE/7rLu9LG8ReYR8ywHbH9eF7H2197AEplXZVlgXnznEfwv7jfqGpavqzlYkXXveMHOM7eVYvM0TRM3aiZ+zEvabcalp684bsutW5bZuzkYh32GCtvKDoG9+xVvas1Sw3Xd16171tbW2H8fzLXO5xRX0l9r5wufc/aXf84Ac/2LZt2/Tp000mkyiK991334knnqi/tHTp0mefffahhx7qL7B2QZUlJZfu+l+zx7/rX7cHsASKAEugEKMNny4VykdagUz9RiC1aR2Q3NIAZCISIC3fAijpv2EY5a456wrAa9sOPOYfANSvHQKUtCeBmNsFBIYqwIRyMzChohCIrlgCRD95C+hYtQpIN6egU+DjKHS6B1QD7qFjAPew8YB3yBhAsViAlkQKQ6EVz2aBikAIsJfVYPBYprZGoPNPgE6xqLsemDobpOe2W71BoCGaBFoSaYyEKv1fr8MO2PUPo3vkuHR26u3WDVTQvYqdvkUNUPN5QM1mATmVxOC0Os10Ou+VTQNSPIpB8HRmcYkiXb0RnW7AbnUCAno2mAok8ioQy2hAVtYAWVEBv00G4tk8kM1LgMdlp8tTqZ/tbtFRnWWC/lTSuaugC6A2KAIjC+zAkJAbKNfz1Rx2wGISd70Zja62iSJANtIO5CJtGOnw1oKSrsvUn1tmTwCwFlUAzsqBgOz0AZvbosCO7RGgLd0MZBUVoz9BscsGWE0mDDbrMEI7kKDR/vrqK4QoukeNBTj+pL1NcQ6pC55+dviBJ8UbrrDXDSr9xQ87Hnjyyyt+X3X7HGddRY/J8aUbm1/6qOwXnY7C6OMv2YuKXcM6Jc+aokRefq5j5bLQwGFCThLVLdEt69pefNpdN6Lg/Iv3LLPcYyfW//4e94Vndo2YfB7v1RcKr73d8MdfBWfN/vePvzogmDze0u/c1Dbvgda7/1h0+3XCwdr4Baul4NZr0LTclh22gYchKLU7NFVVYvH8jgY1k8t9udmayUdXrPHW1DrHT/ad2FezRSdUNb1tc2bZ0o7VKx1Bv1hR6rnsnMKB1fvITTUFvNbqsttuu23ggEMNsO1Ce0ti3cqGvk8+0PVFUbz//vt/+ctfbt68efjw4d1rqYceeuihhx7a8y2bNm060KN04YgvsPrRj34cCjRNU7+yVjn96BVqJqOkU6okmTwe8wF+CvdOmGz2BVr/7xHfuad5Tjw6cNNc7alXGu55yVYRCpwz2T22VjCblHQu+tLHLa8uCV3zTZPPAyiJZG7txuK5nduImpRv+MMvPUUVQ6/8iZ5sAhRMJxdpaVr4VHjeg4E5l/Rw5ptcrl6ftZ4zThQLg+HHXyKX90w++mBux78rBJOp8LJrGu/7dfy513wXHUCD6t7WEg5XdaV0JFLLVuc+/AxJSre223xeAcFdXaNlspYxE8qOOuFA8+7TmzZkln+W3rxBMIvO444qOmmufUhtH98b/N5lf77spl//8pcHfh3/Sni93nHjxv0TDnTkF1iqorMFess5XXJkDZUAzpo6wFJcBWxoCQOtyQyGba1m4ESgfHIeCC9+HRDMC4H8ss1ArEkDMrEGQE69iiFCOu+My4ASlw34W2kU2NRmB8oFBagrFoHpVQHAm0sAzWuXAtEvlgNbPpeAHXkTRkx5wcZ87da1QEkiDug8v9VfAJiLa4FoJgc0J3blfOiXMKKkCHAPHoPBCelJVHo/QT0Hy+IPAmZfCCMHK6NCV6ZUZhe7YzOLGI5Fp57wbrMDJkc3uY/ePVAPBRb0/oB5DL+h5GwDBGsrIHdE2eU6lDGEcXpjPv0MNUUClGQcEKx6mrwZw+eoegOAo9iB4S60mkUM8kZ/wuu7Wt0LA7NJBGwWM0aal559r8uh/J4AEHRYgZDDDIRcqr6Y7hys8puACcUuYFJlEVAgSkBq+zogG2kF0nn9JpsB3YYjdrZx3PV7pPOjot0B2BzVXbfRGigEnGXVwLb2GLC4MQqsbW8GNkcVIJzSAEkBI9y/zLfrkVbhUzDi6Q8j+oNG/2nI7tgWf/fNTEO9nMnavB5VllVJViTJWzvAOmyUZ8wEsbcG2Kn1a5ueeNg7dHjBeRfpE5yDhpRceW3rEw9LW+qDV50fvHi2et4Z0adeiT7z8ba7nxHNZk1V/VPGld39A5O/s3iKPPCUvarWWtAZ9tP65KMWp6/k1Mt7NAWwBYtrLrgpvHTB9l/dVfvf/9Odx9IkCbX3nz3XUWNtA6ra7vlz4rPFpd++6SDIntgH72RXfp6LRVVZqbzpR/8+G46C2Vxy9XX1v7nbXDfQddCa98MEuS0Sf3p+Yu2GgnETbINGuEeNKQkV7spLO8DV1Fyu46N3Oxa/b3bYLYNrCm67xlJywFlQgtlst/c1vutriCO/wOpHP/pxCOgPGv0nINews/3Zx0C1Txkbmn2CvaYS47koNbfltmxPv7U4+eE7vtPOdo8Y3eO98vYtxeOni4K249d3BU4+wzflGMBeWV123a3ND94bvfev3rkXmDyu0JVzAE8sgYjodHaXDSmxjsyWHZU3du4VapKUb2qsPf/GvbRcEkJHnZpp3JpcvcIzZlf2ppxMuIr3+gA2FwQLf3JjYt7zbY/c55/9zT09aHtDvq01Nv95Tc7ZT5rqG1yb+2JN8wN/8J1yxr/PhqPJ5S666Mr2x5+wlBZZS/t6XYcZmpZc9FHk5TcKTjg5dPbFJschpQ3LiXj8rTc6VizzjRnum3NGj/B3qTWc+uQLttUrsXguFre6HNis9hOOcY6uEw+3w+Y/Hkd8gaWpaqe6xRfC4K48Q8cA68Ip4M3F64AlOyRgZwRAFAAGlbQDZw1xA+fOvBCDaMk2twGRpgTQ1GYGsp92AJr6BnQSOVNPngOUT6gAVjRHgZSkAFVeBzC+qhhILf8AyDZsA+I7MsCOvBnYRBrIqjIQFG002QHn5ibAWb0TkBMdAEUa0J7OAesjGSCeVwF/dFem+eSqEsA35hiM3HazbyuGaMziCwC24krAFioG2lIZIJ6TgIykYpjj9NR43YvXqdmyOwGLN4QhG+psh+f0ACabHWO3SDdF5sPNQK6lHtBNnXrivCpJgKinW1ksGPow3d+nryBkdrFi+tF1tZbOZoW8ISBotwIBWxaI2NSub6LHJgABuxkIOmyAz2EDktu2Yyi9dKrJYbEC5X4P0JrKAmlJ9dtVwGMVgGEhFzCluhhwxpqA9pWLgfTmNUCurYWurH+HA7D6g4AlWARY/IV0dQ90ebtumsUfAhyFZUBzMgMs+XIH8HlzHFjRJAObWgCaoyZAygqAyaoBJUEFEAUVGODbdcm60O0wQjsQkXv/DuFBoPWZx1Jfrglecq5ryrg91Y2WkkJLSaH76InZL7e03zcvueS9kquv7z4h9tknFade5q4cbC0f0vLO86nPPy66dK7Z6zd7vOU3/zi+6B8NP/hF4fcud4wcApj8vSRuR/7yjGfEqK5OiB0ff2i2OSzeffWPcw4aG174j+4FVnb7Vim3r589s88duOHKxIL36u/9ZdE5czzdsgn2huzOHc2P/NkxYmjwmrn6n3HLacdrLkfb08+5R43rY5CpJstqLqOkM4LJbPZ6D1ostQ84Bw2xlpZH//x48U9vOYg+g4cKTWv9xX1aMlt54w8Pop3lblDVyD9eiX6yOHTScSW3X28pK+r+UuqL1fFn/qZks8FJdUJdoWv0UWavQ5OUzLaWxIIlDU++UvGHOw9a7//1xBFfYPWjH/04FPRvEX6lSK34XGrcXnTrt221lfueaR86oOyeH8XunRd/6w3vjFO7xv11w6RkDPDWDHNf8qPGBY+3/uW+0EVX2ErLBVH0nTJLc3o65r0gTR3vOfvkPYsSNZ2RGlqKrr+sa8RWXils3Ljvk3EUljt8u206abLs2nvqUhc8M6dbhw1KPvZS/MO3Cy+4zFrS03pmnJYaffPvHZ8uCV55vnPCqN1WmDZZXboyvfFLV93wvR1FzeUyWzakl32ab23OxWKi2WSy2VRZlrNZi8PpKCgQgkWOYSPstQN20zkcAoovvTo87/7UW4tdJx2z/9mHFcmXF2ipbNl3bxZsh7QZl2tpjrzwhCXgLb3jBmvlbk693KZtiadeUXPZku/M9E2uY3etnWNQafCksU13v5D64BP3Cf9RMruvGkd8gaXJkk6E6OSKvaQKaEhJwJubW4GXV0pAx3IAd9tKDOLk85KxQFs8CbitDcAxE08E0pvXAp7NnwPtSRPQkjABltVxwOL5EBCdbqByykygdGglRlM8PVDKnEtjiJN0wkZPabYjADZEQBIEQIWcBiBnVYzufvrp5SUZaEvngS1RGWiJA5hFFWhOJjBos+NqSoCC8dOBVKgEI3FK55xsJVUY6e2JxnYMz2Cngc4sAk6LGbCZzV1HF/WYLr8Zw4FoDxQCLR0JDBWXpGiA0x4CSoZXAZ7Bo4FMw1aMfHk51QGgKBgqK8Fq6/pa50M60+GlPKBHUOuqKZ2Tc/v8QInXBZSlckBaVjGS6P02E1DmtgOlPjeQaW0Eci07ASkewZBD6Z9ryweNBNqTaSAnq4m8jCHMGlkSALxSCoisXgrEV3wMJDZsBDKtqa4fOZvfBjjKigCHqnbdLt27KtqdgDVYBDiLy4Ht7R3AmpYI8GlTAljWoABr6kVAaBCA4o4oIKABHZ4A0GETAUVVAZtZ6PrpklL773RxQNC0Tgqzj5P70XfkmhpaX3m+5Cc39FC3pJevVVatjy7+TDCZnCWFloljvKdOB0Snw3/dZQ0//J9cOlV45jf0yZLDlV21ODBsEiBarBWz5nZsWl7/p98Vz7lEdx36j53uHj226cE/Jj/6rOhH3zUX7kZyRF9eYC0oNHl2NWMxud3R+q0FmaTZsVd9vZROpNrbQ91GMutXUxroiyDfVlVu/dG1iQXvNTx4ry0Q8s880zFoSFeeuJrLxj9f2vHuQntRqOiH1/YatqlWlMTfW9hrgaVms4lPl4QXve4oDNkmj/WdNtU2sKZ7d2Q5Esuu3yQ3tCbeW9D8TIurqMhcVesaPd5RWc0h9PYRTCbf7G/u+O0v8Hlck3pu4+4bcqwju25T6u3FBdddfqBdceLvLE68v7Ti5v86xOpKjnc0PvB714RR/ivO70HChf80L7V6Q+WNZ/uOHd77pjEAvguO3nb7E/0F1gHhiC+w+tGPfhwK+nOwvjrEP3jHPaquZ3W1bFX0sZf8J44act+1gskU/2xDcsHyyOr17ovOsZYVi25n0a3fij3wtJrP6xGXvqOOblu7uvsKvkFjhVmWln+8YCko1JMhzV5f5a13JD5Z3PTT3/nPPdVz/NQux5/NZBJG79bG2FpUEjx2ev2rD9Scf6Ng6v0RkGvc7J+6WwqXw+kQxuyVUuoBwWz2njHDNX1qYuEHyfcXtDz1qLOoSJVlQRAy4XbfyDr3adN9p0zb23abpbLUlu7lRy27c0f42cdNPlfJHddby0t6fa856Hcf3anfCuWl1KcrlO07Iy89JaXSrrIysbzaNXyUrbzyIBopWgLBovMvjr/wd9vAKnOwrzL8/PaGlv/9c2DEKKsrkHj4Od8NV/Z9l02T5dRr7xRecGkP0ZUmy5F33hTb2+KbNwSGjZTcntDM3iKvDKiZTPvjfwmddYrzlON6vJT82yJTIl73yI1m7350XZaAx+LqacLI72j4dOnSPl7O1xBHfIGl5DK6v69THuR0Aa3hNLA5KgNbGsxAVeP7QLztU0BVJcCdaQRWuc8EFpXFgeNOHAa4ho4BfOu/BALhDBDNiEAqKQLpnW2AY8tawBosBrzDJwIDi8oxZEx6PJXOZzjKqoHg8BZguNQCeJscQEx1AFYodSuAs9CBYYTUf5fSeQmIZRWgPQmwM6wnQgHE0np+lR4A1gxMrSwCqkZPAbLh1q77Y/OHgJjOOakqYDWJgN9mBbx2C1DodgABtwPIxyJgJL/rAU4uL7CmoRVY394BbI1lgY6cvpoAlLnNwKCAGxhUPAAorxsLZCNtGGnvOi+lG5E6+apMkq6keD0lS9dm6UY8swXIun1ARUk1EMtkAVlTgWReAXw2M1DucwEhlx2Ibddj/Zu6VhY71WNuIJ+IASGXA+jI5l1WE1DgtAPlfi+Q/nIZkG3aBmQaG4BkQxJIdwiAyawBJpuEET2vP590slC/Xbph0xYsxIjgb4wngfp4FqjvUIGmKEAmLALlHWFAzIYBzA5AE4KAw6YCAaeA4Vot9rmB3Lb1AGh7USgfMDRtb+aw3if3o+9Ib1wfuOK83UZWro88+nztPZc5ajvrg9BpE4OnjN9xz/Ptv3mw7Nd3IAi22irR6w6/9krh7DmApaAwl4wntn/pqd61Q+etHaHmM40P/LHqtjtMRtCDZ/LRplAosegfLe98XHzX9/XB5Kr1ziE9n+jeE2cm1qzc9NgvAmOmBUcfo/+udSG+ZU3Lsvcrb/hB98HYpk0FZ/R8PO8bJrfTP3sms/FnslJTm9Tcaq0uD3jdJs9+iLD85u1qS7gH1RP98J3owtcL5l7gnNhXAkmwWtzHTOSYib6LUBKp1JLPaW5vf/6xXDzpKSszVQ/wjD/KWtR7odYrPKPHKc1NzT/7Q+mdN3c5NPcBqbmt5Vf3F513kWvkGDSt+S/3Rh56JvSdi/t4uNj8hQiic+CQHuPND9yrpNKFU04LjJqRaa2PfvR3wWoLnnDy3tZpffJhSZH2rK7CjzybWb5m6EPXm9y92Fd7IN8clbO5HoOxR56bL7tsBxt2/x+PI77A6kc/+nEo6A8a/epg9bh7bIGlF77vO254V3WlQzCJ1T++oP5Hj6VXrnOOGQ54zjs99fTfuyZ4ho/ONmzsXmAB/qET42uXJhe/7zv59K5B56BhLE3TAAAgAElEQVShjtpBO3/3i+Qrb7rPOQUo+P63or97pONt+27Jk4JQfsMP0hvXR+a/2P7ZIps34B4wSpUV0WZLbVoOSsnFV+7pBLQcrIdOdNhtAyptA/ajQtOhKYq8fkvo/Mu6DyqZdPrjDwMXnd336qoHTB6X95RpgBfUdCb1yXKtvqn54fssLrdzwhTPxCli3/K7/aecnm9tit33eODmq0TnvuoSpSPRcvcfC8841zVyDIAgBM86v+WxB1HVfaR3doclErefdHqPwXxLk5ZOD7zkB3pEs6OoQmnZwt5tm5ktm5R4rPi/b+gxrkmysmlbzV2X9KW6AtKfbvLN2I3UlBpb1HT2xz/+8W9+/eu+rPA1xBFfYKmZlG5YE20ODAOd1WwCrCYA0azp/wEjwElVADkfAwqjWWB7xAysbwkDAwaOBDyDPweK2lYClkYNg73QNBFQUnqwUxuQj7UDFm8AwGoHbP4CQBs0ki4xU7AYcA1YBxTv3A7kwjpto1g8XsBZVQXYSqoBiycA5GS9yx4YmU9ZCSCV2SXNcVg1wGvLAE5zGJBVFSjzF2EkQundDNP5DGASBMBnt2LwWDqXo3chzEVaASnRgZF3ZfX6gdZEGtgUiQOfNaWA9a0q0J4Ag0UJumWgOpQD6toTwMCAEyj1OAGfIwA4rRbAYbUAHqsZg9/Ktu6kS4mVzwBqblfauyncDFj9IaDC78HQkCVyEuCxWYBijxPIRdsx3Iu6t1FnzvS/ZZ058nqLQJMdMIuinsyu/7Totyupy+B0sk2Xo5kEwGrXAKtLAOwFHsBeVALYSioxhG624grAXlAC5DQB6MjkgLQkA3lVBTQ044xQrQBZmwewCSYg43ADmUKAIQUaMDhoAQaFvABJvenkTjiMBFY/g/UVIhdPqOlM95F8Y0vhBb3Z6wRcJ4xof3q+XmDZB9e0tbVmtm1x1AwAPMce3/SX/yuYclpnEJ2B0pO+ufGxe7wnzuy+4SWYTGXfuan+d/9jrhtorxtoDvoDN1/VeMev85s3mIcM8009TrR2VhLOwXXO79+upFMdSz6UUHMbv7QPGGyqrQ2demZPL56qKvmcaD9sLUT2gfCjz0npjK18t2D6tueeMFeVeY7bqzMx39iS3bBV3rxN0DShqMBaVeYcM3xvW5Ci0+E5YSrgvXR2Zt2m+FOvxt5dWHzp1faqmr6cYdElc8MvPdN0+6+Kbr/eUhDodY4my233/Mk7dmL3Ts/WkjIplc43te5tf7MHol+sqpx+Zo/B9leed1QM0asrQJVy4c3rgsOH9bqCmk61PPFw4PJv7FkLxl5dKDqtzsF7cSHsjnxTtPW1pSU/uXHXkKZF7n/SUTfK6TykzIj/bBzxBVY/+tGPQ0G/i/Crg6eqOr1qvbV6VwNdV2VZvrV3m4J73MDoS4acRRAcleXZ7Vv1AstWVu6pqklsWeMdtBt/Y/EE3IXF+dbmHj16TW6PaDZZjKe4OeivvPenmZXrEi8viH/4rjUY8hx3omvoMN1HYnK6gjNmAnSzLvaEKKLtysT56qBmc/KGbSVXfLvHuNPvU0fW7OU9avLdJR3zF7prS+2DijGLSkNj5ouV0b8+7xwywHna8bbaqr0eTxAcwwc7fn5r+ovVzY8+6Js4NXBqz4KmV4TOvVB99vHIrx/0X32BbdAeJ6Zp4T886qqoCRi9ursfUc/W7ws0VTO5erogvcceL3/ysf61KuWa/vGorbike6BGd3QsfM1eXe6a1Ev3Q5NJdE7rk6hOU9TGX7/iGj2su5ow8tcXRE0MnX5oAff/6TjiCywlk9Q1T/rHsly4GaiqqAOGF0SAYZVZYEf7VCAgmAEl1waY7SVAo1e3ZshAJJ0DRpQPAJwDhwP+WBSwuJsBTVYBe8iDYUxDEMHgOcwWIJxMY/AWIALu6pFA6ajJgBRrB7LN9UCurQGQ4xGdLBEdLsBeXAWYPT7AlJSAgN0EFLglIOrWH256fhVATgIIZzRgZyIHeGxJQNE0DNOZ/hFOZ33sFjPgtlkAr8MG+B1WIN20A8iHWwA1n8UQtGmBAiArKRh+Rl1CtLVVAFojIqApAuBwqUA4qQLhVA6oT0hAiSsF+O1mwG0xAV6bBShyOYCqoBdwlNWyq49hGoNcVLMp/RYBuXALUFwzFMjKCuDM5ACH1Qx4nXZAbmnDyJfvzJ3X0+GtdsBkdwEWpxtIxNJAIidlZAVwmCUgmc3RpaPyBQFbQQhw5fKAU5IBi98DOCurAeeA4YCzdjjgrBiAwV1lJAVIZHIYRKPeQ1CXixW5ZSAaUIG8LAPtdjOgKD7A41SBkcUKMLbcBIwv8QJDSwuA2KpPgHxLPYcV/UGjXx3yollbvYFZM7pGsrIkL1oZOnXCnpMFiykTiXX9r1hdnl2/mumd7xUHDGpd/LceBRagKGp6/ZoeBZYci8q5vMmz69ksmE3O8SOd40eqyXTstbdyq5a2PPNYaNRo2ev3Hz29L8npgskkt7Rbyor7cN0Hj9hjL1r8QVtZz76Kia1bHLW974I13/1HLZUa8KsrbeXdXY9ktrakPt7Q9odHTHZ76JZvWYpCvb5dh3PcSEt5aesv/g+7PXD8XsVM3VF4waXpDeuafvWA//j/z957h0lS1l3/n6rq6hxnevJsDuyyxCUuLHkFUSQoQUARRRAVUVFADM8rio+B931+KijoAwoKCuoiggRhycElCLvAsoHNOzt5OudKvz/urp7Z2Qk9gbAw55qrr5nqCndV91R/+9zne86SwBknVeg9S9P7fn6r1tVXf/nnBlFoRiqJZSnV23UOxRj7Fiza+tc79QdvcwVCfWte8s2d13ju4HpUIP3qy8nXXm3+2beHfLawZr2yePjSszIE3dhx7V16Xq+/6rzKwuKmbZmXVk+77JtVznV+YLHHF1hmsSgSVzSnG7s/P9w4HVg6PQqktS7gaZcGrNt5MJBOyYCsWsD0eh1oCUnYSSzumjrAO2Mv7CwXMYtnFETl4QOcNXWAwyuKLS9gSDLQkcoCm2JpoCNTBNIlozLUkEsBmvwhYMbsFmBmTSigSoCWTmBbJChOF1Djc2DnDQtjAreqAV0pCyjpAD4XgNsBoImJMyGNzxexFffi012RJcAjCiy3E7vcyXXsAAqd27HrPyEwV0MaoEcbAUXxYP+nC4m9mKykIAFODSAvyUDMJco4YVtqAvG8BnhUHXApAH6nDDT5heVpCdi3uQ5w17cAeiYBGIUs9jydmOYTy4VEPeJ1Y8+PiTk+VVEAXZIASZRTPtEu4MN2AXXVNQMZQwJ2JjPAjnS+oJvY2v/aRBqY1TgdKLbMwTaeFZ0HAsJW1DNtLnZp5Zs+F8ijAB3JLPYsLQOGF/G4sIstUaE45SIQ9hhAIm9WLm/YCzCv1gEc3BgADmxtALLbNgKFjm1AKS6y66v9Ejwq3kmj0ddeey2Xyx1++OET2sueg5rjT0z8466BS+q+fGHvD3+ReW2rf7+Zg1ZOrVxfe1h/Pppn372Mznjlz/DSY1PPPJ7a9EZwzi6BLQ7V4d1rMA+R27i+5uAhSAtA9ntrzvkYEMjl82s2lB55puPmVyyL0BFHu+fOdzUPK5OqXXpM8dmX1bM/OsL5ThBWoVjcsKXxoi/v/pRv7/1M3dh9OaBaVuN3zhpUXQGeWQ2eWQ3RTy6NPfBy149+6Tto3+BZp8ieYc0O1Pra+m9f1v2jG9RonX+fA6oZsHf+whnf/G72qRXtV/138KD9zJqgYpJ57mXfzDkNV1y6u+Vp5rVXaoaf5dwdnmitnoir0V26UCVFab3sm30P3utorIm0nBw6fOjOg8LWzX3/vKfuG5cMd8q+Dx8r/eeVkQdQ6k7svO6vJo6671xWKRYLm7bFb7qj8bwLBw1sCrtjqvycwhQ+0LAszKp/JlJgdXR0LFu27MYbb5y8sb/X4WpqyXX3al09lSWyx+396PHbf/SX7JvbB66pp3I9dz5lzZ9dWSK5XcmtW/v/VJTQUSfsfPRPej7Tv1Uuk+rqcNYNZpVSzz6hR0chpWSvx3fI/vXfuazp+m+Hzj/NMtM7f/PLrpt/nnrh+SHX9x5yROzJfycfeHyUc54A+u66zzIttXaIj21Dlgsvrt59uZnO5Dp73DOHlzRJUs0ph8z4wXlOijuv/JHeGxthAGp9rW/ZUbH776n+je4IhUOnntlw/ufkULP2ynopbYVPOLnm4+cOYShvmoknVyj7Lahyz4CJlX1r/RDjjNY1XnBx+Mhjhquu9FSy845b/ccvcc0czAVW4N1vYd9rG/vuH9pkQU9mO256cMMXf+06dHHddy4TORyA3tPX+/Nb3XMXeucPrfqawkDs8QwWlimIH6tUBPRkH5Dd9haw1/z9AK+zBZgXiQHrZ+WBroyBPWsWcivA7JATiHicgIEEuJtmYLsGCMMFwWeUY3mCNYASCGO36OeKJaA3WwDWx3LAax06sLUXIJaWsEmdsK8ITI+mgP2bug5pCgL7NdUCTWE/oGVSQNihAofPbMaWis+vSQHbkwUgVtCxm7+8DgkIuxVsGbtmmNjydnFxhImookqA1+UESsk+bDpEE/L2ZC/sEuosvFID0RD2DFfIIwE1fmGFagLiW2XYbVWWC15NkQAKugVkSxa2VF9VTCBWMLEjevxOFdi/tQV7hlcI1Q0jTUX8Xshjs1neaBDICxIPC9ANAxCuiWqo/4usJEmAM9oE+FpnA69s7wDeimWBTYlS0bCwPUuDzjTQGGzE5i9FM4QIXxIZ1WJXnunzAFd9K7AjlgTiuX7KcOA8rM/pBHwuZ2VJ0OUEot48MCtcxPabEC9crUcFZkX8wILGWkBJdgPZtk2AFu8GzLzw5pg0Buud8cGyLOuCCy7o6ekZfdX3EySpZvHBhTUb1AEpfv4jD9HaOtv++2/BA2Z7DpunBDyljR099670HrjIv6RfSaP4vO5dTSnDxxwvm1r7g79vOeUixeUFup/5e+1hSyoffmVYlpZMRJcMFuVYup5+4t8oSnHDZte8WYDv0P2VgB9Z9h20Lwft6z/z5OwrbyT+9A9jy4bAyacPmjd0BEMtl3yl+4+3SNvbveecUr0RVPVwu9yeY5YN+VT4iKN3vvicpekDPUUBOeD3T2vOrW/z7T1Si6J3Xov3my369Ubv9b+JfPHTI5Qd4Y+dYK3ZkN2w1rcbLzgCPLPmembNDR9x9AjrZNa85pvR6qnCDb9/t0sWS8lU9esLaPG+rt/dFDl1mW/Z0hFWk5xqzUXn9P75vsLLmzxH7uXbe7rkVEtd8dy6naXVW1Mb2kKHL66/4mL3vFmVTXKr30z+8e/Rj5zuP+iwsY7qg4kpBmsKU/hAQ3QRVvkzbgbr+uuv37p16z777DP6qu8vWNHG3GODOaHIOR9ruO7KYo70g6913fhQ9s2e6Nc+H75gF8csM5cvJAbL4YPHnqhZ+rpbrt350O2b7/xJavsGz6GDnbULbdtlh8NRt8uUWfaFV9u/cV3u8WfcqS6HS3dne4pPP9/+rZ90XPmj3Ko3yyvJsu/g/Zqu/zazGrb93+t2T710Nbe2fvN7Srhp57d+kln+kN6XYFKRfuV1ZRg1mOL1Saoz9cjTuz9VkuW2n/y1uLNv1P23XHG6b/8ZXT+9aeS+WfmAhYkH/1HlmKuFZfXe+xfloEVj2kiuCadffXlMm5iFfOdvb3Q0RUeurgR8i/dt/Mm3rBmzE/e/uuP7d2+6/Ld9tzyefWmrcsihjT/4RuBTZwysrrLPvtR7853+Q5dOVVfVY49nsCSnSxURJV4fNmEjyJj05jeBxrpmYNY+s7EzXvoyeSBT0gDTFASPgi3uMUU4SW0DYBkGtqBHzySxCRUhqBfclYiAEN/shbdCb84EtvQAtL/lAJo6twEUegHUALC6fh6wfYGR1ZKA3+kAmiNBoNjbgc0tCQ6mMRQFZs1sBXI4gPZkBojlCtgidPHBJ7RWArbRg3CXoHKa5YAaQ8cO5xHCduFwIZ4V1J0wAg373ECj3w3MjhSw1dl1QRNbRC9aBWq9wgZCxmawcpoFxPIWkMhbQK4EtlDJ69CAJn8WmJEPYbtdlDxebLMGa6AxaakIeGQJkGUJ0HQTyJc0IBAMV85ImLWKTmZ3QwuwpScGvNWXBt6Kl4AdCVMwN5phALWePNCaSAMLm2cApl4C9EgdoAgDDmEn6wsD6zp7gY50HlvYLnKHaiSwvTB87n5nCvEOqfF5gPqAF0gXS4BumNhWETVeNxD1e4Dszi2Vx1JvOzaNV556mLzE53dAg/Xyyy9fe+21Tz755Fe+8pXR135/IbD/gcnHH97d+kj2emou/dQIG5r5QmjW7MFLJan5S1/Xk4m+B/8RWHaSf58Ddnci0GK9of12YV+Km7bF/njP9Ks+ETh4LhAFIPr5ZZZhxlesSj+0InXXP6LfuETUZJKiBD62jK7ezMsrg7tRMpKihE74sO+QI7LPPdH+vf9bs2yp98SjZf/kNOq7w0FnzbBSdN/Bh5dWreGjxw9a3nDVpdlnX9x85W2BA2YGj9vXPa1O9rqtklbsihuJXG7DTrIlfWefnsrnuvq801uarxtFmh04dknmoSctrSS6LCcF6ZdXuutrA0ePrTTx7DM/9sd7sKwqE6bNfL779zcFDj/Af9Zg96zhIClK8JQTBvZh7A49nkz+9s9aX6L1sm/sPh89hRGwxxdYU5jCFCaCsXYRrlq16thjjx248MILL7zwwguH2ySTyZx33nnf+973DjnkkPGPco+F4vVZpllq73a2jsExHMi/vs7MZod8yhEKN5z7meE2zL6+2vLJA73Se2+8rekLHxbV1UBIilxz0uKaEw/suu3xjmt/3vLTa2RfuVRyLDkw9r93715glZ8NBkMnn+Zbelz60Qd2fOOHteed5j/q0Ik3lOV6+gKaNtyzkaXHbX3qMa2rV22I7noaku+owxxNjflVa3p//5SWzhglTXYoDq9HDQWlcNCKhByLp/sa6iLTm0e2BhWQ3S4LKfnSv8NHHDPBMxKwdL33gXsbrvnSWC+REvDLsqz19qp1VcnJu/7wG90oRc88eVzDHAKWrif++kD6qRdqj11Wf8Gyt9uk4/2HPb7AcvhD7mlzAUVk+qr9WcJGNgXkCjmg0LUDUN0+oMUfBNRICFB9AUAv+3kKSkbC1l2JZjVhYSqSg4USS9A/AmapCPgiKuB1OrBzlIuaBESTGUBPvAEUMzsAWVaBmlIc2O4/bGeTDhQNA9CyaSC3dT2Q2/ImoKeTgLAYdkabAXfrHGD6tLnAwjkzgZ5UFpvNShdKgHAfyImWP80ACg4Dm20qS4I8PkAoOYSRgay6AMvUsVe1NK1ygs0hH7CoqAERVxHbOVN0I9Z5nUCt1wW4HQq2mUJnOg9sTBSwk4t6MxZQ1MEO24nlNSCZLwANojHT6QaksguGiU0cCguGckYN4uRM7Fgh1aEA7pp6KqFDLjcQFwYTiQy2mUV3xgQSuTIf43WKBkwTSBc0oCR6/cK1lcE4PF7sAJzN3XGgK50HenPCjsECLBzYnKgg2IR5qfA4tXQd8DkcQLAmiE06SkiAXsgBpXgvkNjWgc1aafFebCpR2III/R+9TBbGajQ6c+bM008/feDCmTNnjrDJZZdd1traetVVV42wzvsbsqI4ImOL+AWMjdvcC6rqZRsETzhkzumnGfTuXofLWXP80E2FAJLU8NkTZIv0n+8Lff6TYpkS8Pui0WE3AcARCEY+fq5v6fGpB+7peODx6Nc/P26rd4HAzGnW8AWWpKq1x59YeOBx9XNn7/6sa+4M19wZnFktczPKSBbNl+RJ+3DMrn0jtGCec1pVlp6D4I6Ekauir9Iv/lvGaPyvy6uku0aBaSYfeTr32PO+aTOaP//lKi1YpzAIe3yBNYUpTGEiEF2E1a8cDocHMVgD8fjjj5944oni96uvvvqAAw64//77V69eLX9Q/XJK3Z16qVQNcTIQZr6Qb+uoO/vCcRwxt3WLs7G/ByL11AtqbWBU3//ac49ac971/rM+KmwwtfbuQqoqebWzviF64aWJpx7rvO6X9d+42DV7xjjGLFBMZ9i6yTN7MNNWgf/wo7b9+L+YNytw1NvLhpZMQ9u0IXT4kZOyt/RzTyoLZ45v23wsXg6WGBF6Ktn9z3uav3f54I6H8R30jfWpO/9hmVbo+JODB43BV2IKg7DHF1hqpC6w8CDA4fVDmXoRciKRlyJa4UTuirB6khxOwOELAo5QDeAUAb3BMHZ3oXgUWTHlLwSC7jBNwMilsYVKgtkSbEdz0Ac0+1NAjb8EtLm9QFB2ApZlAqZZAjCKgGThdADUetxArn0LkNmwCki+9gqQ74xXju+uDwO+mbOB4rx9gNLc/YDw7IWAI+DFlhOlilrlsWiYgCpLQFE3AUWWAX9dBHBG6iqnI4Yn6BbF48cmAoVCqz7gw6ZnZoYN7Oib+qAP8KADpXgfYBolwBmNALnGWiDS1g1IUgqwLB27r1BA2FCVdAOQ3QMSjcR4DKHBElqxImBoGrbaTCTPCLVZrqgBitsFqB4/UChpQDwnoqk1ICc6H00ACYQmzeWQsJsxBf0myLDSAEZTXApxecuPpmiNFKZf/W+Q8okNWCKJ300DMIo6YBQL2Ao/0RpZbuoU8jvRSpnsq7zHypHS/hB2xDi97UwSJreL8LDDDlu1apX4va6u7sc//nE8Hq9QXIZhvPjii3fdddc999xz6qmnjm/AexIsK/XP5bXnnTZWUiH7zEu1iw92hGvGcUzftOlmuL/AUhuiTik/wvoCsscZbK03szlRYBm9ff79d3FDTb++yty2ObHqlUBLa6mkBZd92DtnXvk5SQofu8wRiXT/v1savvMVZ/M4eSzXAXvLmZHeYbLTWXvyaYl7HnTOaHZNbxlhzQlCbW5QMpP2lcAbDkvzd5PTVQFtZ6fscDgbmkZdM7v6lcD82Wp1CTwjwEhlsg8+kX1xtfeAg2tPOmVyyLAPMPb4AmsKU5jCRDC5InefzzewVfDSSy/98If7A1i+/vWvNzc3X3nllYsXD53s8b6CZbX/5hd6Jtl85MFj3TD1wGN1Z44kgR8Bub5eaavkP6J8UCOWyG5qr0bCU0hm3X1x4dWeX7nKf3A/f5NY8XDsmScal3x42ikXYRmpzWv6/nJHnyI3X/ZN4b0M+Pc/qNTTE/vl7xp/8q3xjVxLpgqvvBkeIbEHgocuAav7pzcHP3ZC8MSjpbeHGdV2dunFSastMh3t3uSwtNwISD/8lLuxqonF9AvP+s84cRyHGAgjk+36wS8Ut7f5K1cqPv+gZy1dz7z2SrGzHdnhbmn17zue+esPGvb4AstV02DWTwc6swVsSiMYCgHR1llArmsndmuenk4AiAY6kStcyFNpo9N1AGEBZZjY3u6y6qTSvYXFroSK0NbknW5g1qwFwMJYCljXqAHbRBRBZjHglZ2VPVjhvYGaBmNujQOYWx8B0k89CWQ2rAF6VnUD3T0ObFKkNtwLRNM5KEuQZBH/EqoBvE2zsD//siUd6M2XgGxJnAhAVutXLwlX99b65srpoyiAVSwAkssNKIIURAL8bhcwXeicVBUo9HUCuXVvAqkdmwAt1oXNPAn7KP/8A4BDZ+2NzZ8V9TTQlTUAryph2507RCSzIbRW/dqv8u/5LDbZYxRygMsdAByyhi2eM8rUowFIBoBh2VQVOAVv5xTW6iagSJZLlYCZYQWYEfICrZEAoCdjQCnWjS1EE2yT1x8E/ELE5nRgBzkLNsshSDULoGQY2O2N4tKpqoqdNl1uiizkAC0dB0o97UCxcxtQ7OkAjEwSymSe0F05PX7sYGnWThqD9bZG5SxYsGDBgn5nxe9///tNTU0DS673MZKP/NPhdkSvvGKsNEDutXWeunrvXuM0cnTP39vU+i3gfUsOSrw8hEXnIBi5opbNuxfOBcxMthiLNx+yRDyVee2V3Ksvz7/gWyKHHvC1zG1aemrXM/f2/u6mmnMvVGvLaq2aE07SNqzJr93oWTieeiJw9GHS5tHf2MFDj8Ch5l98tnPF8+7Z06xICEW2cjmlqJvxpJHNlzJpSzewLFl1qgGfo6nedfgB7oVzZfewNu6D4A34pekjGWuNCf5DjzS3j/kfttTeVXxzY9MXr6hmZVmR3fNnjb7e8NDaO+M33Rk+ZEnwuJMGPaXHY/GH78tuWO+vb3IEo5KixP6zHFnxL9p3Ikf8IOA9VGAZhvH666/v2LFj5syZixYt+sCKNqYwhXcS74zR6B6HCd6Ouv54a6FtS9N/Xz1CNstwSN59v2v6nLFuVYHkcORfXR885xTxp1pfW0xm8ls6PbNGmj+KPfQfV21YfI1MPfFvd22dUPPoyUTXX/4095Nfq1RX9mGkhqPP6Hzm3rZf/b9Z//XjykJlxpzM3x8ZX4HlqK3JdHRUM78YXHxIcPEh+U1v5bdvNZIJySjh8slBt2vOfg5/wBGpEQ0upq4V29u0jp3JO++LG3rNxed69p436s6BxMur/QdXnRg4Gtxz5rf/5kH3iUep9aP0DVRgZnPdP73Jf+AhjmBV7RGFZKoShjg+xH59h+wL7V5dxR55IPHsk9F9D2887xvOUHn8oUVLtvzlV56r/6vCX04WGrye/aIjpUYOhDZGaeM7j/dKgbVly5ZPfOITr776ajgcTiQShx566N133z1yd5JA3pRe2t4FbE/lgZJhAmGXA5ge8gFzoiEgOr8OKPR0AHo2DYhv4yIDWHBUstLvaCW+c4peMGEUbg3gHgYai5dVMg4Hto3TooYaoD1dAJK5PPAfOQzkuo7BVuR4GkzgyNnmkpYQIMU6gdyWtUB6cwfQ0a0C7YaF7QZrJRTA35sDtFQSOxpZOEUJ5iYrVEdFDejJ6djNcUJIJIzLnYoMBDM5IORxAd5oI5Spu/LpqE5AHdCLJzgwJxZ2OHR26zogu2EVkN20FirHe88AACAASURBVCh0d0OZw3E3NlZGGPEFgPl1Ndi8GhSxI6sDTgfgdanYFKNo1TSyaWxNmBAhCSsyIarzhWqx3epFL6FbVQCXqmKTSUJKJbyycgENu7fRqRSBnGYGnDIwK+zFNtMPGAUgu2UdUIp1QVl15whHAfGRU1/fCmSKJWwBmaAMxUGFxVdaBHGTxxaHqQ4Z21Lf7wtis1miI1XPJrE5s5J4l2YygOxyYocqCvc1l3ixRhUtV42xitwngpUrV05o+3cK474dCRS2b9M62xq+/ZVxVFeAqjqDi8evLPYv2j/5xCP95kmSFD752PRDqzxfGpY4tIp66uFXw58rtxCyYWvInqfLvPBc4+Kj3PVDW583HnVaftvawo5t7mllbbt3wd69r42ScDccJNUhKWMoZD1z5nnmjFQwyeAIhliwKHzcibkNa3tvuaswZ3r40vNHtRtwuN3BQyYtMdPV2BQ95eO9P/tN/fe/Vk3Ss5HNJW/8g3/OXtGPnD7qygLe2hojm6u4bIwVxc3bJcNsvHDX0GjTTK54qPTmmllnXuZt3KV3wdMwPTxrr+RzT9V8aHLaNiuIdaU3rd5Z/cqTe/RJx3uFJfrSl76USCQ2btwYj8fffPPN3t7eT3/60+/2oKYwhfc/hAaryp8JFlh7CiZ4O+q56zbvsqWOuvFI1IFcT49aP347RyUQ0PL50oA5Kc/SQ7se/U9+U8dwm7T9/B+W2+OaMwPQdnamt2wXAdKWYcSff9q/YIRqT3LUNiee7g8odDdP0wuF8Y3cKpbePo7UO39hy1e/pXfF4zffOfKaZjZXTKXUcGTk1caEwEGHyYFQ309u0ntGCkMEtI6ejmt+Jrn80XPG8JbTS1ppW9u4h5f+ywPOuQsH1Z3dd/8h8cK/p3/8y4OqKwHT4S5sWDfuI35A8J5gsPL5/COPPHLjjTfOmTMHWLhw4fe+973PfvazfX19tbWjsIXpYunN3gywtlcD0kUL8KglYFqoALSlcsBe0SAwo7YBCDVNB4xCf2dNWWUlOwDZMgFVUQGjVAB0Qajkc9gEj1l2NirRz0CkgGJfF9A8f19gcVMNUDT6gLC3CHS06tjMQ2tEAo6a5j98VjOQWvkvoNCxAyjEdaBgqtiSFwcS4HKYgMPrABw+P+DwhwBhZC9iEGP5EhDL60CiKDyihDzIAtwK2CyO8H/PlXQgFA5UTsp0eyoXRDRmCuJE3PcE6aJlEtgtb/n2rUBmyzYg3SYYNYBgtgCowTDgmbEX0Lx4BtDYl8QO4BOsWNitAkGPCyh1CI4qgc1mCSWW+C4uMgq1dALQsikg6PFRYbCcjsrLWshnocy3BL1+YF5DLeB3O4HmbEFsFXSrwPSaEKBm4kBq4+tAoW0joCVj2OmTznymcllUfwiI+r1Avhz4SGUY4vIa+SKQKfY3PAqRmUdVqPi5+0NAQVGxiTpBzpViMUBLZwDF6wbUUP+93uGdtBRCgbH6YL3vMZHbEZB+5UXV5wmeOHQKbzVwBQIj2EFVg8iChVpv3Dmj3GenBP11nzmz/Wd/n3bd+c660C6rWvT+4YnM6i1N15WNyvIrnq09pmwpmV23Jtw6yx0dqYvNVdOkuPpHa+qaswqSZkhkXljlHs18ayJQPJ6Gi7+y8xc/Sfz9ofAZw7pxFrftDM+cNekNdC1f/Hp65bMd/+d/wh8/KXDcEezGopmFYuq+R/MvrAoeduRYmaHAgr2NZGb09YaBVNQCuwbgaH29xW1bZ597hZjk2R2heQdkNu0ZhPS7iPcEg5VKpS6++OITTuh3689ms4Cu68NvNIUpTGESYFoYplTlzwdBgzXB21HquSfNpuhEPp4NTdPioyfrjQDNMPOvvTlwifeIgxyzZ266/Lepl96qlMm59Ts3XnZz7Kk1jT+8UsTd6LFE/LmXfYeUP2uzK58lMErFU+zZUYr3a+qLbTtKwxjQj4rSG+ul4ORnSA+E7HLVnnFO6tHnLBFTPxRyr64pVf2VY0wIHL60+ZLLc4+/2Pa1H6TvX1HYsNlIZ81Cobhle+wPf+u85me5lasbL758HPNuJcMsrV47zmFZVqaj01m3i/gtdt/ffC3znMHhWVhJSu/YPs4jfmDwnmCwGhoabr755sqfbW1tv/zlL5cuXdrQsAtPvnz58uXLlw9cYhiGM1TTVzCAzpQF9KYBZMkCYlkDSBZyQLKoA325ItAc9GKzCMLMyYkEqFiALNIMc2lsXkp4aInfRQBq2RvJ4cRmOMSj4LSKiRgwuy4MmFhAoz8DxAsa4JAkoCXoAfZrjmo7NwOF9q2Ans1QlkIRdpmAWxMdfAZQNx0gOG8a4J05H/AIC/twFOjY0QX05EpAqmQAJUOoyQCcwupJFZ10DsDnUrF7Cc0BRnaSQ8XWXYkAvlyx/5Sd5VZKiUqaYbEI6DkNKOYkbAZLy/Y3ypX7/hwKttm936kAiiQBwQEjyaX7uSubwSpVLq9orBOPWiYFuFQn4CortNJASbxYmQQ2Jyc7VGxr/mnhWmB2XQ1gWpbgI/Od24DUtvVAfus6oNDVBhi5LLaNvhC6CSeqUm0jEGqeCcSyeWwNVnEANWgULcAYEAQpOlJ9qoLdUBl0uwDZ5Yay0ktI1rRUBigmcoBa0gG9VviuFbDTNnO5nNc7OQFwb2sX4Z6IidyOAIciBz4yOC9vTHBGQno8zszx78E1e56ZH2z2H/ns2dL9K+J//vfO/7nX31KXae91hQKO2TMj558hOcpsSvaef0WXnWS3D2PlspHDl4xwIMs08p3bGr9weWVJqa8ncsR4XED1eLK0bWfL5W+747933oLQzJm51Wt8B+035AoqyAvGlspcPVzNLS1f+1Z27Rp9x5a+X/1RVhQtnw+0thiW1HDhpa6m8bi9A969FmWe2jG+bc1CUXGqAx1KLcModrS3nPP1EbZyhqMOlxvo7e2dxNvR+wzviQJrIO66664rrrjC4/Hccccdg56aP3/+KaecMnDJs88+m9Y/CPf8KUxhF6iT4dcs8A6EPe+5GOvtiN5kprOrZmKJMUZJK/V0T2gPuWxx247d28/CH1vGx5Z51m+S3W63prvmTB/ItBW37kitWjPj6rMqS7LdXe7akXoPe55/0DCNik0DkF/1kvPgsVcnlpW85S5Xc+vu9ktvB4xwVHvqxeEKrMKGLd4DJvQKjgrfwkUsXBQ68ZTRV60Ois+bbe+otvtuVxjJ9KBvTrl1ayRZGdw3uitkxVFIJgCPxzOJt6P3Gd6dAmtQnsaPfvQjYNOmTRdddNHKlSsvu+yy73//+37/4P+0fffdd999dzHe2LBhQ7Grx6NI2IIe8VFR0AFiMoAqpEtKCZtREFF9gnWI+tzYbJbToQBFIfFJxqlQKWXf9hyU+RnZ7QEUXxA7q0585xOiKHHPEhTRnGgYqBP0u2Fg59PVBXxAsac9s3MzdsecUDv5mn1Ai7cASIoFuKNBwDtzBhDYa38gsPehQGjBAcCa9h5gRzILxAs6tlO5S5GAoFMCaj0K0BJwAbPCfmBGTRAIqBJQ6Oumvx3Sic36CFMxIS0SxInb5wEcIsewfMpBwBn0AN5gurKmM+SpPCt84cV+hFtVuSdRkbC5Kz2fww7dE9RRWfSm6YAy0K5MPBbzVIR0skzFsj/ZB2iJHuxuRAHZ7QWK/hB2Ux6SJC678KAqtG8G8ju3AaW+XmwCbKDcTTBMYgCqomArqwSEG5aIgMxrJlAwTGwqUXyQBZ0KtvVXulAE/Kqr8p4xNQ3QCyVAyxiAZRQBPS341GTl3TipBZZkmtXOZ1nW+9DZeRJvR9a6jZIkTTCuxDd7hhytKtx3OEiS5B7eKMG91xAeEJZhJG65u+7UTwjKVkCWlRFq6tTG1enNq1sHcE6lrg4jlwudfNxYB5y4816tN9Hy1XE6lA5C9q11+Q3r9K2bHLPnRU8eIjDA1dhkDp8D5InWOKNvb4E1DhTbdqRf+0/0w6cOmRjtamoFqb91dIxwR3aZmc1v2+IKjqLxl51uRXEAPp9vqsAaDu9OgTUoTwN49dVXjz322CVLlqxdu3bWrAkZpk1hClOoHlMi98m8HZmT0GmZa2t3qWMOh95lD6+96hojjZT6831GoTQoHkdyOLJtm/wz9tptdSu26pn2Z+5ruvASR7BfNR+/f7lzr5mSOraPldy/X8msfLX1a9fYZs4TRd/992ixGFiuYV6KUleHnukbrlsk39OnpBKTMpLJgpnP7/zfG2RFcU+bOaSFuqQoEhjZvOIf81SdHk9o2dwuS5JJh28UMZwkK3qpNNZjvUewadOmt95668ADDxw07z8IE/fmfHcKrEF5GqZpnn322SeccMLy5culMRbgfpdzRsgFdGYNbNJFeC0JXYEwWxIsgjCFShQ0wKsqQMClYvtdaYLPEF5EfV0MamSTZUBxC2ImjC3rKT/6AlQsoxwqIEkyEPC4sZvXBCOi57NAvq0LKMU6jWwKkJxOwN3QjE2ZiNu0IMyddU2AZ9p8wD9nEeBomA6s3tEFbI5ngM5sCZsycTskIOKWgVq3CrQE3MCMSACYWRcBtL5OIF22XEpCmZxTyk1qFuBwe7Gb4IS0KF8qYdt9OWsaAVdDK+BNJwHZ1Q1l1ZenSYx5LuBpmgF0JYUQrQTkdRPbXV2Ik4TNmG2brgPWQGWQLNMvd3MAkpCqiXeLEDAJozKh+sqkAD0drywXDYBGOoFNQCLJwiBei3cDWqIPMLIZbOGXeAlEFoe49QuBmng0yvZjgx9F+GNePGpiST+DJRR4otNQeLaVW6NtyyIoS6JMQ2QGmIBRKADirSLyNMGaLCusqQJrEm9HkuKQFMUqaZJz/N/pJcMa2Dc6VhQ7dhqFXOgjY6CRsi+tLq55q+Wybw7iP+rP+0zXvX/znP01xVX52LaSm17vW/mwGvC1fumKgZqh5MpnC92dzVdeNKbRJv/+cObJlc1f+nqVjprVYPoV3wZGoHPkvh7/KUcPt7lnwRzzPVY6pF54LrrgQDOXVPzDNhGrPi/GsMr9kWBavqZdGkWdNTVqyTnyRpahqVU74793UCwWzz777Pvuu8/tdhcKhe9+97s//OEPh1xzgmZ4Au8JDdazzz67cePGU0899dZbbx24/Pzzz/d43utWrVOYwh6Nd9JodI/ABG9HsqJovfFxBx4DRj6nBMZZbViGEVv+Z88Be8tVm1xr3X29t97deO5ndnfl9s6Zn46EN/z+uuhe+xeyOZfXHd+4Bln27r84evIuc1Wlzvb4I/+s/cL5Y6Kvsk/8O/34v5s+96W3ZUpumOqq2Nme2rG9da9h05dLmia1b+DIYyZ/SONFbt2aYleHqevN5gnDraMXS2YuL7K6x4T8a+vy7e0D2wW1vl7LGOUbgp5Lm+a46rl3Fddee+0TTzzx/PPPH3bYYbfffvtFF1108MEHn3baabuvWTHDmzNnztq1a0855ZRPf/rTzzzzzJgO954osNatWwf8z//8z6Dlp5xyyqh3NI+q7F0XwtZXNfhEG52J3RslpEg+VQKEc7cqS9gtbA5FBjxOJ5Dv68BOLRS6HEHtSEiA4g8CcqgWm1LyNk0HUgUd6C0Usdkpp6IAAbcTCHk92O2Bwj5KSIWEksYo5ITmSST3qaFaAElQZV5ADUcBV8M0wNc6C9gRSwGbt7RjW3z1FXSgoJuVUxNCnwafE2gN+YBZtSHAjw5kN6wGCp3bsckbW32lAo5yGIIFKC4P4Kmpww7X03QD8ARClYvgSc+BMvvlrK3HpmRcjdMA314HAs6mGcDWLe1AZ6YIZDQDcCly5YUTd0OxrWCblDLPBLaflojkc4RqsVk04TUv4iCFHqs8yyBYMXOABb9obhzI8SpKOfoQsIkxkVbmMAW3JANquKbyQogXSBiPZYslbC5KF5yT6BZEwmaqVKX/Fi9kZy6HVDnxsn6rzJMNOHGPE1C9GiA7ZGwWTXyrFu5ck0dgTTFYgzGR2xEQmjNH6+yeSIFlarp7xszxbdt9xy3OxtrQZ86scn29uy/xi9/XfeQ038J9hlyh4XNfym/ZpMdj+oa1rgXzo4sP9M5fMGid/Lat3XfcUnvhWZ59Bz81LCwrcfvfcqvXtX7lSsekWnqOit67/+A/6tARdHKB449M3vynd3JIo6L50q9imno66Rie2lRUtfqqepcN3a7QIbv0ijqi9ebWUSwYCn1doZnDFqnvTRiGcdttt33hC19YsmQJ8NnPfvb222//3e9+t3uBNUEzvAreEz5Yl1xyiTUUGhtHamCZwhSmMHGIAqvKnw9CgTXB21EmFs88/vy4j27m8nq+ML5muvTLK3Pbt/o/dVqVSmdL07t+8mt1+uzg4UtHWM0za05g8SGNn7wgcMBBu1dXxfad3Xfc4l68t+fgoZvyhoBpJn//l/yajS1fvfodrq4yL7+g53Phs0YymnK2NhYS8fzG9WPdeX7r5vTqV7ruuLX3X//sWv7n7Pq1wsVmciDLI1RXgJbPl7/GjRGlNRssaZdKwBEMFOOj9LHGXnkik0yO43DvIrZt29bR0THQ4u6EE054/vkh/lsny5vzPcFgTQR6NrOwKYrNGMWyBSCr6UBJNwHdEk1wYH/ndzuE+soJ+F1O7L4w4XelxXqwNVhCoyM5XYDiC2C3xXkapgHbYhlgazwFxPP9ZlERtwo0B33YcXgOLGwtlzgWpoFoxHB5sdkjYYkkVFDOYARQAiGgI54G3iizVnmgK1sCkkUD0EV/nyJjhzC2BtzAzJoAMKcuApS6dwLJHW8BhZ2bsSk64YouZu5ljxdwloqA7HTS7xQfwg7R0wYQNq6aeirsl9MFGDnRC+kG3I3TgeD8/YDX2rqBjbEMsDMj+CQAv2oAJd2g4rzl8WHL2oQSS6QiuupbAXfLHMDbMgvQnB4gnsoCbtUBBGrqAKOQxe4fLHNXxTyA4qjsXzxKDlWsIDn7lXPiIoisScFpOUI1gLtpRv8wauqAnr4kdhiiKRony92sCuBRZeyWSeFHJhjTgMuB3bsq3rFWVqu8ARz+AOCqjQCyQwGEQZEaDmM3mVqlceaQDAfLwhpDF+HkHvx9iMiyk/Mrnxj35qWObn/TSM7pwyHz5huJxx5uvObLSrC6SSLDSP72T57G5ujpZ4/jcALJ55+JPfpA9PPneA4cmgDbHaamJX79x1JnX8vlVw/sWHwHkFv7RnzFg/XfvGSULEJJ8h+2OL/6P565u6v7h4Cl670P3Cv1dGQ6O0L7LLRCLimsmLFU8aWnuv70+/CcOWZtg3/Rfu4Zk+8OvwtMcxwMlmWapZ5Y/flHDFwYPPTI1JOPFeM9rsjQ3ayF3g4tHWv+6ttuWja56OzsBAYK2xsbG/v6+nRdd+zaYFGlGd6o2OMLrClMYQoTglX2hq1y5SmMDO+suV1/ui043uTd4oYt43ARN/P57rtuD5/1EbW52g+A5PKHim3dzZdfNb5Pfcsw4v9cnnpjdd3ln3UPr2fabaBm8qY79d5Uy1eumqyewSqhJ+Ldf73Tc+j+1Vwi/0lHd/7g58EPfXRgj+TusHS99/7lxbfWmVjh809vPWBvJGlgeRvQtPybG9P/eDT32it6oeBvaNCKxUDrtGxXl6epKd/V5Z09Nx+PBfY/yNnQNNBObMwwTcuyRg2x3h3Zl16Tnc5BjKkky87Gpp5n72392MW7b1Lo7Wh74BbPgr3fGdOykfH000+7d9Xaf/e73/3ud7875MqJRAIIBPpfokAgYFlWPB4X7cNDYgQzvFGxxxdYplY0Ej3ANK8PmBGqoWLjJMnYRuTCcyhb1ADNFK12wlhcBYxCBpuvMvJpbApEkB8O0bwm4vkCESBZ0oGNvQlgXV8WiBUMbA6j2a9iK7GEw1ZYzPeXW+EcgOzyArLqFB5RtptUuDLIzmwe6NneBXRnBGtVBHrzOnY7pKBGPA4JCLkUoMnvwuauRPperm0zkNu2Hpu7KnbtAEQWh5EXPlIS4NA1bO2XMIjSxWMuA3hCtdgeV7roVfQFADPahK3WMg0dOyzP29gKrO/sA9b3poBtqRLQmzMrF0roxoSMSbjGC5WVs64Z22ZM8HnulllAYM4ioDuvA229vZVtfU4VaAn7gfrm/lxS2e0DLK3Y//L5gpVH2ekSIi1xmkLbpKfEZclCWcglaDxXXQvgbmgFErkCds6gIPNUWQZUp4yt6nMM0PkJXlMoroSRfTlFQFWAbKmETfupkXrAY5qAK5qrDFsN9V8WwbdNMqbKpsmD5HRGFu2TWflq8IQjx7G5pWmumUP4VI2MxP1/qzn+SP8JI830DURx07bUkyunffXqcXwkA7m31qcff0jXCs0/ukoeiy9A/Dd/LrZ3t1x+9TtcXZU62/v+8sfIJ072HTeSMX0FakM0ctKxqYfvrzn7U0OuIFgrbeM6pSYYufR819wh4pABSVW9+y/07r8QMDJZM5UpbtmB1+PsbJDqatX2iOHzWukebe1/uv+6LtDSYoRqak88xREaqaobGpI0PnpZe+qFyEkf2315/acu6rr5Fzse+F3zsk9WekhLqVji9Wdja17wL9qv9oxzxnG4ScfSpUsffPDBgUsGclGDLO5OPfVUIJ1OV1ZIJpOSJIXDQ3tSjGqGNyr2+AJrClOYwoRgSpJRNYdR9WTiBxlWtLH4/H8YV4Glt3WYjrE1guW3bEq/tb754muq3cCykrcvDx221BEZPmlu+G1Tzz3V869/1pz10dpl1dZzAplHnils3t5y+TvNXWnxWMetv3bObK2yuhLwnnR029eulZ58NHLshwYut3Q99tjDxTWrdV2LXHSOZ3hD10FQ/D7F77P5swEuZSccCfhNs7BhS+KOv7f98ieuuobaT5zrrBvLbJQkSQ7FHCNvmlrxbGZbW/SC/YfYn8MR+fg5fX/90/rf/dAdCKoeXyEV1/I5RzDU/OVvqON457w9kGXZPbxbxCCLu0KhgD1RKNDZ2VlXVzekUeqkeHPu8QWWJCtCO1XsacfmnCzDpCIkCkSA2mgjUOsPYTMQQjejlFWBwoVIrjxKcn9TW1mD5fFjN6+1pbJAW7oAbE/rQKpgAV4ngE+VsckV4ZaE1G/dJJQ0ZX2PL+gMRYCCAbAzngYS+WL/Y6GEbdyVFZZIloVNkHhksLmrRn9/z+D0mhBQ6N4JFDq2AqXuNkCLdWNn9gnTcEHSiOY1oQATVIqk9L/hhI+UJPoEHQqVtjtZwe7jEwoqsURyeYCtvQlgWzwNtGdKQLxgAkUdQJGtyn4ECSSa8pyROqDc3GeagDNcB/inzwHWdfQC63uSQHumWNk24nYAOU0HDDMItEyfB5Rq6qHskiV0VxoSEM/mgXxJl2UnEIiGgNqZewHFRC+gpZPYEi7xejkFged0A+lUFpsHFS+EWo5TVLDpNK8wNlMVKjo8WcYOc9SLOaAoDPRLBUD2+LBNxexmUrAN6Af6rpVz4qR1TBIkC6nqSSlpiuuqApGjjtvxwrN6X8JRO+boYrWuVtLHQlKaZs9dtwfPPFlyjWJcVEH60WdUt7fmw2POacmufSPxr/td0XDztV9XG8fWJpl57uXE/StaLvtmOXzznULqlRdTjz8c/vhJvmMOH9OGssvZcPUXM3f8va9zp2vv/dVoXaljZ+7N10vtO9RIyH/+qd7qWyarOp7sXjCn8bpvmtlc8u//6r7tZsUfiJx6lrtlWpU7CM+eW1i7yXvwvqOvCkBu1Zrcw081nHehNIx/pqu5tfmrVxmpZKmnxzQ0v8frbp3+9srIJhuDLO4sy5o1a9aKFStOPvlksWTFihVHHz2EI9pEzPAGYo8vsKYwhSlMCJYlTRlhTSpym94yda24dfs4Ciw9l5diserXT69+RVIdgaXV5ivrsUTsnoebPvW5sX1SWlb8kQeSLz7nPfzA8Hmnj/VT1ippqeUPh4445h1mPjKvvtR3//LACUeNtboScM1sdV59ad8Nt2cf/odZKqmhoDp/VvSTn1db3sb2dtnnjXzqDPOsj/b97586f3eTf58DoqedOWQ8ziAY/lDxoSc8ixcNVzANRPrpFxN33Vd76ie880YpE5VgyDOiEG0PgiRJl1xyyXXXXXfGGWccfvjhv//975977rkVK1aIZ3/7298+/vjjt99+u8vlmixvzj2+wHJ4/YI4Ea7rpb5ObAWV6MxSBSmilQDvtDnYaYDZQgnIlTQg4g8CDmG2FIgAZl44ehepeLUHI4ArGAYSfR3YTXx5zcKmUhRJBjwOGfA5HYBPdCkWc9i2TIIcEp5+zlAkp1tAXzYPpPJFIFsS4p5+gkTsSjiee1UZuwtPKJnComkx4AFaQn7AoRWArOCrUnHAEJ10EoDi8VLhnFQVm5wTJygul/DlEvIjwW9ZZQarP6NQMFBlKs6hAiYS0JfJAX3ZAjb3JrRWAk4FwKtKlQslOMSipgPBSBSbNBK6rpLDCfxnWwfwWlcS2BArAn35/kzDOq+BHQUoVGL5ko4dB6kZEhBLxoCOdA7ozhaBdMkQGqkajwq0BjzAtEgAaGicAajiNmWZlfdSOl+snLjLoQBORcZusQx6nEDY6wEsrYAtXzNTBUDTNaAoTOrFo6ZhE4TlYEdbHIYtQRMGYE5h9yUplVOGx5gkyBZK1QyWPFVfjYjC1k09t91c6Gqv+/rnLV2P/fUBDEP2uGW/N3DskmoET4FlS+M3/KHa41lWbuXTofOrrnhMM3Xr3fUnftQ7f2G1h4DEc0+VVr9cLOQbr73CUTPmkhFI/fWB4F4LwyecNI5tx4dSV2fs/r8ZqXjj976qNo4/2FFS1egVn5/EgVUJ2eWsu+xCvbsv9qs/9Pz+18GTTnW1Th95k7ozzu6745a+G26LfuXCEQqy/Jtv5R560kxkoqedFTjw4AmO0zKMsToXvLu46qqrtm7deswxxyiKIsvyr371q+OPP1489eKLL95999233HKLy+WaoBleBXt8W/RfaAAAIABJREFUgTWFKUxhIpAs5KkpwkmC5TCVxXtHF35Mba7v+sEvJEtxtkyjszuzfWvqH4/6Fu8bPu+0kVN0nC2NpUw6ufK50OGjS7iya98opVO1+1U3V2VZPdf/1kxm6qv2KDdy2fSD98beWF33xU/XjHdGrLi1LfnMi9O/OXRj16RDaKTSLz7v3XdBzVfOlwPvfqfbcDASKT2eKKzb7JzeLCmye685gwplR31t/fe/lvjrAzv/98ZpX/vWKPyfJAU/9on2m37e+4NfqoftHzj+SHngrLFlFd7akn/s+eyaDe7pMxq/eMW4lXB6Mp7fvLG4fq3W01GIJ+5sHYPx5rsOWZZvvvnmn/3sZ5s2bdp7771dA4xCbrnllltuuUX8fskll1xyySUTP9weX2AVLEkYMpViXdickyHC9crm4A7AiNRj0zBFzQQS+QIgFSQoq4GCjdOoeCBJYBM/Dl8IWwyULQnb9P6a3aMKYkn0DzqAGSEPMD0SANyWDhQSvZW9CZGToIVQHMK+bKCdktvhADyqA7sBTbAymiGC7YS0SxBmEjZPU+f3ArUBH5Dr3I7dCmeVDbdcgBqKAmqk3yle8Yewe/eEvGxgtKLD7cOWskllJzoL7Ow/oz/8URA8wiWrVPbKMiuX0e2QgYi7/8M57FaAqEfFFi2Jc5RUN6CGXdhM2KauHuD17hTwencRaEsIzRaAWxXDMQG/UwN8aqH/+sgSkCxowI50AdiU0ICOpAlkiuW0yjp/CZhbUwT2FlGJJR1oDPkBv8eJ7aBWZqrcbsCrGtgplh6nCjhF6mW8B9tTTc+mqOgCRdiiOM0B70zxfnB4g9iu8e7aBqAnnQM6U1kg0dVeOamQcM+aNCN3JAul6inCqQJrZLj2ml1pHgx/6ozEb/5c+5HTxSdZsX1n7vknOr/zM+/xR4ROHikosPazZ2f+9nBg8SHiX29YmGbs/uX+05ZVRV9ZVvJ3fyFXbP7SN6qkuxJProg/tSJywtJpF1871vzmgcjdtyJ0yJKR/Q6qh2UYRiZj5rNmoWhJYFqKz2fpJS0R13t6tbat+W1bvDNaaj53tvfAscVdv2Mo7ehI3v+Imsqmd7SHZrdo2by6bUts/XZFUeRIKHj2Ke55AyTVkhQ++xS1rrb3D7+NfvpitWakakYN18y45gfp117JPPVY+0NPqn6fp7VZy2QVSc5sb3OHw3Jt3fQr/0seVwBdoW17+uWVxs7thb4+T3ODY78FvmP2jy6cd8FnPnPdD34wjh2+iwgGgwceeOA7cKA9vsCawhSmMBHIlqUY1dZN8pQGq2q4Zk83DL33nrvrzj4fcDW3uM78FE89lnxwRfDEo0eYLvQetG/mwSeS9y+PfOLcEfafeunfKHLgqENHHYml6T0/u9lIpFsuv0oauWgTMM3uO24pdLaPzeNqKGjtXdkNm2dcc+H4NrcMo9i+M79xvdHVYSZj+b4+vVBwOJ0Or1tSHJIsW5ZpljRZUUwsyeV0HbJ/7WnHuGaPMpv2LiK/blP8N3c4myK1n1s2be9pkj3l3whaT7Lj1kf7brw9ePqJgeN2cf70Hbckv3pt8unHqnGFDey3OLDfYrNYzG1cb+m6FOtzz5gZ9PqdjeMxsMU0s+vXZp5+NNfZ4Z0/x/3hpbWHHCAMkKcwKvb4AqsrnSuoHmzZkBbrAoxsCuyUtzJP4AJUjw+IJXqx5Ti6IegQDZgVDQGB6XOxaRuh5RJ2SiJoL14oUjEid8rYrJVIOZwd9gGLGmuAiGwAma0bsfVhQnvoKPeISYBmmILpkQdwUV5VrfzudqrYTIxgsAolDciLjjnDxG5SC3nc2GGIdj6DRcVgKVhLxQsqGKlcLne0CTBdHiAheusEl1a0AIdeADyq0DM5Aa+QlBk6lT5EqJyaIGbkcgyfDPidDqDeawFBlwI45X7dWKPfA9T6PNjCOMF+ZQpFoC2eBjbFMsCGWAnYkbCA3jSUSTQU2T7PXXsSMyUdKBom0JYuAuv6NOCtLgvY0SsD2bzkVC2gqcYENEMD/GoB22m9LuDFLinEhRW/+xQHUP5Ob5rY9vEFYRuWSVZecWFtbxQL2K2R5csldHhuDyC7PNgaLE+0EdjSEwfW9ySAjfEc0J0zKu+6eq9SPttJorDeGQYrlUq98MILoVDo4IMPlqsQ4b4/UPfNL/T89KZSd6ezviyLjhxzgrllQ+a5lwNHHzbShldd2vGd6/W776g7Z2gfJq23J/nEv2q/cfGodJQeT6b+9y6H6mn62mUjBPD1wzT7/vJHPZNs+tGV1XcmDofsA4/XHHN8VccdAD2djj/zGB1t2fadDo/HO2+W1RT0HH9QIBpx1NdWI+J+byLz/MvxO++dcc1Z/sVDWJ2pdaHp3zqzsKVr8zW3Y5qBXV3NfMuOzNz94O5bDQfZ5fIvqjq8aBgknnsq9+JzpmX6T/tQzUH7jjy7PYXdsccXWFOYwhQmAsmy5KrTnqVxMVjXX3/9t771LVVVi8XiYYcd9vDDDw/n7Pc+g9oYdS2YnXr0gej5F1UWWtHG0uq1jFhgSS5nw//5Wtf3/7/0E48Ejjtx0LNmsdB5283O2dOco7Wzad29XT+8wTtrdv35F1U5M9h37935zraG73994p+mlq6nXl0z7asfrX6TQtv2zOMPpzdvcjXVuw7er+myTykB3wSH8d5B4bHn6889esjqqgL3rIbpV39ix8/uCRx3xECtuuz357pHyQecROjpVOwvf8i274x+4XzPPlVFBk1hd+zxBVZntri+KwYc1DoL0JJ9gKWLXi0N21VIPMayeaArkwd2pgrYJEe6pGMTMHPrwoCvdTagZUS4nhM7izDXm8AWP9W6VaDeK2GTMXs11gJqqhdIblkLlHrbsfU3ws1IOBvZWqbyB5toSROsVa3fBxSTfYAeTwIlXccm4Xz+EBAJh7ClQkK5JRggvZTD3nuZJhG5e0JrFaoBPE0zgKykAqt6EsD2ZCfQl++3Jvc6ZKDW6wSaAh6gKejHZssEkSNa4cRdW3hWybID28rcqzqAGo8L8Dgc9or4VAcQ8bqAGp8XCHld2LxXWWemG0CyWAL6CjqQLFhAUQM7n9ztAqjxATQGZKDF7wTqvE5s06livoTtet+TtoC2XhnQ2mWgPpvPuVxAOzJQHzSBvN7fvBn0uoFCbwdQSsYqr2OZrnOo2Pyo4EpNvQSYgq8yjcrFKX/htpTKmmVjlfJ+HNiSONFG2p7KAhtiOWBNjxCNWYBhAtT6DWD/yaOw3u4C6+677/7Od77zpz/96cwzz3zxxRdPPPHEa6655qabbhrrfvZQRC48q/Oan6ZXvxLYf7FY4giFFUdp1A2VgK/h+1/vuvbn+a2bQh8+1dXUIpbnt25O/nO5d9G80PmnjbyHzPP/ydzzr5oPfTRYhV6+vMkbqzNr32j676smhatIP7nS6fOpkapE0PltW1KP/rPY2xP86HEtXzxnfEFD73E45800sqPHP/sPnONrqs2uetO3eICHUy4XmjG0X/wkw7J671uefePV8IeOilz5+Xd4NjDicswOVuuUFne91wuY9/r4pjCFKbytkCxLrjqMcBwF1g033HDBBRecc845wJIlS2644YY1a9aMdSd7LmSX07lgTvKRB/z77C90V3oqKaKoRoUS8DX9+OrEnX/v+O0Nwf0OtLw+OZWIv77af8RBoQs+MfK2hbe2xP6wvPYjp1dfXVmalnj4Pv+Hj52s4kbfsMVVnR9E6uUX+h74u/+oQ5quvnh86T17BmojsfseqTtjieIfpYaQ64KFN98aWGAV39piSBOaG7V0vdi2XVIcRrHgbGh0+Py7uznkNqzNPPloMZ2sufjcd4W4SnWndpR2VrtyIvW2Dmbi2OMLrN6cuaEvjW0BFWmeCXabW6mAzV25auqA9kQWiOVLQKzQL9MRJJDfWeD/b+++4+OqzoSP/+6UO300M+rFtmSDjGUb29gYmxhwYiAEFtNDCcuaFEI6CWEdsrxZsiTvkuwGUgmw1A0hJIRQXzqmGAOmuvcuW1aXpvd73z+O7kjYsppHCEnn+/FHcUbjmTNzh6uj5z4FPLYoUOn3Aq6iMkDTNYz234l0FrCYFaDQaQP8DhswpdgP6K0HgNDWj4D4vu1AJtwBmKw2gFIdUIvKMKIa6awmnlpkLHkddiDR3gwkGuvJBeS0LEa3Kq2wlFwXdYcLo4OUCIaZRKzIYs39HVG0aHcCtsIyIGZSgbX7W4CPmoLA1rYM0B7t/tnpdypAtS+NUbwmqhq9DhvgspjJhWF6BGm0Hj99Rc93UfLmc4hCSwvgc9oBt80KpMKdQKK5DSMUJPrai38rwoRmBUD8ouJ1AIhTk1jhZL8ZqCt0AZMDHiDgtGNEwqydYYwcLLFY0UfeG08BaiKI7gWiGQdGfym3agaKXA4g09kKxPbtAFLtjeTGGpqtubdU5E7lJkt2fxUNwxxucl2venwV8UuRmCJysESUVBxKUanakcgCLREdaOwESKQUIJzQgV5mWwyVomsmEW8b2J0H9eBtbW2rVq1avnw5oGmayWRatmzZYFc42hVdc0Xoroc7nnkscN4XAUVRzOUDbYOuWC3+ZZfYT5iRbmpJr9+mTj+26svnmRz9/HiOfbAu+PBT5cuucUw+duDrbP37n13Tpni+sPiI99D1yLtr3PNnD/BqoymetNf1n4Mfevet4KsvBq6+xDXvaHOGjoYWjUXe+Si1dpMVJd7U6qiu0or9BWcvMTnz1nree8Yp2u765vteLv9uP230LSim6qqPLW/zTvdnTh/a80Y2rIm+9UaipcmkqjavOxWO6tlsKhJ1FAYUs8VRWp5OJMwmJXpgv8Vht0ybUn7FtX0c4o4nXlT21sfrD6Lr3lnTPpr9uaGtajwY9RssSZKOhqLryiA2WHoikdizZ0/PG30+35Fyqg4cOACEw+FFixa9//77fr//yiuvvOWWW/oYHzYmOS/+QsNN/+0/92LFZNJTKa1+EL3aAcfx0xxM44xeZnocTovGWu/5a+Hn/2lQu6vE3t3hLZsqf9nXQMPI66uDj78Qf2aFZUat/9JeJgQfItXW7ujvAlM2Hmt//unCa65wDLCb1zBI7alPvrOmc+W7VpfLUXe8rXqyw2rNdLR3rnghuXqt+5zPuU+dP5Be6gPhvujsplt+ba+b4D/9iL8l6Vmtc9M+37zu7vzpxpbo/oaiyQOde5iTjUY6n/p7ZOd224ypZd+7qmdCm57JpBtb0w1N2WiMjk5TZZnPvdAxvbbvB0zu2R99ZWXh+QtKv3WGohDZtM9sHq01B5+AUb/BiqW6QhT7O8NAeU0FuW5Y8ShGO3KsKpBIhwBN624Cbu5R+CZaOokZc/GUqPnSgXRGAyKJFEZ6UFcDKtFCvcANmKKdQGjnRiC2cyMQb9iLkZFjLehukq6YRM6NA4hGkyIk5lJNGHGsZCQIpMVQvM7W3CsVv1Do2SLAZLVizO+LJdNAymoG/C4nkOrqINfdQ0sQYZVwIgkcjMSBHR0ZYEeTqM5Tcm9LsVcHLOYsUOJMAZWpDEanK5NdBTQRqjGbMZqMxxLJ3FskntZu7W5nX+h2AulQOxA+2IRRatc18s/myP09UFIB+EM2oMSpYsxh9NlFfpgCTPSqwLTiAmBaeSFgjoeBTLQDo4+Xt7wIY57j9vY04HPpQFDkaWU8EYcD8Lg0oNCtABM8dmBikR/oWPMmENuzGWNCgJgHIIapdTUPC5QAasACmMQ8AJHu5nDlDlNXkWM6jVFRKGKrIpolopsmUZmog5FAZjF1/wYpmtHHUgqgRAHobo93tAYbwVqzZs3ixYt73njdddddd911vd5fzFX99re/vXz58p///OcfffTRTTfdFA6H77zzzqNb9ShjKfQ7igLJ/fvsE6sDZy/d/9+3xDdsHaZLMMF7/1p08qnekwe0GxP0TKbjyb8VfeVS85Hbcqb3N4aefKn8a9/OxmPND91nq61xzplxpDsLtuIiPdlPylH7M/+wVZaO1O5KT6WCf30m8u5az/FzJnz/xxavt+d3vfNPTtTvbXv0ocTbHxR8+VJradHAHzkbiig21XRYGaal0Ffyo28d/Plvs5F40fm9D/Bpe/Y9Z3mJc1Zd7pbIP14InLpkQC02etDS6dY/36fZTOW3Ljc5D+19pVgsalWZWjWIsT/ZUCR495+rvn++d0HXRzdQHpg1e/ZTTz41qIWNH6N+gyVJ0tHR0Qe6wQJ9wYIFzz///JG+vWLFijPP7Kp6W758+RlnnAHceOONN9xwA3DaaafF4/Gbbrrp9ttvH9TEibHAYk61NtsnVptUm1o5seO+R83fu1qdVJnfJ8m0tEW37ym68cuD+lftT/xNtyjOPq/QxbfvNtvtot+Ea/Kx8bVb+t1gpXWNpkZ3n9OHU/v2eL+09Ejf1ZIpPZ4w+7xHusPR0GLxpv/4raKYq763/Eh9UO0TJlVcd2PrX//U+B+/8Z55ivfszx2p52qmvTO8YpU1ngx+sEFLp9F1xWTKZtK+qcdkCn3+i76Qy2yzlhUXXntly//8JdsaKv3KGYdcjEvsbWn631cLLukuvUzVHwyv2xT44YWDe3mZTPtfH8xmUyXXfydf4bfElh2Kas7trqR+jfoNVlYjnNIxAhUdkTjg9voxEpXMqg0j/CMSifwOFciKyi9dtGiyAqUuB+Cz2wCbtTuync5mgYRoU57t7khkM5sxas3iu3cDyZYDQLLlIJBqawNE/MLi7p4xJ1qlJzQFaInERSWgiDNle0zT60rZEeMLLRaMGI8YThfXFKChMwTE0hnAY1MxWoqLF66lkxgtwfRMCkhHAoDTW4wRIMlkAeIpgEiiO4LldojQHbkX+3FK7o0Vaw7G4kAwlgRiadGyHIxcK6dqwWhrnmjaDySb9gOZUHvulYpkpq5sM7sDqPJ7cm+4R7XkDplIfRPFnt5MHIisWwUkDu4jl3jnKwLcx84CTqgsARoiSaAxlADWJzXgoNtld2jAMcU6UFtoBY4tKgBi+3dhZNHF63cAqbYWjGJJi9sDXVld4miKBmOqTzTKLwZaQlEgHEoCWU2McTQDXrsX8BeWAnoqkTtM4gzoUE2Azy7KIS1AwJUF2hx67mDlvweQrg38EiH95WCddNJJa9asEX8vLi7u7OwE5s/vTsSZO3eupml79+497rgRuyQ0IjKhiHNK1/WXsn+5Jrppfctt/2OfMz3wzxfmMa078vpq/6wTBjUFJbppQ3jLhopbf9T33byLF6Reeye89gPnlNrkgX3+C67q95HVmVPZ1k/CciYRV2t67wsaWvFW/MU3UpGod97xjtMXqVVD6pN5pOdtaev4w58KZs7xnn523yllislUfPm/uHfvTLy3quGG/+s8Ybpad6ytZoJisWSD4fDrb9vM1tB7axSTSQ0UMX1W6ZXzbeVVIsNST6diu3aEV65o+vfbrcdNLvrypV3/pU+fWnbz91t+eWdi0wH3mbMCZ8xWzCY9nW3628rQi2t8F37Bs3hhbgGRR54q+sJS8yBb4bc+81iyvaXk5uvyeMpQq6uiydE0eXDEjfoNliRJR0PRNUUf6Emz3yR3l8s1Y0Z3YMPv9xcWFq5fv/6007rm323evNlsNldXVw9psaNVcs9+Lav1DJO46mZisXY++3jDD37mOv44dc5025RJ5gLPUT6Rtnu/Nrmu//sZ9Ewm+MJTnjNOOfwS0qEUxTr/+Oa//0V1ubJaVp3Q/3ZHsanBrVv6nJ+Hlskopt73N8mVq71nzAycMWfX9fcplWX53WC1/vYBk93lPWOgPbocNVMcNVPUTeui69d0PvSExWZLhcPOkpJkJKLO/0zx5V92TKo+fKOmWFXX1DrX1LpUc9PBe37f8at7PFdfbCkKAGZfQdnP/zX4wuuN97/ceN9LZqslm84oilL48b5TsdVrko2txVeezGCkWpoi69eW3PD1IQ8c7JXFX5BJpjtfXe/7bJ9hSckw6jdYVjMWExiBlq7G6D2iuNl0CjAn40B5gRsjeFPqTmNkX3nsKuB3OTCaUYk25aauzK3u4XoiwUiEUrJ697g9LZ0C9FQSIwNMVDKaVCtgcboxYhv20kpgR1sQ2NMRSWU1IKWJNKA44HR5yEV0euQnqcUVgDVQCmw70Azs64wC4hFKXDbA77QDTtF8PBrCSB7qasWkmDDCJxO8TqDMEwcOuLNAIt39ckS9nqj+89utgNemYuRUCeInrWjdJAbntcWSGL3gRT6ZuevUqQDZRAxIB9tzq0p3tGC0KxM1kiJ6J9KS3BOPBaaWFgIVBSmMbmGiC3x41yagdcuHQHTnRiDZ1ABomSxgKy7BGEkZWPh5YGFVIdCRaALMpgzQHtFcdoDjSk3A7FIPcExpAGh5+wMgcXAvkGxuBNLBICAiDSKzSsToRKN8taAQMPuKgM0HW4HdHWGgJZrCqFR1WEy5wzShwAVMCHiBArcXyCaTgMtuA0q9TqA6lgBaYxmMhmdWs4i5AtB/H6WBG9wlwkE9tKqqX/nKV376059OmTLllFNOefPNN2+55ZZly5aNtyT36OMv+D975iE/gF21x7lqb4zv2pHYuzvy2AsdkUg2lbJ5PZlkSlHIJpMmq1XLZD3H1ChTqwvOWjyQUIQCalHxwBfW+uhD9skTvOcOqDyt4Jwlns8tMjkGmgDonDMj+Pfn+r6Pq7QstfeAva6XfHzHaQvTG9a3tIadNRO9Z5wywCcdiMjbH5qyevnV3xjsP3TVHe+qG0qpo1pSOunG/wi/8+bBn9xWsPR071mLARSl4KzFBWct1tPp5K562+SJh1x/TO7c0/rg3yuv+e6gYpx6KtX68P3+L56jTqwYwlL7oFitxf96bdN/3Zk80Fb6pdMGWEw6no36DZYkSUdF1xhwBKvfS4SHu+WWWxobG8855xyxe77yyitvv/32wT7IqBZ6ZVV8d33hhf/S63cdk49xTD7G/9kzgGw8qsXigMlmUyxWdF1LpyIb1wVfeIHWzoKr+s/CySYS2URigAvrqhz82Q0DfikMfHcFmD0uPZPRknHxK2LvnK7Ymo29brDsM6a2vPCatvNg8fe/OvAnHYjka+/YZ83Lb3Snp2w4HNux1VpUbHa5u8czK4pn4SmmQGHbPx7JHmjyLbs4t21SrNbDZz5mOoKddz/inXOirWJwiXrBlSvS8Zhr0Ym9flfPZvVUamjzngFrWbHjsycHX343+NIae4mfTPbPwUEUq443o36D5bJRaDdjjL0TIZZsIgJkomGMAImoKLS6vUClywOYfC6MSFUmFgEyTS1AKJ3EiF2pIuakOjCCKyITS8Qk7JY0RhGf6MRtsou5ci7A4klgBKLUkgrAXjEZ6MwowJaWTmBbR1yM2U1msxh9z+vKi4F0qLuBlmgi76qsAbY2tQGbWoLA3lASI71MQweqU2nAkUljZDglm+oxSti0RBywuLzAtOo6oD4UA0KJKOBQ9dyjlRcowNSACtT4XUC5zw3YLQqQTScBzWTBqElsiSaAxoiYZqgBDqsJUE0mjE70dtGcLBkHstEgkAl1YCQhibV1hYhsDozMM1ugBAhY1dwr6tiyG4juWAeEt6wFwtt2AdHGOLncr7Imctld7gKgbtHZGNG1Alsn0BTNuKwm4LhCJzC7oggI790OJJv3A5lgO5BNxMm1qrepGCli4mFFFaGjbAKwvbkdWNfYAWxsjQMNYQ1IpAGcKkBVQQpjVKII7znUACB6qacjQaDC780tNSqip7o4QBqQTOsATeSPpgwigjXoDZaqqg8++ODvfve77du3T5482e/3D/YRRjU9k4k+97r/rHPNA/iRZna4xOiFHJPD4Vt4infOvOZ7fh98/PmCC87q+xHUiZXp9raBLExLJNoee7jomsvNhcM4tshW4M10dqqlR3zt9mnHh15/kSvOP/xbliJ/+X/2kxk2BNlgKN7QVPzP1+b9kRP1e6PvvxNet8ZsVc2qanN7wk0HncUlWkFB6cVfUmw2wDW1zv695U33/bHtZ39wXXimY2bvmYiJLTva7vxzYPGZnsFUgwLJxoOh1atKfvytQ8JLyV37os+9Gtu6U0tnAFdFSdZuL/ru1SbboAuSff+0hH9akti6K9PWoU6suPCii/77l78c7IOME6N+gyVJ0lHRNbRhjGAJXq937ty5Q/u3o1rk6RVmp8s7r/eC/AEy2R2+Cy47eM/vXaeeZCnsa4eadTmUvfUDeczOZ58wFbj7rQQ8WmZTJhRSS4+YPuWeObvt/z2uxRP9dk/Nl/imHfbCQlFylEfRdR81PfYXb/W0mi9+z16Y632gRw/sPvDCn5rvvSPwxSutRcWA2emq+PYP2195vuWOP/lPnmf73MKeMyWz4Uj4yZei7693TJ0+2N0VEH7hKfuMWmvJx8YThZ56Mfj8676Tp03+xdX2iUW6pkc37Wu88/nInx73fuXSoV3py4Xcxtvl/kEZ9Rssv91U5bEBJW4H4LFZgUhjK5DuaMKIQIgkpJRqx6j5EkTRmYhvieCKopgwqsPEJ89eORkj9yWWzgKRdBYjf6stEgcq/KKCrARQC0sxYmAWrx9wTDgGcNdMBVbtaQLWt8aA3R3ZrviTDlDiigGVfg/gCJQCGbsTsHr9QEs0CexsCwFb2xNAQ0iUpwEU2NIYNXciXiXiQ6mWg0AmGsXIgjK7vUCgtBKYWerHiDkVOVMYVYQTPCpQV1IATCsrAkzxEBDviGCEcER4r2tuYCIFNMfSQDSlAW7VBLjVFEYKkaNrbJ+GkVvW9eYnE9AVespEQoC5sxVIWW0YjcTEgRAhpcSBnUB01xYgsnM30L4rDnR0iscHSCcSgMW1G1AD6zAS4E6cswij23tbLCGSuib4PIA7EwNCDXvoLm/MAmabDaPTutVTANhKKgF72STAUVkDtCYywNaWILCuJQ5sbtKAgx0AibQCuO06EE1lAaf15w4vAAAgAElEQVQlAZS5E8CEdAZQ0ymMtDnxhkwuLsZoSS+ipy5rAoikNMhrBEsfTA7WkIY9j1uh51+Lrny34ts/PPqHsldOcFZUhV9+s+8On57Pndz0098UaVrfCVvhdR8F16+p/EX+40OHsLicep+TLk12u7emJvreGs+pR7UHHbjEhxsslb3XLQ6Rph3446/N6fSUS6+zFx2S9qS4KifXfvnfOze8s//3/+07/Qv+RYvFNwJLzvKdfFrk3Teb/u8fbAVeVIu7siK4fZeeSlv9gcpv/sDiG3Sst/3VF6MH6iu+f1P3Tbrefsf/KqHOY/9wrVra9YCKWXHPrJ5y+1frb/xTy233FF//tSG+cKk/o36DJUnS0dH04bxEOG5lWttDz77mnrfA7D7a2kBBra3L7NvW930sAZ/Zbovt2ek8cht3PZsNv/ys99wlJrfrSPfJFy2dEb9H9XUfX6G2bQ+D3GDpmhb7aGOmtd1kt1lKihzTBtrlXGtqM9VNGNRz9S26fasWCtZcsdzsOOIMR9+MBYrdfnDFo/aqiY7qrtiPyeHwnnaG97Qz0q0tkY3rTEXFvknHuWfMHlpyWDYei7zzZsGl5/Yczxx66qX4jt21//Mds/PQiJ2iWnyXntx4xxF72unpdKa1w1zgMdltw9AeZlwY9RusgN06yefGCPzEWxsxitRSrY1ANh6Brt+8xZC+rs9Kz5QgkWcjSvZUW+7vYo6h6KwtqghFTkxHIg1kNB0ojMSA6poKwFZcCWQiQYyO3uIRHBNrgYPhBLC5NQJsb80CBzpRzQAONQu0xpJAMJYAvD4vRuBNdRcA7Q0tQHMsBbRENaA9pmMk98TSGkZXKi0rMq5iQDocBtKhEHQlWKVaGoB4Yz1QUzsHCCVSQMCRAGxmEzDB5wamlhcB0fpdQKy1ASCbASwFRYDVXYARxhOVjCJ2FUppGG3xRcAvmckAigi1mczQVc8ovipiWaL7l5bFKMkUYUWjSjOLMZlR1CGKWFcmlgYyKQXIaLmHIZlQgGRHFEg07gdiuzZh5LRVVU0GJhcWa5kMkOpoBSKNe4F018zBNGByOAHV2p131VUHWlkDuGqmA6ZAGbBjbyOwrSMO7GnXgP1tAE0dZiCbBoi5dMBt14BgUsu9aSaTKfdiu9r3KyaMBLIpxaUYswfsFjMQTmWA/eSvfkdGsIZBpiPYdtu9RWee454/uAL7PjgnH9O+/v3+7/bZhbG33+hjg9X+9GP2SRVdhWzDzGSx9JXhDoDzuBnRlS8M/DGzoXD7XQ8n9zXYAwGrP5BJpcIHG2JlRepJczyL+9+lZcJh79z+JyQOXPztN4rmndHH7kooOGa2WXXuu/+u0suuck6b3vNb1qJi/2lLjnIZ7Y8+5F14gnvhCd0LW781+vo7U27/6uG7K0Et9Zt628xlWto7//5sevseXdM0LYuuu+tqqSrz/dMSWTk4KKN+gyVJ0tHQdU0fcA6WPtQcrHEl097Z+os7TQ53HndXgGJ3pCPRfu9mnzWt6amXAul0Vz+RQ9YW7Ax++F7Zj76Zx4X1IROLKf219jDbHelQZEAPp+udf30m8tb7trLKiq9/V7SVB/RMpuXxvwUfe85stzkXzOlrPe2dWiZrKchnXn86HteTsYHc0z2xtnDOKR3PPuE4plbp7egMWfjDdyO7dlZ+6/KeN8aeebng9FlqyRFfbOi9ben4obOM0s2t7bfdq5kspV/+hniHM50d7SteSL7+bnr1GsvsOt/5Zw5fAeYYM+rfJr9DnRjwAmomCUSaD/DxNkvZrswqBSOCJUrVRGaA6Fkl4lgifCKShLRMCiP3RXR7T2W6I1giApHRMhjNn1pDUcBVVAZkIp1A1uXFqDJzVkwC1u9rAfaEUkBjEKAtpLjsOhBL6UAq2/10IpnI+HmmAyZTd6d1pcdXU9fX7qGKXSc08ZJN4qsJI71MECE60bC+yOXA6DLltduAmmI/ENq1CYjv3Qqk2psxesSryQSgFgQAt92LEfcSQz8P/w3HWI4JUMwWjDChCAuJtRm3ODGaS5l6HizxCBYrRo2haI5vK/QABbEOwGLNANmsAthdokmVGdASCSDVehCIqXaMeYhmu6srYBaP5o6aqDwV5z6RSyeWZPEWYlSDOipqAHNhGUbXqx0dUWB/OAN0RAHCcROQTXYfDhHSEwfLZlYAV9egRisQ7GwDUm1NuYMuiiudFgtQXeTDqDoMJ9PA/nz+GqkNpg+W3GD1o/Opl+Kvr/aferp7YT5bNwF6KmkZQCmiWl6i+gqC777l/8xph3+37dGHAueerlZXDWkFevSD9ZmWtti6LcVfu9wS6H+boqXS1kA/I/wykZDq779NebqpNXjf38y6qeyqa+wTq3t+S7FYSi65ItXc2Pzg3ZE33i35168f6UFiH23w1BzaEOEoFV121f7f/MJWMsFdPa3fO5ee/E/EQ23/eKTo0n/O1wIS+/Z0vPBM6fJv9CwUCD3/eqK5tfqqvhrux9/e7rv8Y3OKQq++FX7ixcAXzvOc0B3ks/j8JRdeBoTXfpj4cHXjj241V5UXfuWynqOjpV7JC6uSNL6JPlgD/SM3WH1JvPVB4o33nHPm5313BaRaW0z2AdW+qSdMz+7b1csjtDQnmg66zhzK2vRUOnTv30J/eZot9XprsOWW3zXe+Ivknv19/hs9FYmYXP38GE5v26T7+5k2qCdTHXf8KRPPFF39zUN2VzlqSVnpV7+jtXVGHn32SNeytU07KSzp+7kGy+oPuGfOPvDSw00rnxDpDX3zzV4S3b41X8+uJZNtj/3FMX/WIXMttS07AufMPVKXfCD0ztZES9A5u7vvf/pgc+SpV1yzT+y5u+rJM+uE4qu/UXThl5RQ4uC//bL9l3eGXlrZ0NCQr9cy9oz6CJbXbgs4VSBavxNItzdhVIGJ7CtRC6bY7Bhhkq6cAEUhV84mIljZDEb4xOz0AqInTSKdxmhVlczqua8mRSNXV5hMAz63F6NyUFFtGEPxkrqCEevqjOtALAmQyuDUAawmEdIwAwUOO5DsbKe7U1QKKC/wA1WdEaAxmgYgC6hmBfCqZsBiNmF0kDI7PYDqLwJEfoAaKAZspRMAW1EZEE2mgLSmYUSwAi47EG9pABIHdmEM4xPhwK4kNl0Dkv4SoOi4coz5gIUxUYcoCuVMGDMExQhIXUuRi2DZRaswX+4AmUS9ZEEAI9XJ4g1gBJBEKFEcDhHZEpc/RMsxW1Ej4AkGAS0pnsUMWFxOwOx0YlQjptpETWWwayVdYx+7I5ciRCfy5yweP0brfHtJJUa/K5Eqt29/M7CrIwLsD6eAUELHSAWzWnRAdWiA6CZY5NWAsgKAiV4VY9hirHE/kGjah5Ee17WqVAIjacw10QlU+b1ARLxA8kfX9UHMIpQ5WH2xlE8su+yqYcpTiW9aZ5k+oFRu57zjgx8+cvjtoTde8XzmxCFcnMq0dTb97LcFdcdXXX+TYrEUgp7Nht5Z1fGH/8XlLL7uy73OY07s3GtRbX0nJ8W2bg5uWFfxn8v7enpNa7vtHteEmoJzL+77vbX6/RXf+mHjXb+ObtpecuM3FfVjr1SLRiPbdk34wWV9PdeQFF90eSbY2fLQvaE/32ormVS+6Fyr94gjglRfIJNMZEPBwY4X7IWut/z5XpPH4f94IEpLJCO79lbeeMQp2tGt+w/89umi71ytqF019bH1Wzrv+1vh2ee7ZvXTTsVxTK3jmNp0Z0d8+1b9QOO6deuO9lWMXaN+gyVJ0tEZTCd3eYmwT2pJ2TDtrrRkIrpti//EXhpyHs7ktGfi8cNvzzQecJz0uUE/t65H//KkGij2nXdJ7jbFbC74zKnuOfOaHryr6ae/Vmsm+K684JCLhslXVln8hYc9XLdUS3P7k3+zTZticve1Cet8+uVUS3vp1d8ZyHtrstvLrv1+8wN3dvzqHvdVF3S3mNL19gceUwOFZpe73wcZAkuBr/xb18f37mp99OHdj/5G17TAlLqkZvZMPFYxma3eQDrcqWVS4R1rk831VpdLz8fvKuG3V2aCHSU//f4ht2c7Q2ar1ezp/YJysqHt4C8fVydU2qZMyt0/9NATalV1v7urHKvPbz1xAfCFs856/913h/oKxrhRv8GyW83JtmYg1dECZMKdGA2fRC6L6K4ufp8QGVEiNCIiVV1ZOMk4RpCjqw+W14cR/hFNnkRHIpFQI6YfirCTyIzp+g+/K81IhFhE/yQbkMpkMQJF4r8qka5kVxH/CRS5FKDC4wAKrAoQ3L4DI/NJxGmc1ccBc6pKcg8SsMcwcrZK3TbALmJXYnZhURlGWE6wlVYB7mNnAVqgHNjW2AZ0xFOA12bFCLFk42JuYBtGMWaqTUSwLBhxLGthGeComARU+TxAPJ0FCpJpwG4xAWUeJ+BzOoBsRwgj40o0uO/KDDNbyDVG9xVjRNpENMvicOUOSjaVxKgfTFVOAZwdzRjRtUy4g1xLs65xkNnceyX+Rxxi8erQsuIcJ8JdRq6VH6Ofmb28u9NVwmwDtjR3AA2hGNAYSQBNsTRGTp44YYp6nWKvDvhc3WWeFX6AOeUqMKfcD5TZTUDn5g0YiW7ihYhCS5GDJQJ7IuFMxM+c3nz/eNAHk4MlLxGOkLYnHi2YP8d98oB+/qX3N9oLe9nZxFtbCyYMej5d+/88Yoqly776rcO/ZXY6K77x/XRHR+eLTzf/x28tfq86u845Z7rJ4Qi/9nZmX2P5N39wpIftePO10Gsv+a84r++0dCD59keBpRcpA+4UYLLZyq75buvjf235xZ32KZMcp803qWrk6VeUZLboki8N8EGGxjFp8oQf3oSux3duTwc70+vXxBs3h3fvtHsLEsFO75RjsirFV39dLSk9+ucKrnqj/aX/V37L9YcE6gDFajlSlLvpr2+0P7E6cNlSx8Kuz1Jq38G23z/gW3iq5zOLc3fTNS26aX3yYIPZ5bb6fK46Od15KEb9BkuSpKOhow+8D5Y+yGHP0tFLt7e1P/tEqmF/0ZFztw8RW/GWubfQka5pZAd3BBObd0TXbqz67r/2MW/Y6vcXX3pVNhbreOV5bePulhVvWZ2uTDJZeN4Xe3Z1zsmGQsEXn4nu2ub87MJ+d1fpprZsMuUe7IhlRSm68DL/mec0Pnh34unXMrEYDmf5V789xPI3XY/t3JYNBmNbNthc7lRbi7WkLJVIOI89zlZarpaVHxpaUxTHMbUOEP0gel4I7CfXbMAywc7gGy/5v3R+r539TS4XiqntydWF552UuzH80a72R1amWsLuM0/N7a6yoUjn3X82e3y53ZWWSnY883h4w1pnoMTs9CoWc0fD3vjbK21zF3hmn3D4c0l9GPUbrGwykRZRq64u2HHoCiaIQI7FVwzYy6sBx4QpgLOkAggnurMRnTYrQCqJ0Ue7ayieww1E24Ld97SYAc0G4FbNQMCuYhTfZeMhcvEwUYeYTgGqxQw4LGJmogJ4nTpgteglXoCaAhWYUlQAhHdvASLb1wDJpgMYTeFFiZmnbh5w6jG1QHlTOxBOpgC3agUcqgUwK67cSxbBGDF/0DlhCrAvGAfWbd8P7AkmMGJgE702oNTrAorMFox2UF3RrEgYI5JkdrRilGommvYDVVNnYWRKhZIpwGY2A8UeF2DNpoB4TFRiK4DZ5cXIwerKFfMVA7aiUkC3u4COSAyIdEQwWkaJc5jNYgecpTWAZ9JxuVedDgcB8WEQX0UGm0jIE1/FhMdsxPioiAmDqh3Aac4tTC0qB5yVNUBQtwC7GtuA/aEY0BJLYUStopnuiI7HpgCiyV+hSwesZgUIOBWg1m8D5lX4gRklBUD7B28A4U3vAbG9O4FMJAx0Da3TtdxblPYVAxanB7A48x/BGkSjURnBGiaalmprjW5cl2ptJpFQnY5MsNNsscQaG/SsZj9uctHya63FR0zr6SmxbVdiz/4J1/cyW9pdWZmqP2At66esr3tR8Xjn/Y+WXPYv1j6v9Almp7Po3P7GUWezLf94JL5jq1pVXnrL9QMZj5PYtNVVMeioW9eS3J7Kb10/tH8LoGnhDWtDb7yiRSOgu6ZOptClVZWYSl2606Ft353ZtaH92cfRdNVboBSVumfNcdVOy2//hd5lMo33/sF71mL3Z+b1+n2TXfV/+dLmux+OvLbRVOGzKqbQhr0Wh900eVLJ967NdSJN7trX/sc/+U5a5Dn1dHFL2wvPRN9f7ZtSV3Pxd3Jd6Us1reWDFe3P/CPT0SamkksDNOo3WJIkHZ3BNBqVEax8i2xcl9m5tXPNh1a3y+ov0Kxmxe/Tq0qVpN9SVuIrOM1WM2HgcRctFg//6XHvvAW9ZhopvkB2x15OnDXAR4u+vMpa4HdNrev/rgOQam7s+McjyVBH0Q++qk444nTCQ6RbO8UvuoeL792tJxPO2v6bIwxWYv++5JYNHe+ssgd8pqqSwNLLrWWH1R6ecQrggWw4Gl39UWrD1o7nnmh97C9Wt9tZN9PkL3TPON7syk8T/0OE3nojm065+6wGtU87pvK2/xNbuzn2wXpT7WTv9OOdcz8WBUw3t3Xe9bClsKRrd6Vpoddfjn34XuCEzxXP/WzPeyomU8mJpzuKKxte+rN3wWf6bakq5Yz6DZaezYqEG1EP2NWxXcwBdHoAe9lEwH3MDKBNtwCrt+0DmiIJ6IqXF9gsQJnbARS7nYDLZga0SAzIaFnAIVpGOVWgQNOAApsVqPK5AL9TBUIHWzDaLImm5xmbEyiwWgC/QwWKnSag1a0B6SwTfSZgit8FFNrMQPOujUBk6zogVt9dBe1o3A9kw52AJxICph4zHchYfBgpYk7VCigWE0bykNlmB0KpLPBOfSvwQWMQ2NicBtpEL3grGKWR1b4YUFrgIlczKN7nTBbQ9QxGTCsrZh22NQKxxgBQVVpJrozObAZSkSCQEA3JYmGMvlwiMGNxFQC2wu7EuIbOMNDU0gS0xZNAOJkB4pksRuv8riQ2BUA1mzDCil67FSh0OoGyimKgeKoTiDXsAxIH9wCmxn1ASiRzRJSuaYMiz8njwwj42YorgLTVAexvagcOhONAUywFhJMakNZ0QDUpgM2uAH47GJ2uRH6e12YGKj124LhiP1DpMAFt774CBNesAsKbNwCxhnZAS+uALeDAyN5TiyswmvJnU4lDDkpe6Lo28CpC2Wg0j+K7d4ZeeS7Z2uw8aXbZT7/f9xTngdATycZ/v62gblbB2ef1egfvKUua/3S397JzB5ItnjrQ2PHsignX3fixp8hk2l55LrVtq33CpGQ0XPbFK3u9CHi4lqf+Hvno/cBl5xYuOnFwdQDxOM7DGj3oesvDD8T37FIUU7iw0LPk885jpg7iMY+s441X0ts3xw4c8Jw4q/TGb1rL++/pYPa4vKcv4vRFgJ5MRd9fp3WGIm+/0fnycyi4qo/BF/Cf9rl8Jdcn9uzqWLmi9KYBpPwrinN2Xc9GDDnhle8GH3228AvneebOB/Rs9uAff00yNfnyH4qfm4fzVE9zllc3PnBX5TcOzamXjmTUb7AkSToq+iBysGSbhnyJblzX8o9HbLU15Tf8KC8XlTIdwdAfH7J6AwVnHbE431ZeYbbaYms39/pD9xCJle95pk63+ruvSybq9x287w5PaZWjdLJJt+nNuxp+/Qtb7XFFS/vpnqAlk7H1HxV/65/tdbWDelGAks4o6qFbk7bnn07U753ypeVmm33vE3eHX3v5aDdYut7x5muZzesSnR222dMqf/jloR0UxaaKy3becz6Hrse37kxs2Jpcs/HA2vcUk9k79yTrxBrnsVOPptQ0+uarzhNnWQZ2vbhX8Q1bI/943jXrBLG70tLpzkcfMiuWSVd8T5QcHYm37qSO918c8vP2q7a2Nm66308vBbC9ipsaFi5cOHzrOXpKXopFR8qyZcu2b9500sw6IBMNYXTl7mp9bncBqr8ESNucwL7OCNAQ6e5apInKLyuA32EGCh1WjJI6W4/IfCYr4hY9koF6tK0S1Yui7C4b6x77IBKMbEXlQDALUB+MAi3xrHj2gN0E1PjdgCcdBaKif/r+fUC8PUlXMRw2lwLYigoAW0kFoBaWYVTbdXVFN1swqvPEgiOJFNAaSwAN4SRwMKwDwRhAOgPgsAGUeQGmFtqByX43EN27DUg21mNkOHUlt9kdgKXAT25co9ePEQoSraR6ThUUiWjiFvHdrm7sLjeQxgwE4wkgmEgDkXQGiKc1jLhaWgNj0qKo5tR6fGxFQErtao+uAAU2M+C3q0ChywFYtTRGDpYYFqkZOVhdDeIdLsAq4lgFhRgjGjvjSSCSygCJrIYxGVCcIUUNqUXprie1mBRANZkwGoAVOGyAJZMEks37gUTjPiDR2AjEW1NAIqHkXojTrQOOUi9gK63EiGOJVZlVG7D6ozXV1dUPPPAAR+fmm2/+7R1P+YsHmrva0fLhd7+59Oabbz7K5x2Tli1b9rc33nTU9N+qKrphTTYctM873tJb+6ghyDS3Rd9f55g02W4MEj6SVEtTpmGf/eR+jrieyUZeWeU5caHJ1pUmpSUTkQ9WO6uOtRd2Z0RlosHwrg0Wl9M+Y1bPQRGHSNbv0RNhdQC7ul4WvH6rYvfYKj42njmxaZ3FGbAXVwFaKtGx4W3vosXKUHct2WgksXWjlk5ZpkyyfbxdZ77oup5pbNGC4dTeA4qimBxO5/Tjc+/twKWam2JbNng+f+rAayoPkdy+J7ljj3vW3Ny8oNi6D7V40jf9JI58BIVMNBir3+Kce1LPG7+96KTXX389L6cjXddnzZitb7aXMbHfOzeyT6uNrt+0zvQpHkQ9uiNYs2fPBrxV1QO8v99XAAw0AWEwmiORtra2adP6qmUVF67Li/tIFy0EPBX9f7YGQrR8FmFpURM8/ch37pV9xjyAGb3nUe7Zswcoq64e0uq6iVYtXq8HyOeM+14NIFc3x+5yAT2vEGzevLmwsLCkZOidoF2FxQDT+qmc6ld1dbX48B89Xde1QVwiHMW/jw03cUSqB/JfxCn9zyQetB6Bq+bm5ra2tmnTji45af6ph95y+uLe7vf5ATzWUbzeEz7Ty42HvIFLF4vT0YDe/F6ddfoQ/+EI6Lr+O8TT0eHv5+A+jb0c7nydjhRFufveu85a8oXieIW5z81Jlux+5/an73nq07y7YrRvsK677rqRXkKXhx9++JlnnhlXv9mLFzuuXvIVV1yxaNGiK664YqQXkk/6YKoIZQ5WH+TpaATJ09HYsGDBgjPPOnPNM5snpfu65ltv2X7G589YtGjRJ7awoflU7/4kSRp+uq5nB/hHVhFKkjSsbv/tbY2WPXGiR7pDgliTdd9/3/5fn+SqhkZusCRpfBOd3Af6R0awJEkaRpWVldffcH29c9uR7rDXseX6G34wcWJ+cmmGldxgSdK4pqPpemagf+QsQkmShtnyHy1Pu+IdtBz+rU5aU87oDf96wye/qiGQGyxJGt/0wVwilEnukiQNM7vd/pvf/3qPc9Mhs7l09L3Ozb+743dO5+hodjq6k9w/PWbOnGmz2UZ6FZ+oxYsXj/QSPmkXXXRRbe2gG/l8yn0CjUY1TVuzZk1DQ0Ntbe3YewM/heTpaDwYk6ejnEsuueRXv7zt4Id7KvSa3I0Nyu6Jx064+OKLR3BhgyI3WPkxc+bMmTPH17zx8XlGG+klDIfBNBodfJL73r17zz///DVr1qiqmkqlzj///EceeWS8/fj/hMnT0XgwRk9H3e66585FC08pTlRaUYEM6f22Ha/es2LIDc8+efISoSSNa7qu67o24D+D3mBde+218Xh89erVkUjkySeffPHFF2+99dbheCGSJI0ls2bN+uKllxyw7RT/t17dfskXL547d+7IrmpQ5AZLksY3XdO17AD/DKGKcOXKlVddddX8+fOtVuvSpUuXLFmycuXK4XgdkiSNMbf+8tYmc32UUJRwi/XArf81yn43kxssSRrndHRtoH8Gf4mwtrZ23bp14u/pdHrLli1jOHFEkqQ8Ki4u/vef/mS/e1u9a+tP/v3/FBcXj/SKBmd0zyKUJOlo3Hzzzf95629Vm2+A908lOy+/bOkhA0kWL17cRwbMypUrL7zwwvLy8gULFjz33HM+n+/ZZ5+dMGHYpyJJkjQGpNPpYycfC2zftd2aj7HonySZ5J432Wx2/fr19fX11dXV06dP/5TPSDp6O3fu3L59+5w5c0pLS0d6LcNurB7cIaQGL168+LXXXhv4/Z1Op8vlymQyBw8e1HU9EAioqjrYJ5UGa6x+Yo9Eno7GKqvVesddd4i/jPRaBk+X8mHXrl1z5swBfD4fMH/+/N27d4/0ooZLIpFYunQpYLfbgZtuummkVzS8xtXBPUqvvPKK2fDjH/84GAw6HI7ly5eL7yYSibPOOmvevHkju8gxb1x9YuXpaAwf3NFObrDy46yzzqqpqdmxY4eu65s2bZo8efKiRYtGelHD5cYbb/R4PG+99VY2m73vvvsURXniiSdGelHDaFwd3KMUiUTWGxobG//+978DInYlPPnkk8CBAwdGcJFj3rj6xMrT0Rg+uKOd3GDlQSwWM5lMd9xxR+6W+++/H2htbR3BVQ2TTCZTXl7+wx/+MHfLaaedtnTp0hFc0rAaVwc375577jlg/fr1uVvuvfdeoL29fQRXNbaNq0+sPB2N4YM7Bozla7efmFAo9LWvfW3JkiW5W6LRKJDJZEZuUcNl7969Bw8e7PlilyxZ8tZbb43gkobVuDq4ebdo0aJJkyZdc801GzZsiMVir7zyyk9+8pOzzz7b7/eP9NLGrHH1iZWnozF8cMeCkd7hjUH19fW1tbVjNWy7atUq4MMPP8zdcvfddyuKkk6nR3BVn5ixfXCHw7p16+bNm5c74Vx44YUtLS0jvahxZGx/YuXpaAwf3DFARrDy7JFHHpk/fxgCEQkAAATTSURBVH4mk3nooYdGei3DorOzE/B4PLlbPB6PrusdHR0jt6hPyJg/uMNh5syZ7733Xn19/bvvvtva2vrYY48VFRWN9KLGizH/iZWnozF8cMcAucEaihUrVlgM//Zv/yZu3Llz5+LFi5ctW3bFFVesXbt20qRJI7vIYVJYWAiEw+HcLcFgUFEUUdIyVo2Tgzt8qqqqTjzxRPHhkfJLno7k6WikVyT1TvbBGoqTTjppzZo14u+it+xHH320ePHihQsXbt68uaamps9/PbqVlZUBjY2NuVsaGxuLi4tHZZOSgRk/B1cajeTpSJ6OpE8n2ck9DzRNmzp16syZMx977LFRNOh7aHRdnzJlygUXXPCrX/1K3HLKKaeUlZU9+uijI7uwYTKuDq40BoyrT6w8HUmfZjKClQdvvvnmjh07li5dKkrQc770pS85HI6RWtUwURTlmmuu+dnPfnbBBRcsWLDg/vvvX7Vq1csvvzzS6xou4+rgSmPAuPrEytORMCYP7lgwoin2Y8Rdd93V63vbs7/iWJLNZr/+9a+bTCar1Wqz2Xo2ZRl7xtvBlUa78faJlaejMXxwRzt5iVAaolAotHPnzrq6OpvNNtJrkSRpXJOnI+lTSG6wJEmSJEmS8ky2aZAkSZIkScozucGSJEmSJEnKM7nBkiRJkiRJyjO5wZIkSZIkScozucGSJEmSJEnKM7nBkiRJkiRJyjO5wZIkSZIkScozucGSJEmSJEnKM7nBkiRJkiRJyjO5wZIkSZIkScozucGSJEmSJEnKM7nBkgZn48aNDz74YCqVEv83HA4/8MADu3btGtlVSZI0DsnTkfRpJoc9S4PT2to6Y8aMr3zlKz//+c+Br3/96ytXrvzggw8cDsdIL02SpPFFno6kTzO5wZIG7amnnrrooovefvvtzs7Oc84556233po7d+5IL0qSpPFIno6kTy25wZKGYtmyZe+99140Gv3qV7960003jfRyJEkav+TpSPp0khssaSiCwWBNTU1xcfGmTZvMZvNIL0eSpPFLno6kTyeZ5C4NxauvvhqNRnfs2LF69eqRXoskSeOaPB1Jn04ygiUNWnNz84wZM3784x9/+OGH77zzztq1a2VKqSRJI0KejqRPLbnBkgbtvPPOa2tre+ONN4LBYF1d3eWXX37bbbeN9KIkSRqP5OlI+tSSlwilwbn33ntfeuml+++/32Qy+f3+P/7xj7/5zW9WrVo10uuSJGnckacj6dNMRrAkSZIkSZLyTEawJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvJMbrAkSZIkSZLyTG6wJEmSJEmS8kxusCRJkiRJkvLs/wPkgnFl34KoXAAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "q = Observable(Array(vars.q))\n", + "ψ = Observable(Array(vars.ψ))\n", + "\n", + "fig = Figure(resolution=(800, 380))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "title_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\n", + "axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n", + "\n", + "title_ψ = Observable(\"initial streamfunction ψ\")\n", + "axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n", + "\n", + "hm = heatmap!(axq, x, y, q;\n", + " colormap = :balance, colorrange = (-8, 8))\n", + "\n", + "Colorbar(fig[1, 2], hm)\n", + "\n", + "levels = collect(range(-0.28, stop=0.28, length=11))\n", + "\n", + "hc = contourf!(axψ, x, y, ψ;\n", + " levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n", + " extendlow = :auto, extendhigh = :auto)\n", + "contour!(axψ, x, y, ψ;\n", + " levels, color = :black)\n", + "\n", + "Colorbar(fig[1, 4], hc)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics -- `energy` and `enstrophy` functions are imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\n", + "Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\n", + "diags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "filepath = \".\"\n", + "filename = joinpath(filepath, \"decayingbetaturb.jld2\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if isfile(filename); rm(filename); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "and then create Output." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n", + "out = Output(prob, filename, (:sol, get_sol))\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We modify the figure with the initial state slightly by adding the topography contours\n", + "and mark the time in the title." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "contour!(axq, x, y, η;\n", + " levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n", + "\n", + "contour!(axq, x, y, η;\n", + " levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n", + "\n", + "title_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n", + "title_ψ[] = \"streamfunction ψ\"\n", + "\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 15 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0, cfl: 0.81, E: 0.0394, Q: 3.1940, walltime: 0.00 min\n", + "step: 1000, t: 50, cfl: 0.62, E: 0.0382, Q: 0.5561, walltime: 0.43 min\n", + "step: 2000, t: 100, cfl: 0.85, E: 0.0381, Q: 0.2791, walltime: 0.80 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "record(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n", + " if j % (1000 / nsubs) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + " end\n", + "\n", + " q[] = vars.q\n", + " ψ[] = vars.ψ\n", + "\n", + " title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n", + " title_ψ[] = \"streamfunction ψ\"\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " SingleLayerQG.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 16 + }, + { + "cell_type": "markdown", + "source": [ + "![](singlelayerqg_decaying_topography.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/singlelayerqg_decaying_topography.jl b/v0.15.2/literated/singlelayerqg_decaying_topography.jl new file mode 100644 index 00000000..80d8a86d --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_decaying_topography.jl @@ -0,0 +1,143 @@ +using GeophysicalFlows, CairoMakie, Printf, Random + +using Statistics: mean + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n = 128 # 2D resolution = n² +stepper = "FilteredRK4" # timestepper + dt = 0.05 # timestep + nsteps = 2000 # total number of time-steps + nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs) +nothing # hide + +L = 2π # domain size +nothing # hide + +σx, σy = 0.4, 0.8 +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2) +nothing # hide + +prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV, + dt, stepper, aliased_fraction=0) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid +x, y = grid.x, grid.y +Lx, Ly = grid.Lx, grid.Ly +nothing # hide + +η = Array(params.eta) + +fig = Figure() +ax = Axis(fig[1, 1]; + xlabel = "x", + ylabel = "y", + title = "topographic PV η=f₀h/H", + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +contourf!(ax, x, y, η; + levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3)) + +fig + +E₀ = 0.04 # energy of initial condition + +K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber + +Random.seed!(1234) +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol))) +@. qih = ifelse(K < 6 * 2π/L, 0, qih) +@. qih = ifelse(K > 12 * 2π/L, 0, qih) +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀ +qi = irfft(qih, grid.nx) + +SingleLayerQG.set_q!(prob, qi) +nothing # hide + +q = Observable(Array(vars.q)) +ψ = Observable(Array(vars.ψ)) + +fig = Figure(resolution=(800, 380)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y") +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...) + +title_ψ = Observable("initial streamfunction ψ") +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...) + +hm = heatmap!(axq, x, y, q; + colormap = :balance, colorrange = (-8, 8)) + +Colorbar(fig[1, 2], hm) + +levels = collect(range(-0.28, stop=0.28, length=11)) + +hc = contourf!(axψ, x, y, ψ; + levels, colormap = :viridis, colorrange = (-0.28, 0.28), + extendlow = :auto, extendhigh = :auto) +contour!(axψ, x, y, ψ; + levels, color = :black) + +Colorbar(fig[1, 4], hc) + +fig + +E = Diagnostic(SingleLayerQG.energy, prob; nsteps) +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps) +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will be updated every timestep. +nothing # hide + +filepath = "." +filename = joinpath(filepath, "decayingbetaturb.jld2") +nothing # hide + +if isfile(filename); rm(filename); end +nothing # hide + +get_sol(prob) = prob.sol # extracts the Fourier-transformed solution +out = Output(prob, filename, (:sol, get_sol)) +nothing # hide + +contour!(axq, x, y, η; + levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5)) + +contour!(axq, x, y, η; + levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash) + +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t) +title_ψ[] = "streamfunction ψ" + +nothing # hide + +startwalltime = time() + +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j + if j % (1000 / nsubs) == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60) + + println(log) + end + + q[] = vars.q + ψ[] = vars.ψ + + title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t) + title_ψ[] = "streamfunction ψ" + + stepforward!(prob, diags, nsubs) + SingleLayerQG.updatevars!(prob) +end +nothing # hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/singlelayerqg_decaying_topography.mp4 b/v0.15.2/literated/singlelayerqg_decaying_topography.mp4 new file mode 100644 index 00000000..f70fea64 Binary files /dev/null and b/v0.15.2/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/v0.15.2/literated/singlelayerqg_decaying_topography/index.html b/v0.15.2/literated/singlelayerqg_decaying_topography/index.html new file mode 100644 index 00000000..1a4784c4 --- /dev/null +++ b/v0.15.2/literated/singlelayerqg_decaying_topography/index.html @@ -0,0 +1,101 @@ + +Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

    Decaying barotropic QG turbulence over topography

    This example can be viewed as a Jupyter notebook via .

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size

    Define the topographic potential vorticity, $\eta = f_0 h(x, y)/H$. The topography here is an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$.

    σx, σy = 0.4, 0.8
    +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    The topophic PV is prescribed via keyword argument eta.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,
    +                             dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    η = Array(params.eta)
    +
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "topographic PV η=f₀h/H",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +contourf!(ax, x, y, η;
    +          levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
    +
    +fig

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.04 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. qih = ifelse(K < 6  * 2π/L, 0, qih)
    +@. qih = ifelse(K > 12 * 2π/L, 0, qih)
    +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid))  # normalize qi to have energy E₀
    +qi = irfft(qih, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, qi)

    Let's plot the initial vorticity and streamfunction.

    q = Observable(Array(vars.q))
    +ψ = Observable(Array(vars.ψ))
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y")
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +title_ψ = Observable("initial streamfunction ψ")
    +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
    +
    +hm = heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +levels = collect(range(-0.28, stop=0.28, length=11))
    +
    +hc = contourf!(axψ, x, y, ψ;
    +          levels, colormap = :viridis, colorrange = (-0.28, 0.28),
    +          extendlow = :auto, extendhigh = :auto)
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +Colorbar(fig[1, 4], hc)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files.

    filepath = "."
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.

    contour!(axq, x, y, η;
    +         levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))
    +
    +contour!(axq, x, y, η;
    +         levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
    +
    +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +title_ψ[] = "streamfunction ψ"

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +
    +  title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t)
    +  title_ψ[] = "streamfunction ψ"
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.81, E: 0.0394, Q: 3.1940, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.62, E: 0.0382, Q: 0.5561, walltime: 0.38 min
    +
    +step: 2000, t: 100, cfl: 0.85, E: 0.0381, Q: 0.2791, walltime: 0.74 min


    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/sqg_ellipticalvortex.mp4 b/v0.15.2/literated/sqg_ellipticalvortex.mp4 new file mode 100644 index 00000000..1878431f Binary files /dev/null and b/v0.15.2/literated/sqg_ellipticalvortex.mp4 differ diff --git a/v0.15.2/literated/surfaceqg_decaying.ipynb b/v0.15.2/literated/surfaceqg_decaying.ipynb new file mode 100644 index 00000000..74c68a63 --- /dev/null +++ b/v0.15.2/literated/surfaceqg_decaying.ipynb @@ -0,0 +1,563 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Decaying Surface QG turbulence\n", + "\n", + "\n", + "A simulation of decaying surface quasi-geostrophic turbulence.\n", + "We reproduce here the initial value problem for an elliptical\n", + "vortex as done by Held et al. 1995, _J. Fluid Mech_.\n", + "\n", + "An example of decaying barotropic quasi-geostrophic turbulence over topography.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CairoMakie, Printf, Random\n", + "\n", + "using Statistics: mean\n", + "using Random: seed!" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical parameters and time-stepping parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n = 256 # 2D resolution = n²\n", + "stepper = \"FilteredETDRK4\" # timestepper\n", + " dt = 0.03 # timestep\n", + " tf = 60 # length of time for simulation\n", + " nsteps = Int(tf / dt) # total number of time-steps\n", + " nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Physical parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " L = 2π # domain size\n", + " ν = 1e-19 # hyper-viscosity coefficient\n", + "nν = 4 # hyper-viscosity order\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "Let's define some shortcuts." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "(6.283185307179586, 6.283185307179586)" + }, + "metadata": {}, + "execution_count": 6 + } + ], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "x, y = grid.x, grid.y\n", + "Lx, Ly = grid.Lx, grid.Ly" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions\n", + "\n", + "We initialize the buoyancy equation with an elliptical vortex." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "X, Y = gridpoints(grid)\n", + "b₀ = @. exp(-(X^2 + 4Y^2))\n", + "\n", + "SurfaceQG.set_b!(prob, b₀)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Let's plot the initial condition. Note that when plotting, we decorate the variable to be\n", + "plotted with `Array()` to make sure it is brought back on the CPU when `vars` live on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAIAAABEtEjdAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO2dfbRcVXn/v88+M0kgIeWlaZK2QgIsW15EsjRglMKtqW2X8gMRxQDCAkEQEGupUKtGoBVd9YUqqAQICJXVgl3airp4MUrEEApWAZWEaiKxQQmSkIQQMLlz9vP7Y7+cfebOJDPJJffMyffDrLDvvmfO7Dkz9zvPfPezny2qCkIIIfXCjPUACCGEjD4Ud0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0IIqSEUd0II2dX8/Oc/f/TRR7d9zMqVK+++++5nnnlmxx6C4k4IIbuaSy+99Lbbbuv22y1btpx44okHH3zwSSedNG3atPnz5+/AQ1DcCSFkF/Hiiy8uXbr04osvvvPOO7dx2JVXXnnfffctXbp08+bNN99881VXXfWNb3yj38eiuBNCyC7izjvvPOGEE/793//dmK7am+f5Lbfccv7558+ZM8cYc/bZZx977LE333xzv49FcSeEkF3EvHnz1q5du3bt2pkzZ3Y75le/+tXTTz89d+7c2DN37tylS5f2+1iNHRwjIYTUmsWLFy9evLivu+y9994bNmxIe4aGhoaGhvo6yZo1awBMnTo19kybNm3dunWtVqvR6EOxKe6EENKBxYsXf/qTn9lz/MQej39xy+Z3nPr2GTNm7OTjuo+HvfbaK/bstddeqrp+/fopU6b0fh6KOyGEdGbP8RN/f68/6PHgtfjtjBkzrrjiip180P322w/Apk2bYs/GjRtFZO+99+7rPPTcCSGkQkybNg3BnHGsWbNmypQpzWazr/NQ3AkhZBtIz7fRYf/99585c+aiRYtiz6JFi4499th+z0NxJzvOiy++OG/evHnz5j311FNjPZaXnd3qyZKA9M5O6vsNN9wwb968LVu2iMh55513/fXXL1mypNVq3XjjjQ888MAFF1zQ7wkp7mTH2bp16x133HHHHXe0ZQjUkt3qyZKEXRS5P/zww3fcccfw8DCAyy677F3vetdxxx235557XnzxxV/84hff+MY39ntCTqgSQkhnQkje68G9n3nFihVtPQsXLly4cKFrG2MWLFjwqU99auXKlYceeuj48eN7P3OE4k5GgRdeeOFDH/rQo48+ethhh73vfe9zCzReeOGF9773vQA+/elPT58+HcCXv/zl7373u3PmzLnooovcHZcvX37jjTcuW7Zs8uTJr3nNay6++OI999zzE5/4xLJly1772td+4AMfcId97GMf++Uvf3nyySefdNJJL7744g033PCDH/zgueeemz59+tve9ra3v/3t7rB3vetdAD760Y/ec889ixYtmjBhwllnnfWWt7wljvPBBx/8yle+8vOf/3z69OnveMc7TjjhBADbfrgenyypL6NmpvfL5MmTZ82ateP3V0J2lPXr17t30QEHHBDfUX/wB3+wfPlyVX322Wddj/tRVc8//3wA73znO92PX/3qV9tCkgMPPPCZZ5759Kc/DWC//fZrtVqq+vzzz7s8gYcffjjP83TlnuOzn/2sO6H7se3v4d5773W/vf7669vWfF9++eWquo2H6/3Jkvpx+eWXT5k87dBXzOrxNmXyNPeOqgj03MkoYK393ve+9/DDDx922GG//e1vP/KRj2z3Ls8///xFF120ZcuW008/ffXq1Q899NCBBx74y1/+8sMf/vCpp55qjFm3bp1bcv3d7353eHj4oIMOmj179o9//OPvfve7WZbde++9a9asufDCCwH827/9W3rmF1988Wtf+9q3v/1t93XB/XbdunWXXXaZtfbyyy//zW9+89nPfhbAxz/+8bVr127j4UbryZKBpXfDfTQTZkYFijsZBa688so///M/nz179r/8y78A+MY3vrF169Zt3+Whhx569tln99xzz+uuu+6P//iPjzrqqH/8x38E8K1vfeuP/uiP3Irtb37zmwDuuusuAKeeeiqAmTNnPvjggz/60Y+OOeaY1atXP/fccwDWrl2bnvkf/uEf3va2t735zW9+61vfCsAltzz44IMbN27cb7/95s+fP3369L/927/9u7/7u3PPPffZZ5/dxsP19WQ3b9585513fvWrX3388cd37DKSyiF9pMtUTNsp7mQ0eNWrXuUar371qwHkef7kk09u+y4rV64EMGPGjLjM2p3kmWeeeeGFF5x7PlJt99tvv+XLl7/73e+eNGnS7Nmz77jjjpFnPuigg1xj3333BaCqANx49t9//yzLAIjIZz7zmQULFhxyyCEIZn2P4t7tyQ4NDf361792cf12rhcZGBi5k92bGDuvW7fONdKl0nmeu8aLL74YO3//938/PT6299hjjz333PPkk0+eMGHCE0888Z//+Z+rV68+4ogjDj30UAB33333u9/97p/97Gcf/vCHv//97zt3pRf22WcfhKodI+n2cL0/WWvts88+O3HixDe84Q0XX3xxj6MiFUf6THSvFBR3Mgp86Utfcgr+uc99DsD06dOnTp06adIk94Z3keyaNWtcaOw48sgjReSZZ5756le/CsBa+4UvfMH1G2MmT558/PHHA7jkkkuQxNFLliwB8KpXveqf/umfjj322O985zs9jvDwww8H8OSTTz744IMA/u///m/y5MmNRuORRx4B0O3hen+yxpgHHnhg/fr1F1100V/91V9Za3u+eKTKMHInuzff/OY3/+RP/uTwww+/4YYbAHzsYx8DMGHCBJe48v73v/+QQw55xSte8fzzz8e7HHzwweeccw6A008//U1vetMRRxzx9a9/HcAnP/lJd8Dpp58OYNWqVSIyb9481+lK7v3oRz867rjjZs+efffddwPoRUmPPPJIJ99/+Zd/+dd//dezZs3atGnT6173uiOPPHIbD9f7k926deumTZv+5m/+5j/+4z8ef/zxtOoTGWDouZPdnKuuumrDhg2PP/745MmT//mf/9mltwNYuHDhwQcfDGDlypWnnnrqmWeemd7rC1/4wkc+8pFJkyYtWrRo2bJlhxxyyF133XXccce53775zW92XsqcOXNiGdUzzzzTTZP+4Ac/mDhxotur7Ne//vVjjz223UHedtttZ599dqvVuueeezZu3HjKKad8/etfj1+mOz5c7082z/Orr776rW996xlnnHHttdf+3u/9Xq/XjlSaAY7cRUN2MCE7yW9+85tp06aN3D/s6aef3nfffbexym7NmjWTJk2aNGlSW/+b3vSmRYsWXXvtte973/vS/ueee84Y028FVIe19te//vXUqVPHjRvX48N1pNuTJbXhiiuuWPD5m6bu88c9Hv/M+qfe+zfn7HzJ39GCK1TJqPGHf/iHHftdvvk2cDVOU1avXr14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YPzquos4+uijH330UdeeMmWKazzyyCNDQ0Nz5sxZvnz5zJkzx250g8q0adMQzBnHmjVrpkyZMqCbf445fEO2Mep57jG56+ijj7711lvPOeec1772tSeeeOKOHbZtGLnvIiZOnHh4wJmY1tpTTjll7ty5d911F/+Qdoz9999/5syZixYtij2LFi069thjx3BIgwvfkCMZ3WyZHpO7RisHjJH7mLFkyZIVK1accMIJN910U9p/+umn77HHHmM1qsFCRM4777yPf/zjJ5100ute97ovf/nLDzzwQKr1pHf4huxEP1b69mL3jsld11xzzY4dtl0o7mPGE088AeDqq69u6z/++ON347+lvrnssstWrVp13HHHZVlmjPniF7/4xje+cawHNZDwDTmS73//f668oo+DZ8x4Vdu+AkNDQ0NDQ67dY3LXaOWA0ZYZM8477zzthPORSY8YYxYsWLB+/fqHHnpo48aNF1xwwViPaFDhG7KNoaGhoaH/JzK9x9vQ0P8766yztnHCHpO7RisHjJE7qQOTJ0+eNWvWWI+C1Io06O7rXt1+1WNy12jlgDFyJ4SQXUGPyV2jlQNGcSeEkF1Bj8ldo5UDRnEnhJBdgUvuuv7665csWdJqtW688cYHHnggzhLdcMMN8+bN27Jly7YP6x167oQQsovYRnLXww8/fMcddyxcuHD8+PGjkgMmqjra4yeEENKV559/fuXKlYceeuj48eN3/rBuUNwJIaSG0HMnhJAaQnEnhJAaQnEnhJAaQnEnhJAaQnEnhJAaQnEng83jjz9+6623bt261f24adOmW2655Ze//OXYjoqQMYepkGSwWbt27eGHH37OOedcddVVAM4///wf/OAHP/rRj3bbKrWEOCjuZOC58847Tz755AcffHDDhg1vectbli5d+prXvGasB0XIGENxJ3XgrLPO+uEPf7h58+Zzzz33ox/96FgPh5Cxh+JO6sDGjRtnzpw5ZcqUZcuWZVk21sMhZOzhhCqpA/fdd9/mzZtXrFjx0EMPjfVYCKkEjNzJwPPb3/728MMP//CHP/zjH//4v//7vx977DHOphJCcScDz4knnrhu3br7779/48aNhx566Kmnnjpyl2dCdjdoy5DB5qabbvrOd77z5S9/2Rizzz77XHfddZ///OcfeOCBsR4XIWMMI3dCCKkhjNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSGUNwJIaSG/H8evsuvwkCvQQAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "fig = Figure(resolution = (500, 500))\n", + "\n", + "ax = Axis(fig[1, 1],\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " title = \"buoyancy bₛ\",\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "hm = heatmap!(ax, x, y, Array(vars.b);\n", + " colormap = :deep, colorrange = (0, 1))\n", + "\n", + "Colorbar(fig[1, 2], hm)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics; `buoyancy_variance`, `kinetic_energy` and `buoyancy_dissipation`\n", + "functions were imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\n", + "KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\n", + "Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\n", + "diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.\n", + "nothing # hidenothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files).\n", + "Define base filename so saved data can be distinguished from other runs" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\"SurfaceQG_decaying_n_256\"" + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "base_filename = string(\"SurfaceQG_decaying_n_\", n)" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "datapath = \"./\"\n", + "plotpath = \"./\"\n", + "\n", + "dataname = joinpath(datapath, base_filename)\n", + "plotname = joinpath(plotpath, base_filename)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if !isdir(plotpath); mkdir(plotpath); end\n", + "if !isdir(datapath); mkdir(datapath); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "and then create Output." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n", + "get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n", + "\n", + "out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We define a function that plots the buoyancy field and the time evolution of kinetic energy\n", + "and buoyancy variance." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4QAAAJYCAIAAAC1p7+MAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzde3hV1Z0+8HftfU4ShEQoxQSqlKBDQadqvFRpFaLpdNqnVqS2DC3qiFrAlvpY5ydKK1MYL32q1lov9YaIM47VXqYatNY2FWohVuqj1muVRIN2JI5guJOQs9f6/bHW2nutc05iEkJ2kPfz8GzW2Xufk3VODu3Xd6+1tlBKgYiIiIgoDUHaHSAiIiKi/ReLUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKDYtRIiIiIkoNi1EiIiIiSg2LUSIiIiJKTSbtDhD12s6dO8877zwA119//cEHH5x2dwa7lpaWVatWNTc3H3/88bW1tRUVFb09rYevQERE1AdCKZV2H4h6Z/PmzSNGjADw4osv/uM//mPa3Rlo3/3ud5944omZM2defPHFH3jyk08++fnPf37Xrl364Sc+8YnVq1d/9KMf7flpPXwFIiKivmEySrSPef31159++ukTTzzxA8+UUs6YMWPXrl3z5s370pe+dM0116xZs+biiy++7777enhaD1+BaF934403Pv/88+PGjUu7I0T7vJaWlqOPProncUmMxSjtw7Zv33755Zc///zzRxxxxPz586urq/XOefPmAbjuuutGjx4N4J577vnDH/4wefLkb33rW/qJr7766l133fXKK69UVFQce+yx3/72tw844AAA11xzzSuvvHLcccfF/4r+/d///Y033jjzzDOnT5++c+fOO++8809/+tP7778/evToL3/5y1/5ylcAnHXWWQCuuOKKxx9/vKGhoays7Nxzz/3iF78Y9/Opp576r//6r9dff3306NFf/epXTz/99A/8WV295fvvv//1118H8Oyzz/7nf/7nOeec083ns2bNmnfffXfYsGG33HJLGIYHHHDAKaec8pvf/CaXy2UymZ6c9tRTT/XkFYj2dX/5y1/eeuutQVKMdnR0ACgtLU27IwA70zV2pivNzc2dnZ29e44i2te0tbXpb+/HP/7x+Jt80EEHvfrqq0qp9957T+/RD5VSc+fOBfAv//Iv+uHPf/7zvH+x48ePf/fdd5VS1113HYCRI0fmcjml1NatW7PZLIC1a9dGUVRXV5f3z+dHP/qRsgNdampq3EO/+93v9I+74447gsCbKfj973+/+5/VzXs/4YQT4tc56qijuv+gbrrpJgAnnHCCfrh161b9xNdff72Hp/XwFYj2dZdffvnll1+edi+MzZs3b968Oe1eGOxMV9iZrvThXxNn09M+TEr5xBNPrF279ogjjvi///u/733vex/4lK1bt37rW9/q6OiYNWvW22+//fTTT48fP/6NN9747ne/C+BrX/taEASbNm1qbGwE8Ic//KGzs/PQQw89/vjjn3322T/84Q9hGP7ud79rbW395je/CeD++++PX3nnzp2/+tWvHn30UR3H6kObNm1asGCBlPL73//+O++886Mf/QjAVVddtXHjxm5+Vjf9f/LJJ3VuOn/+fF0iryqmtbUVgK7ahw0bpp9bXl4ehiGAzZs3u6/ZzWk9fAUiIqI+44U22octWbLklFNOAfDjH//4c5/73MMPP7x79+7un/L000+/9957BxxwwG233VZeXn7wwQf/x3/8x1lnnfXII48A+NjHPlZbW/vEE0+sWLHi5JNPfuyxxwB87WtfA1BdXf3UU08NGTJkwoQJL7/88vvvvw9g48aN8SsvXLjwy1/+MoAzzjjjtttu+/vf/w7gqaee2rJly8iRIxctWhSG4Xe+85133nln+/bt77333qRJk7r6Wd0oKSnROWsYhiUlJdu3b9efQJ577rnn3HPP1bOOdOCqCSEA7Nixwz25m9N6+ApERER9xmKU9mGf/OQndeOoo44CEEXRm2++OXLkyG6e0tzcDGDcuHHl5eXui7z77rvbt28fNmzYWWedpQvEa6+91i0QR44cWV9ff8sttzz//PNSSl2TuQ499FDd+MhHPgJAKQXgzTffBDB27FgdKAohrr/++vgpXf2snisrK/vZz35WuF9fzT/wwAPhFI4dHR25XA7A0KFD3ZO7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yCGzZs267rrr9J7a2toDDzxwwOrRBx54YP78+QDa2tq+853vXH/99Wl1bNeuXcOGDbvlllsuvPBCvWf58uWzZ8/euHHj8OHDB7gz69evHzdu3OOPP/65z31O7znllFOGDx/+61//OsVf2bXXXnvXXXeVlZUdddRROsZOpTPnnXfee++9t2LFirz9qXTmpJNOmjhx4tKlS/XD5cuXv/zyy9ddd11vO8NklIiI9lPr16/fsGFDXV1dvKeurq6xsXHAOjBz5syNGzdu3Lixuro63Y5t3br1G9/4hvsTd+zYASCXyw18Z8rLy3/xi1/E4zKllO+999748eOR3q/smWeeWbJkyf333z906NB4ZyqdWbdu3YQJEx5//PGbb7750Ucf3bVrV1qd2bRp05o1a6ZNmwZASgng3HPP1dVnbzvDCUz7Kze8g5mxJAumLnnRqb3npz+BSa/4Yw7lCu78mZOq05mu1Fls/abCTDRORnfnAJi5Sjofzdmtl4l2epmo3qOch14I2qm8h+5kplwSkQJmvSIThdpkFO5DmUSnkMqsXaSc0FTPqomvPxReiLBBnRLODCZnxpIKhMlEQwA2Hw3NJCTbSCYtqYybjAqRUQBEJGDnKsX5qJICQCCBeC6QXbXKLlwlEM/iMpOQzJvwV6zSSzWZR/47TKYOCW8dJzMJSUACEHZakggkAOFMTzITtmSgl/E3z9LfOvtc+1L6HRRp6x+s18/nZCZytba2AnCnVlRVVW3atCmXy2Uyaf7/48B3rLKy8vbbb48f/v3vf7/ppptOOumkyspKXUMMZGc+8pGPfOUrXwHw5z//+ZFHHnniiSfKysr0xehUfmXbt2//+te/vmjRouOPP97dn0pnmpqann322bvvvnvMmDFNTU1jx45dsWLFpEmTBr4z//u//wtg27ZtJ5100jPPPDNixIizzjrryiuvLCsr621nmIwSEdF+Sk+2KC8vj/eUl5crpdra2tLrFJB2xx544IFPfepTuVxOX4xOsTNvvfXW6tWrX3vttTAMdVKbSmfmz59/8MEHL1iwIG//wHemvb19+PDhF1xwwaZNm1555ZXXXntNSnn++een0hldcc6fP/9LX/rS448/ftlll912220XX3xxHzrDZHQ/FaehSII8pcyi98kJecvgFw4kjVPSqCAuzdkBpmbRe3frr+Lk3fPT3eaKZ6IA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b5OdAhWowClA9RLz+jJ56Hwa9iK7Mm2hnJ2m5/5/FSinNlROBen8ypIPOP8XrV/V/CeKUyYqZecYJSfkf8H0qd5cJfsNE8lzDZVcjNefNeJOswolIho09vQy/dq1ax966KFOvRrkHliyZMnKlSsbGxt37NixbNmyq6+++uGHH97D1yQiIiKiQW5Pi9G33377y1/+8ujRo+fPn7927dq+vUgURcuXL587d+7kyZODIJg9e/aUKVOWLVu2h30jj0JBKhfvM6Go+6ebF/HOtHmp/0fvLtxvz3f/xC+rhFIi72W7fNFuDill8tiuuiKdhoQwP1gJfY1ZuX+i+I/Sq0mpSOnL2DKCNDvNH/tQykjKSCopdX6rpJKRVJHU5/h/kv1KKiX1s/Qr5L2s6YD5ufrmrEmvnD9O/6X0353/3rv4AJX7uyn6AaLox26/G+5XQglzt073kP/bL/an2Pen4PxuvqkF/U2+4T35d0FERANpT4vRM888s6Wl5f/9v//35JNPnnDCCZMmTfrBD37w9ttv9+pF1q9fv2HDhrq6unhPXV1dY2PjHvaNiIiIiAa5fhgzOnbs2Msvv/zyyy9/4YUX/vu///u222674oorTjnllHPOOefMM88svFFVodbWVgDupKWqqqpNmzblcrlMJunhqlWrVq1a5T6xpaXl4x9P/z5g+5peBEGq24d9+DlFX6G7ILarncV6ln964dPjPf7ULW+PN7crGZtozy06+tO+hDdLKTktflaRPumfZoc7Cve5eqkm4WV3+gWF7YNwd8Lpef7bcX+ifiC6+3ycR6LoaV39zvbwl96bb9gefTntm+vdk/ZvHR0dpaVD0u4F7dduvPHGXbt2LVy4MO2OUD/rz6WdDj300OOPP/7EE08E8OSTT86dO3f06NG33XbbBz5x8+bNAMrLy+M95eXlSqm2trZ+7B4RERHtu5555pmnn3467V5Q/+uHZHT79u2PPPLIL37xi8ceeyyXy9XV1S1duvSMM84QQtx5553f+ta3Jk2aVFtb280rjBw5EsC2bdviPVu2bBFCDB8+3D2ttrY273UWL16s1IY9fwv7meROiT08tauHvXty16/Q5ct2c3axnuW/scKnx3uEc65w93gLJJl1l5wp3gJCifydyUvoCd0q/7mAUF196vbVhPfGnOWZINx3Yk4T7ovDe67X//hh/k/M31ls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owAAAJCGMAoAAABpCKMAAKA2KSwslD0EVCfCKAAA947RaBwzZsypU6ds2k0m0zfffHPs2LFq2Uv1bq1GmTt3boMGDfr27Xvr1i21saio6JdffrHpuXfv3pKSEpvGmJiYb775prI7zcnJiYmJuXz5chUGXMHNnj59evHixS46x8bGhoWFVWr7FV9lz54933//vRBiwYIFzp7neZcOgiCMAgBwL5WUlHz99ddXrlyxab9+/XpISMjy5curvOWlS5d++OGH1bW1munKlSsffPDBtm3bLly48MMPPyiNp06dmjlz5qZNm7Q94+LiNmzY4O7urm3Mz8+fNWvWE088UamdZmdn9+7d++DBgyNHjlyxYsUf/AjONtu5c+eoqKhDhw4565+WlrZjx45K7aLiq6xatapdu3ZCiPj4+NjY2DuOtlLDuCPCKAAA8tWrV++LL76YMmVKlbdw9OjRw4cPV9fWaqa0tDQhRGBg4JkzZ4YMGaI0JicnX79+Xdvt5s2bf//73z/55BOb1T/++OPBgwc3b968Ujv99ddfJ06c+P777//zn/9UyofVwn6zc+bMefPNN6tr+xVnNBqzsrJ8fHxc9LlLB0FRp3o3BwAAKu7s2bMHDhzo169f+/bt3d3dGzZsqLRv27bt8ccfv3HjRnR0dHZ29sCBA9XsJYS4ePFiVFTU6dOnvb29x48f37x58z179pw7d+7GjRsbNmwYN26cm5ubdmspKSm7du26dOmSv7//Cy+8ULduXYeDsd9s1QajrhUQEJCbm7tly5a33367cePGR44c2b17txBixIgR7u7up0+fHj58eGJiYn5+/tChQ9UN7tixo02bNgEBAfYjLCgoEELUr1/fzc1NbRw7dqyHh0diYqLasnDhwhdeeOHhhx/WrltSUhIZGbl3717l7RdffNG3b98OHToobxMTE0tKSoKCgux3OmjQoEGDBqWlpc2bN2/GjBkOD50qJibGzc1twIABasvu3bsfeOCB/v3733Gzw4YNCwsLO378uL+/vzqq7777TqfTPffcc+qKKSkpR48eHTt2rHIQjEbj9u3bn376aeWzOFzF9UHes2fP4MGDXX+uSh2EyiKMAgBwB0v2nSu4cevO/Rx5I7BjfXfHf9ueOnWqX79+gwcPHj9+vBBi9uzZc+bM6dKli/J69OjR33777ZNPPnn06NFly5ZFRERMnTpVCHHw4MHhw4c3btzYz8/v22+/Xbp06dGjR+Pj4//zn//cvn07Kipq5MiRbm5u6ta2bt06fvx4Pz+/hg0bRkREbNiwIS4uzmAw2AzG4WZbtmxZhcGoa40cOTIiIqJ58+ZvvPHGunXrwsLCAgICmjVrtmrVqn79+p09e3b48OGpqakzZsy4evXqgw8+KIQ4f/78X/7yF2cnlwsLC+vWratNovbS09O/++67/fv327THxcXp9foePXoobydPnrxmzRo1jK5ZsyYnJ8dhGBVCzJ8//9ChQ4sXL/bz89O2v/POOxMnTlROcCsSEhLWrVuXnZ1dp04dIUR+fv6IESMWL15sH0btN+vu7j5gwICvv/5aCaMLFy586623/Pz8WrduvXz5cnXXLVq0ePPNN8+cObNgwQIhxJw5c37++efRo0e7WMX1Qd65c+frr7/u4pC6Pgh/HGEUAIA7+Dgh/WLBjaqtO7l3e4cSOTcqAAAgAElEQVRhVEmizz333Nq1a/V6B7PmNm7cePLkSSXYdevWLSoqaurUqaWlpVOmTOnbt29UVFSdOnWKiooGDhw4ZsyYhISE7OzswsJCm6tzCgoKpk+fPn369I8//lgIERcXFxQUFBMTM2zYMG03F5ut2mCUtdatW7d///6AgIDff/999uzZf/vb3z744AMhxKFDh5544olu3boJIUJCQqZNm7Z79+4xY8YIIbZs2dK4cWNtVU/LaDTWr1/f9QGfMWPGJ598Yp+2f/rpp969e7te16H9+/fv3bt3zZo1Op0uMzPTy8tLXbRx48Zhw4Zpw+jYsWMXLVoUHx8/cOBAIURUVJROpwsNDa3gZvv06bNlyxYhREZGRnh4+Ouvv65c1XTy5MmePXt6enoKIZo2bbp69eoRI0aEhITk5+dv2LAhKSnJw8PDxSouDnJJSUlycrLDOnQFD8Ifx5xRAADuNSWJtm7d2lkSFUKEhoYq4U8IMWDAAOV+RidPnjxx4kR4eLhSePP09JwzZ86+fftyc3MdbuSnn37KycmZO3eu8rZ///6RkZHqZlV33GzVBjNu3Dgl5Xz33XdFRUVvvfWW0t67d+/AwEDlddOmTfv16xcVFaW83bx585gxY5zVPgsLC5Xano22bdsqJc9t27a1b98+ICAgOjra19f3ySefXLRokdInJSWlY8eODjdro6ioaNeuXVu3bk1JSRFCGI3GRx55ZOHChR999NFXX33lel1/f38fHx/143z55ZfBwcGNGzeu4GY7duyoLN2zZ4/BYFAvbO/atauSIxXDhw8PDQ196aWXJk2aFB4ernx2F6u4OMixsbH9+/fX6XSuP1elDkJlURkFAOAO3gjsWOXT9A3qOfirdsaMGb169Tp48ODhw4f79OnjcMX27durr9XAqlzBM2zYMLXl5s2bQghnN9xJS0tr2rSpEoYUDu/142KzTZo0qcJglLXUk+Dp6ekPP/ywtqjZuXPngwcPKq9Hjx49Y8aM4uLi9PT0EydOrFmzxuFnEc4roz169OjRo4fRaPzoo49++uknIcQbb7wRGxvbtm1bX1/fkSNHenl5ZWdnP/nkk862rBUYGPjKK680atQoLi7O19d3yJAh2jmyQoj333+/qKhICJGXl7dy5UolpoeFhSmfd9y4ccuXL//000+vXLmSkJCgzlK942aFEE2aNLl+/XpBQUFGRoaXl5c2efv6+n777bfq22XLlnl7ezdr1kyN+K5XcXaQd+zYoY25zjgcbXUhjAIAcAev/0+H6t3gnDlzFixY0KtXr7CwsGPHjjm8oshhxdTDw0MIsX79eiXtqZydNnV3d7e/12YVNlu1waifq169esXFxdo+2uvfQ0JCpk6dGhMTc+TIkc6dO7s4ZeysMqpQTlI/9NBDQog9e/Z4eXmdPXtWr9crVzK5ubndvn3b2brq8EpLS69everp6dm3b9+2bds67Hz79m11UyaTSXltNpuVlrFjx4aHh+/fvz85OblNmzbKxUwV2awQQrl5qpubW4MGDWzu7W9zAOPj44uKiq5du3b48GHlZlWuV3F4kE0m088///zZZ585G8+9wWl6AADutWeffdZgMERGRqampiqzOStIuf/OrVu3HrfIz8+PiYl54IEHnPU3Go0nTpxQW4KCguz3WNnNVnatLl265ObmpqamKm/NZrN6FyohROPGjYOCgrZu3frll1++9NJLLvboYs7o8ePHU1NT1dmZ7dq1+/vf/z5p0qRvvvlGOR/dqlWrnJwctb9Op7t27Zo6nuPHjyuv9Xr9gQMH8vLypk+f/swzz5SWltrv69133128ePHixYsbNWo0c+ZM5bU6B6Bjx469evWKior68ssvJ0yYoOT4imxWCJGbm/vQQw/Vq1fPx8cnKytLPWJCiPj4ePX1lStXwsLCFi5cGBoaOmHCBCXZu17F4UFOTEzs1auXs7sr3DOEUQAA5OjRo8df//rX9957LyMjo4KreHl5jRgxYtasWYcOHSouLo6NjR01alRWVpYQwmAwXLx48erVq2qJTggRFBT02GOPTZw48fTp01evXv3www8TEhLsz1a72GzVBmPj2WefffTRR1955ZWzZ8/m5+e//fbbmZmZ2mrrqFGjtm/fnpWV9cILL7jYo7PKaGlp6cyZM7U3Y3/llVdatmy5b9++Tp06KS09e/Y8efKk2qFNmzZr167NyMgoKSmZN2/exYsXlfabN28ajcaZM2du27YtJSXFaDS6PggOjR07dvPmzUePHn355ZcrtdkTJ0707NlTCBEcHNyuXbvQ0NDk5OS8vLwFCxYkJSWp3SZPntypU6cZM2YsW7bMaDQqc4JdryIcHeSdO3cGBwfbjOH333//xpr9A8OqF2EUAABp3n///SZNmkybNq3iq0RGRvr6+vbp08fT03PQoEHPPPPM0qVLhRAhISEpKSnNmzdXC35CCL1ev2PHDpPJ9OijjzZv3nzBggUrVqzo1atXxTdbtcHYMBgMO3bsyMvL69SpU6NGjVJSUsLDw7Un94ODgw0GQ2BgoItT2MJ5GI2MjAwMDFRz561bt7799tsNGzb4+fn5+fllZmYKIQYOHHjkyBH19PqiRYvS0tI6dOjQoEGDjIyMWbNmKe0mk2nJkiXBwcEvvvjiihUr1Hu1OhQaGurwFvqjR48uLCzs16+fOmOhgptNSkpSLsN3c3PbtWtXYWGhn59f48aNN23aFBERofRZu3btjz/+uH79er1e36hRo4iIiGXLlh04cMDFKgr7g/z9998/++yzNmNITU0Nsfb555+7OAh/nE7730+1zvz5883mS+/Mr9yjWgEAlfXeu9FC6J09tLq2Uz5X7fp0ubm5586da9++vTYMlZSUFBcXN2rUyL7/+fPnr1692rlzZ+VeP5XabNUGo1VaWnrz5k03N7czZ840bNiwVatWM2fO/P3337/44gulQ35+fqtWrSIjI5VbrjozePBgb2/vTz/91Kb966+/fv755+vVq+d6nF27dv3oo4/Ue78XFBScOXOmQ4cO2gu8JMrNzW3fvv2ZM2e0t+tPT083mUxqzq4IZ6vYHOSSkpLExERnt1atsir8mriACQCA2qdJkyY2lw0JIdzd3W2exq5q27at66Kji83+8bWysrLatWu3cuXK6dOnCyEuXbq0efPm5cuXqx1Wr15dt27dESNGOFzdZDINHz585cqV58+ff+qpp+w7KLd8v6NZs2atX79eDaMNGjR4/PHHK7LivbF58+aQkBCbB0dV8HZUFVnF5iC7u7tXexKtGsIoAAC4u9q2bTtnzpzZs2dv2bKlefPm+/bt8/f3HzVqlBAiMzNzwIAB586dW7VqlbOqrcFgcHd3f+qpp/Ly8pwF1op4+eWXV69e/euvvyr3269Rbty48dlnn/344493Y+MVOcgSEUYBAMBdt2jRojFjxiQlJZlMpilTpjzzzDPKjdabNWs2c+ZMX1/ffv36uVh98+bN0dHRAQEB6r1Lq8BgMGzevNnZAwLkunz5ckREROvWre/Gxit4kGUhjAIAgHtBuTW9TaOnp+drr712x3U9PDwqcm/2O3rkkUceeeSRP76date+fXvtkwWqVwUPsiw1KIyaTKYTJ06cP3/ey8vL19fX2ePRAAAAcN+oKYEvIyOjZ8+e/v7+48eP79atW58+fZQbMQAAAOA+VlPC6LRp0/Lz89PS0vLy8k6dOpWTk/Piiy/KHhQAAADurhoRRq9fv/7DDz/87//+r3IzAh8fn/Dw8MTExJo5xRgAAADVpUaE0YKCgsmTJ2tvdlVUVCSEUB+TAAAAgPtSjbiAqUWLFp999pn69sKFC8uXL3/yySdbtGih7RYZGRkZGaltad26dffuVveGBQDcDUVFRZ6e9WWPArinnD19FNWrRlRGtb766quAgIDbt29v2rTJZtHw4cPXWOvcubOUQQLAn42Hxx0etIgKunz58pgxY3777TfZA6mJTCbTN998c+zYMdkDEUKIuXPnNmjQoG/fvrdu3arst5aTkxMTE3P58mWHS2NjY8PCKvck84qvsmfPnu+//14IsWDBAmfP5HQ9vHtPThiNi4urYzF37lylMT09PTAwcMKECePGjUtOTra/21arVq26W+O/VwDg3tDrDbKHcJ8wGo1ff/11Xl6e7IHURNevXw8JCdE+JlSWK1eufPDBB9u2bbtw4cIPP/xQqW8tOzu7d+/eBw8eHDly5IoVK+w7pKWl7dixo1Ljqfgqq1atateunRAiPj4+Nja2CsO79+Scpu/Vq9cvv/yivG7WrJkQ4vjx44GBgX369ElNTfX29pYyKgAAIFG9evW++OKLKjyNvdqlpaUJIQIDA8+cOePu7q68raBff/114sSJb7311qFDh/7xj3/cy7vNG43GrKwsHx+fmjk8Z+SEUU9Pz65du6pvS0tLR40aFRQUtH37duXhYAAA3N927dq1b9++Jk2aBAcHd+nSRWn84osv+vbtqz7xMjExsaSkRL3A9/Tp09HR0RcuXPDx8Rk3blzDhg2VPvn5+UOHDlW3vGPHjjZt2gQEBAghkpKS9uzZk5ub27p16zFjxqgPH9q2bdvjjz9+48aN6Ojo7OzsgQMHDhkyRN1CSkrKrl27Ll265O/v/8ILL9StW9f1XhQxMTFubm4DBgxQW3bv3v3AAw/079/f9UgCAgJyc3O3bNny9ttvu7u7K59LUV3jV9ovXrwYFRV1+vRpb2/v8ePHN2/e3Nm3U1BQIISoX7++m5vbHb81G4MGDRo0aFBaWtq8efNmzJihfpXfffedTqd77rnntOM8evTo2LFjlb0Yjcbt27c//fTTyr8ADldx/UXs2bNn8ODBzj6Ui+HJVSPmjCYmJqalpXl7e69du1Y7JfT69euyhwYAgChKWWL8ZX7V/me+ZbTf4Lx581577bXMzMzIyMgePXp8++23SvvkyZOTkpLUbmvWrPnkk0+U1zt37vT39//8888vXbr03nvv+fn5nTt3TgiRmpo6cuTIwsJCpdv58+f/8pe/XLx4UQgRGRnZt2/f6Ojoq1evrl69ulu3buppydmzZ69cufL5558/c+ZMXFzc0KFD1SuJt27d2qNHj+jo6NOnT4eFhQ0YMMBkMrnYiyohIWHMmDHqnXDy8/NHjBiRkpJyx5EsXbr0iSee2Lp1a0lJyezZs3/44QdlUTWOXwhx8ODB//7v/161alVOTs7y5cu7d++enZ3t7BsvLCysW7euTRJ19q3Zmz9//l//+tfFixcPHz5cCLFw4cKnn346Jibml19+efbZZ7/88kulW4sWLd588813331XeTtnzpx//vOfrVq1crGK6y9i586dISEhzkblbHjS1Yir6f/9738LIZYsWWLTPnToUA8PDxkjAgCgXFHKx6bii3fu58gDnSYb6treiOA///nPyZMn69evf/369cGDB7/22mvPPPOMTfTRKi4unjZtWnBw8KZNm/R6fW5ubu/evd9+++2vvvoqJCRk2rRpu3fvVh7dvmXLlsaNGyu1tKVLl44cOXLr1q1CCKPR6O3tHR0d7efnp2xz48aNJ0+ebNmypRCiW7duUVFRU6dOLSgomD59+vTp0z/++GMhRFxcXFBQUExMjIu9qMaOHbto0aL4+PiBAwcKIaKionQ6XWho6B1Hsm7duv3792uLrIpqHP+QIUOmTJnSt2/fqKioOnXqFBUVDRw4cMyYMQkJCQ4PuNForF+/it/a/v379+7du2bNGp1Ol5mZaTabw8PDX3/99cWLFwshTp482bNnT09PTyFE06ZNV69ePWLEiJCQkPz8/A0bNiQlJXl4eGRkZDhbxcUXUVJSkpycbH8YXQ/Py8vLdf97oEZURsPCwsyOKP+GAQBwn5k1a5aSdTw8PN55553ffvvt1KlTLvofOnQoOzt73rx5er1eCNGkSZPp06dHR0ebzeamTZv269cvKipK6bl58+YxY8YoCSkhIWHjxo1Ku8lkqlu3rtFYXqYNDQ1V/54dMGCAUmz76aefcnJy1GuL+/fvHxkZ2bJlSxd7Ufn7+/v4+Kh9vvzyy+Dg4MaNG99xJOPGjXMYoapx/CdPnjxx4kR4eHidOnWEEJ6ennPmzNm3b5+zx+s4vKmTs2+tqKho165dW7duVcrARqPxkUceWbhw4UcfffTVV1/t2bPHYDCoF7Z37dpVyZGK4cOHh4aGvvTSS5MmTQoPD+/Ro4cQwsUqLr6I2NjY/v3733G6o83wXHe+N2pEZRQAgJrM0/eN0lsFVVtXX7eBfeOjjz6qvu7WrZsQIiMjQ6352Tt37pxer+/UqZPa4uPjc+PGjUuXLj388MOjR4+eMWNGcXFxenr6iRMn1qxZo/Rp0KBBREREUlLS2bNnU1NTbbapvWuNknGFEGlpaU2bNlUSpEK9o5CzvWiNGzdu+fLln3766ZUrVxISEvbu3VuRkahzZG1U4/iVS9GHDRum9rx586YQ4vLly02aNLHftcPKqLNvLTAw8JVXXmnUqFFcXJyvr++QIUO0E1jfeOMNLy8vbbT19fXVnuJftmyZt7d3s2bN3nrrLaUlIyPDxSrOvogdO3ZoY64zNsOrCQijAADcgafv69W7QXXOn7BcK6PNT6ri4mLlxYMPPlhaWnrjxg01oCiLlMlsISEhU6dOjYmJOXLkSOfOnZUq4+3bt/v06VNcXBwWFjZ16tTHHnvs+eef125cjWVa7u7uJSUlDsfscC82xo4dGx4evn///uTk5DZt2igXM91xJOoFRlrVO37lQK1fv94mejo7Se2wMurwWystLb169aqnp2ffvn3btm1rv6kGDRpoVxSar1URHx9fVFR07dq1w4cPP/HEE3dcxeEXYTKZfv75Z+0jhGoRwigAAPdaXFzcoEGDlNfff/+9wWBQbsej0+muXbumtJvN5uPHjyuPd1Fqcvv371enaSYkJLRo0aJRo0ZCiMaNGwcFBW3duvXQoUOvvvqq0uHw4cPJyckHDx7s3bu30mJzvZFDPj4+RqPxxIkTjz32mNISFBT03HPPvfHGGw73YqNjx469evWKioo6evTohAkTlLxYtZFU7/hHjBghhLh169bjjz+utMfGxiYlJalvbTisjDr81vR6/YEDB6KioqZPn15SUrJ3716blOzj45OVlZWamqrecSk+Pl5deuXKlbCwsIULFx47dmzChAnJyckeHh6uV3H4RSQmJvbq1cthrK/5asScUQAA/lQiIiK+/vrrgoKC3bt3z50798UXX1RuM9SmTZu1a9dmZGSUlJTMmzdPjV/KueCZM2ceOXKkuLh48+bNq1evnj17trrBUaNGbd++PSsr64UXXlBalFrg4cOHb9++nZ+fP2PGjPPnz2dlZSmXljsTFBT02GOPTZw48fTp01evXv3www8TEhKefPJJZ3uxN3bs2M2bNx89evTll1/+IyOp3vF7eXmNGDFi1qxZhw4dKi4ujo2NHTVqVFZWlrPtOKyMOvzWbt68aTQaZ86cuW3btpSUFO2sVkVwcHC7du1CQ0OTk5Pz8vIWLFigvWHC5MmTO3XqNGPGjGXLlhmNRmW2q+tVhKMvYufOncHBwTa7/v3337+x5npqsiyEUQAA7rV169ZNmTKlYcOGw4YNe/rpp9VnDi1atCgtLa1Dhw4NGjTIyMiYNWuWusqmTZuU20l6enqOHz/+1Vdfff318skDwcHBBoMhMDBQPVPcvXv3qVOnzpo168EHH2zevHndunU/+eSTbdu2zZkzx8XA9Hr9jh07TCbTo48+2rx58wULFqxYsaJXr17O9mJv9OjRhYWF/fr1U8+AV20k1T7+yMhIX1/fPn36eHp6Dho06Jlnnlm6dKmz7TgMow6/NZPJtGTJkuDg4BdffHHFihXam6Qq3Nzcdu3aVVhY6Ofn17hx402bNkVERCiL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" + }, + "metadata": {}, + "execution_count": 14 + } + ], + "cell_type": "code", + "source": [ + "b = Observable(Array(vars.b))\n", + "\n", + "ke = Observable([Point2f(KE.t[1], KE.data[1])])\n", + "b² = Observable([Point2f(B.t[1], B.data[1])])\n", + "\n", + "title_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n", + "\n", + "fig = Figure(resolution = (900, 600))\n", + "\n", + "axb = Axis(fig[1:2, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = title_b,\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "axE = Axis(fig[1, 2];\n", + " xlabel = \"t\",\n", + " limits = ((0, tf), (0, 2e-2)))\n", + "\n", + "heatmap!(axb, x, y, b;\n", + " colormap = :deep, colorrange = (0, 1))\n", + "\n", + "hE = lines!(axE, ke; linewidth = 3)\n", + "hb² = lines!(axE, b²; linewidth = 3)\n", + "\n", + "Legend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward and create animation by updating the plot." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min\n", + "buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16\n", + "step: 0500, t: 15.0, cfl: 0.588, walltime: 0.13 min\n", + "buoyancy variance: 1.83e-02, buoyancy variance dissipation: 3.97e-11\n", + "step: 1000, t: 30.0, cfl: 0.571, walltime: 0.23 min\n", + "buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.08e-09\n", + "step: 1500, t: 45.0, cfl: 0.575, walltime: 0.33 min\n", + "buoyancy variance: 1.83e-02, buoyancy variance dissipation: 8.29e-09\n", + "step: 2000, t: 60.0, cfl: 0.577, walltime: 0.43 min\n", + "buoyancy variance: 1.82e-02, buoyancy variance dissipation: 9.89e-09\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "record(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n", + " if j % (500 / nsubs) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, (time()-startwalltime)/60)\n", + "\n", + " log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n", + " B.data[B.i], Dᵇ.data[Dᵇ.i])\n", + "\n", + " println(log1)\n", + "\n", + " println(log2)\n", + " end\n", + "\n", + " b[] = vars.b\n", + "\n", + " ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n", + " b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n", + "\n", + " title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " SurfaceQG.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 15 + }, + { + "cell_type": "markdown", + "source": [ + "![](sqg_ellipticalvortex.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Let's see how all flow fields look like at the end of the simulation." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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+K4yLkpkuchycWli//79P/uzPwsAH/3oRwHgE5/4BAD82q/9mju7rVycG6GAnlwsEQpY3Ko3NjZgB0KxpISLTC70+a7ABQxnsQaAhz/84QBgrb3lllue8Yxn/M7v/M7ll1/+yU9+8pprrjl69CgA7N+/v3Pta17zmne96111XV999dXPf/7zd3K7ZzzjGZ/85Cc/8pGP/Omf/ukOZaaD8Xj8zne+s59+7bXXvvvd7waA9fX1t7zlLaPR6Prrrz98+PCdd9550003XXbZZZA0bje5AYDV1dW0ECecp1fC5ZdfDgDuXWVclLjuuuuyXGS5uDTxG7/xGx/60Ic+9rGPveQlL/nnf/5nSAjWTuRirwkFLG7V8/kcdiAUS0q4yOQia7BOH/ED33333e7Hvn377rrrrtXV1cc85jG///u/DwDj8RgAXLNL8Y53vKOuawD4+te//m//9m87ud1Tn/rU8Xj8ta997QMf+MC3vvWtH/mRH/mhH/qh3XqWw4cPA8CDHvQgF27k4MGDTshns9mVV14JAN/97nddzjvuuMP9SF3QzrAE937cu8q40GGtdT+2trbcD2bOcpHl4pLFk5/85LW1tS9+8Ysf+tCHjh079shHPvIHfuAHYMdysdeEAha3ahcYcluhWFLCxSYX59tGeeEh+mA9+clPdl6Ez3nOcwDg8OHDInL77be/7nWve/KTn/zTP/3T1trPfOYzAPDEJz4xLeHmm29eWVkBgMc//vEA8JCHPCT6673vfe/7+7//+5tvvnnw1s727FTEr3zlK7e9xC27ff7zn+8Onf62j7/927+97bbbnJ37K1/5ioh8+MMfBgAiOnbsWPTK/O///m8R+bM/+zMAeNjDHta5+2mXICIvfOELAeDNb37z6X6TjPOP6XTqNPlveMMbROSOO+5wPabzwcpykeXiUoYLSfCgBz0IAF796lfH9G3lYneFYvlVqVwsEQoRWdSqnaFzW6FYUsJFJheZYJ0yIsECgAc/+MHOwx0A3vSmN83nc+fhO5vN7ne/+917773z+XwymRw4cMAtIRERZv6pn/opAPjf//t/b2xsuIAfL3zhC91Z1+b+/M//fPDWzl0RABAxujouueS3f/u3AeD+97//a17zGhExxvzTENy6+mc84xkAsLKy8vCHP9zZv+MI9JSnPAUA1tfXH/awh7nbOTHr3P30ShCRxz72sZA4R2dcoPixH/sx1z6vvvpqrbWzAjz96U/PcpHl4hKHc8ByTTQul9tWLnZdKJZflcrFcqGQxa16h0KxpITlhcgFJReZYJ0yIsF6xSte4UL779u371WvepWIbG1tPfvZz/7FX/zFpz3taTHoiGsrn/3sZ93hG9/4Rne5W1Tyl3/5l46533jjjRKa4KLQQfP53Jmff/InfzImLrnkM5/5jFO3brvsVkTquv7d3/1dZ/+eTCYvfOELp9OpO7W5ufm0pz3NqX/X1tZe9apXxXExlZnTK+HYsWOj0ehBD3rQtjXM2OP4whe+8JCHPAQAiqK44YYbfuu3fssRrCwXWS4ucVRV5QaLxz72sTFxW7nYdaFYftWuyMUOhWJJCcsLubDkIhOsM8W3v/1ta+2SDP/0T/8EAM973vN2WOATn/jE97znPYvOPuEJT+jPP5Zfcvz48aqqdnh3Zr799tsHn8hae/vtt8eGvlslvOlNbwKAHe7PkLH38Z3vfGc2m22bLcvF8hKyXFyaOCW5OA2h2PaqXZGLHQrFkhIWFXJhyUUmWOcCj370o9fX1+++++5tc771rW89dOiQi9vbwW233fZ3f/d3RVGUZfnd7353J5fsfTDzD//wDx8+fHhjY+N81yXjXCPLxSJkubiUsUO5OA2hWH7V3scFJxeZYJ0L/Md//AcRveQlL9k253Oe85wvfelLg6ee+cxnOnXxi170oh1esvfx/ve/HwDe/va3n++KZJwHZLlYhCwXlzJ2KBenIRTLr9r7uODkAkUEMs4+brrpJkR0EdJODx/96Ee//vWvP+IRj7juuuuc+/BFgP/5n/85evToIx/5yPNdkYzzgywXg8hycYnjDOXiohQKuADlIhOsjIyMjIyMjIxdxsXDbTMyMjIyMjIy9ggywcrIyMjIyMjI2GVc2HsRvu51r/vSl7607eaXGRmDuPXWWx/xiEe4uMAXE7JcZJwJslxkZPRxGnJxYROsL33pS7fe+rUHPKC7Zeyuw1pLhIgXmMKP2QIAkTrfFTk1iDCzj0p3VnHrrf/3bN/ivOBLX/rSN7/xjfvf975n+0bGWkK84Lxo3W6J/QYW3VHx3NZnh2BmFtFnXy5uueWWs32L84IdysXOvJIl/u3nt9biOZcLbP2BJa140YlFcjGEZY8/nPOswQXKUkptK7g4fH6n4n4acnFhE6yrrrrqAQ8YveSlN5zvimRckHjZSwHxrLPzc4+rrrrq8KFD/9//+T/nuyKnBlnc1W3bjce1OohNISKCvk9FV0jIJuFeSO1O193IZ8OB+qRpsVZDGS9s6LI831XYfSySi07rStZ9CUSCILDo76KmKafFPrCXvqht4RBfQIQu1/KtE3vZkpPbVAqC6PSfSDqvK/zt51tc+Cmj/5C9gyGimb6cfknDGdpZT1UuLmyClZGRcSFC4j8AEHr5hhgtIC6ujx6chrpEEWARZmkSBRCBEDz18sumMQxjYtkde6bl6RgiJGQrvWNat1i99HGSxO4DZmR0gD3GsRM1amifTbaU9QMunKr0ZUdATqVxImDKQNM2PkjLmor0n/QsYMkc7fwgE6yMjIwzggz+PLUShsPFJP13VCqBtNkZphNmBEJUijoqABdQmds6BXScizxPcnUIOaTJlKrHkr8CPjsiICaFDLHDzsQ/860LDKferoeUOKdW5BKmFWYJOJB5YcsSAEwVvXAq7XCBvg4BezqtQeWbdOdUZ4aESC3iVHuDa2WClZGRsVN07SOnV8jQ1Zh0mC3GlNw71QjFWgh4bZIAiIBhjmQNPfFxIxEiADemjpZZkQCIHNXCSKoC4WrUa9HA6Ap0F4iACDBwxxAjwE1120PZ9qajUNQeGCMydh87l58lmqjA79tZlmivUhHzP7z0bFs1RKf77WqwurI8eIhnRX+1NxjUNsgEKyMjYwBnzqWGiNTgtFwEQDhJSL2owE/WEZEQEiVTUmKgQYFHgYgIADO7FAxki5DSlSp+rzAQETDW+huBZ0SRlnWrje6GYXhqagEAktCsBeywhwVah0VKkMVKioxzjAWfddf8jBbe19mtB72wfI6GNgXtUeBHy9VXidIJBhhU+yadCyVJDXLgRLFJbJd3+izptK5caj89s/oMIxOsjIxLEWdu12su3kEf3M3S77exMfalJjlvehPhoa4+8qdQExEAFnFkyymlIgcSgZptf8hwDliKyKnBIntiblUck/E0LTbeGvqJTSUHHI2XvIylxpsdbr6BrT8ZC7D8ZS5X0Cy9cjjvzksYNLV1yu9aCocuD66CGP0UvRIXJcwDFmuwYuGN2MhQ1tQAGP0bk2mPNyUOSH3/nq1TSzFEh/pp51PVlQlWRsbFid5UcZeK3aYkGT5YfJXvm9lb1FJewIHREAIFx95mRux/NZY+95tZolOXd7RyAKBgNZQwP3dZrYj1ZYRlh4n+KtYy8Krg/h4Pm7mx51nQ6dQHfVCw83Ohxuu0dFYLqG2vahm7i4EP3Tp12mUOfbaFX7Lln8Xgmzy26djwMtmkpkMKrI6mKklsRKEpXQQWPvcOue22rXURg+qlD2Q8y+wrE6yMjIsSQ/PFMytuu/IWsKl0cOiV0C+ywwvcdczhcZIpdfwb6JQgAiGWWjkmxOLtE1H7Ff94rRISBtLGTUGOgUn0NmmewN/FK9X8SwnULeRcOBo2GFZnLbyw45t8xtjNhnGR4VR0VLtSyk6xwJ43RBgS9o/dTEnokp3cNDZ1V3ZvgtBXazXJMpSxc30r2wJKtZADhUnN0kc4v8gEKyMjo4Wd66i6GZfwJ5Fe/9zOtshjK6iOYl/P0JpZo2dKvhdnkbo24ulP430FgdVEQ0mcXXteE/yuJEnq+VJB++ZebSYANvGsDw88jI5SrJMY2F83sztaUuheHmb2Nk5D1btQO7isJe/s/h4L2HfnTNDTNpSpMVNDtyH2gzwlbX+4Nm0NVurhPiTOUVylMQ0Oy8ES7Wo3HZuEoalHkwF7if1s5xyZYGVkZADsSEfVyrGYZy1ICJEM+hkWzHD9aOFoU7+nDiqn4KaO4KIuaNXopaA9wMTlfJ3BxmmwXFHNrF9E0gEikJgYkcFd6WhZy1mlM+ANj4694a79toZGlsW6sTT8RKZau4Od+3dvV9BpFNLjGJ0zqSFbklbnlargrdXYJh6CrahXC0yEierJLx6M1ydVaDJ21vdKY0Uf7gmklXkbtIVhWL0b3sJOW/6541uZYGVkXLrYGalqZVrCq9ppLevBwFy/rQdqYie2Vx2FEQIbt6rQN1LkNejZUGBUItDEDhXf3Tv/946rV6PWUkRxWi7SXIKxHmHIFZDI1QKTAxZu+JtjZtDcYmAtvfs/Hexa9Wpd3x5tF4+90FQyebX9LBmnggV62mH11Q6Z13CuBQN/L7lRgnb1pskVriEn62Gbs205Wl6zhmO1WFQ8TvOnfcM2vcPg8WIMaqouAGSClZFx0WLH/Gnguu6v4eMF9pVTsQZGTjRwkQALAAiHOTMiRpbjYrZb5qh5orAeEDBovVosDjrKIPT0y6mvgmWjMxolz5PotoDBOw+3NFhx7VRnaVbqBDYUIDLSJukRLey/4uT6BSNveut+Wjf7BTVmnTcs50/9hj2Qu9/wB2/SxqCjFSTEXWCIaSXNOPU0b2lbB8K4d7VKfT/3bsoCptlLOZ2eaKDQgcjzYQVvQ78WE7KlFG3X+VsmWBkZFyGGTGo7um7g1/DxqSirYJBUuR+CQU+F4B2gJFFfEbpuU5i99xV67RQgEiFowqBDkiRMAyICAaX9ZdRwxRTnOu+9ryjlha0qJwOSz4MhoBD6QKPibgqQxoAMl3f41pDaocks6Z8kofv6fGqqJ2u/+x2MFNL5O3x46eCUNCrbpi0t7RSkU2JEhZ4aVMJK1raFGkLLkNhKF2iw+o2kp8HqJWFQGA+rr6SbsPv8fVgkToVJtc6eRbVYJlgZGZc4etRn2fEp8CpoT3YHM2DkPZ1pM7gTACCAoJCUBgAwlkWEmcUHDkWtVGoltMzGsm3iuWOMbgWwYAFVMxRBS3XUs7xgqLHnT9giUuLVYV31VcK3WsNk6t7S4nD+oX2mbkK35i1uhd1z3SsylqHfWgc56HBb32nJp8FfQ3PrKW98m4PYtv3OT6FZuomC+01BAZs2EulqyLBd10EmuVCq2xrjcIdFD3yai2MH6FVIx8VEq/3nXCETrIyMSwoDvd1Opt6nzataeYLWChIlFkDji9v2SvdXCIsR49aXKyIXEZRZrIixdmvOYSzx448mInKBQzujBUq7ZnF48RRNWqNBrEu/R/Y+Y4LxmVxJAoBt1gWJfqGjMkgHir5WS5I/wf7RSmj+dL5N12q4iNlmnBaGpxw7maWclk65VUzk6elaDY8mEq80cwMfBM5d1FrKG1P7fKRB4uTeV0y122iHRy161q7ea2nmAetoUlBPq9fjUOFXh1Vto9uSUyR8y5AJVkbGxYpl/fkOeFY/bRtq1XejanrlXh8auY+AC72wqLoCwcohALW1bvAolCoIUSsIvaVzxbIshtkyG4GwuWAyEIQeO6Y0ii6QVuYQ2irVaGFKaRz/wvStSGRdIb8vIPqNQbtvR+gafzqLENPbJazK13l4Lt9OXaDIWtI2MvcCaDMB6Z8ayD10Nmkbu1azVNACjcJEGexmEZTEC3G6HfR7RjVrN0LF2sFHhzVYLTFa1n6iPEHyEvuasoUts/ugHb1vu4COymo5OVqgxDqbSq1MsDIyLi3skFr1krcZKzpT084w0wpt0J+yYssPN2ZwYdeR/CARw4ECCItQWCcYr3QHmohFWMR6v614k5bNLwxN3vGr8aMPIwGni6fQPYWkGiYBwODC1QSah1gOLOm5O3vndIYJ6VknYWB8WDBg9N9IkrCsTt2MlxYWNd5WlkH11TJtzYLLermwfZh+raXaFhHwARn8sln0mtpO/TzH8o7grba1pPygwUoEt6uCSl9AECEZkvBQSKcdyoLX3W25A77tMNj2T4svnS2SlQlWRsbFiYWd+tIB9JRJVXJO2ifSXlZ6KUnJA54ejk5Z612plCKFWCgaaSUAzDI3prIsIAR+aHG+Vk6J5QohwmAmbE/FAUC6qwx9PkAAdvUnxD7P6ftNiednfq7dxJtoz6/TERR7wwxGFVVjzpGYo6U5C3+8igDbCe17DXy2BSbDjO3eS5f5hOReq28OFpq+Bhv8AEIDa6UlIUIgND8Jkw8Ku0JhophCH3EXYtNIIzUMrSX0mZomONwxRMYUu4D+gy2kn22RHNbDNk+dKO26GVtK4A4bkygo6WREBHBBEPjdpVqZYGVkXDLYbmgdmMQvvmTpCNKlZIGLILanu+4kpM5XzfCAQMACzDKratfxlVpppTTR6qh0VxjmuBW0u4oQnAbLWE6798iVMDmMQwezxHq6E+zm7k3cLMTE9cWNazFGQ6LBEvBOZUsMEQjtkULabKyt0HLEb8Bu2FNowTKdVjdXxkIsVmHtKFtHVdM9sz3DTaUvMu6QFp3WAZ2fYdS0sgizEA1EumUJWtXeGoyFOrLogdWZHrUVWAtCXg3y0Z1pv2Ot2zOFhBsOyVbS6AWGQjacD2SClZFx8WJnyoqF0+ltxomhuXtHqTWouwr2PncU/XAlKK4kUCVN5KyHiFBbtsxbVU1oFNFIKxdo1IXDssLGepueCrN4hSidAIzJgsWmAs5SmISDluYZIlvyV/ixzesQQrV9mAaICiyBZl+bUDYmA0Dc6LBhWn7qHabjXSI0tImcz9PK2vAuSJM7GNJsXYLYiXxI+59FBfR+DeVezMj6vDcKIabsQQDC4lUrwuLX0ipFAMCMhv1WUq4NIwgRJs0yuMkPKY0Gqp1OiLr6rMRc2GNISQ8SG/3OOqP0+raSKXlFfaVbl0VJ9+rtbnd22n8mWBkZFylOQV/VS1g21RzqSfu8qnMupocT0b7Gwcs9eqiKCAswMAdjX6HU6kgpIgAwlo3lubEum+trCbHQihARkIXdVN646xOukfaiiZUFXEBTbKfHk1HjFdRYYuNTeJ1ZWKrlR53gThwLCQNSWNoFCY9qdhjEaAjxG/+0edKCuN3xNYdpf/rCsVXCEpzK8HdxYzFBaudZMMHoi84QtegrbXq3Tuh4THRN07VzIGcahJp5VhsEIKJCUROvIbD/oPaB4OfeKINck0skA1sVkV48vThDGWRXUbwT74DBR+zfq53Ye0lBmIKc9rzzW8/h6WWq0kqmHghp+sDvXUMmWBkZlxaGBg5Z8LeX6dS0Vs3Y0O1lw1onCATF5RJI0gERnXZKZrUBAEW0b1KOCr0yIkRvEJlWdW2tsbw1r93g4TRY4LmQpKNHm3BJZHqIaWffBLmSxjYYtQKC0c0FwXkNW2H0MR2bMIxtDVZkXO7pU+rkiJrXMCRjgkSaBZ3uP2FxnQ/UKK969pGdMq1LC9vwyjZzWnRmh4U1mXoULPmNQUU0LKhupz90vN8ZxBUghFW0cddOaVqd4ybNAkP0ZGtgIUWnNn4m0FQ5tq2GSYWLFvmVJQxm2WPHvJ2r0rzNroMhr7SnTT3NVoc1nXVC1UUmWBkZlwSW8arkaNEYsSS01SLFlTQZ+gU0Hh7MHBPc31gEAipCEkFA51Z1z+aMXHxRIvQb46Ai8kSH2TDXFtDHICVKTCOSuJF7W2ES+Co1mjhK43gaJr0+RboTxpfWdLsZjryOqnO7YLNADOoIN7F2I6bLnHofu5d3GkZDgI4PSvJYmWltgx2xpEXap240qG7ORVLUzZ9a8NJrXFvkMANw7lZEVIRFrxh27TTCrt2ooF+ldmNp7jUUnhOixEZZDIs/kklQj121ng97KQOP21NZhV+pLCZ1GnBy73Covof7wH179sOzw7cywcrIuJixs+FiGbvqn1k0ZR9kV+AZk/cC8TokSbU9gejELW6iQikMNFrAMtfWbsxqy+IHGABCLLXSRFpRqRRoBQKG2bKwSG3tgPIMfGfaTGWlqZib8UuaEzjugSMYomUFfRcCOMJHFJmct0ZE1VcbgUWGITSdUUdW1h5HYpHxoKn6guD0ydfplNM7D2dlZLnA0Wr0XbPf4t/bkKm+4HQ+QZhbtAzpwfjc1WoJALMINstmEcHHNQHvMOgXGDZaq9Ru7ch7/+NjuHca7iHeWdrEa2Dq1HsTrWdNWmW77Xe5lEvrk7Bm40HoG/16twxMahnZGr54N5AJVkbGRYhOXxzShhMWkTCBxVPujuJqiFel01vxfxtOwRxcbtHb2ljECrMVG6JdAQACEuGk1FrpUaHXxqOQDgIgIsayYTbMJ2ZzZmER9DsVonJ/RGxgcLHyHI5i/5q6Ubnen1AS5yoQv7kzCApwJFDCLuIDNw4ujkqieKrWcuoKzAkF3NYnQe3gX4z4hFiL5oUOq7KCuRDaAxajiGIAACAASURBVEUzcrfG8M6n7uq0Llks98DuMqr+ErmFetx22YslLoYMaXnuRV/1hK2n/xjL1jIAjLQiInSGQo7S75e4Jm24XWCoeFBitfl3dMBq3Nmj6kpaj+wcs5JOIFSys3VCe1LTpZdRa5X8jW+6pVyOKX6jUghyFt5l8zsJyJBOVAR8+LDel4CQczeQCVZGxkWPodHjzNjV0Gx8uHg/bIAfOtyg4eblzpzBbkRAIECFSEoQxTJblsr6lYHGcqmVIhQBw1xbrox1/WihyBlBJoV2XMdYdhP32vh+nHuxtuJMnsJOhc5dHpMRTgCiRwv4qBFN1xv81tHFO/UarPDaMARz7C6Kj8NjdyV9mGynowC0unppLyhrDQLerWtgvGhN9KEzcHRGuEsLC6ViQatfmNIXh8Xsqn1x01oA/Iq9VHnlU8LnjQwMAdxmUIRYG3DCIsAhaIhj50417ClG9HRMWy+0bNktYuKBKMyh1oFnsV8RglG8pfv4PXVb970Mt0NpWr1rsg2b9K23JQ+JxEBbIHocC04Fu8avMsHKyLg40evg0jOtvwuy7Ex3lZzrOF1B0/12S3eLBgHAqa+iDcT/o4i0IgSciBhrZ8Yc25oJiEIaF4pcwGoEYbDClbVuvCmV924nBBZggDrZ8jmtDyBQ0IGRn+QDBctgXNUelV5x1xEOW+PEq9zjWhFrowYratf801L0ck81RmG0xGYEaI0UMX5i1/Mdmk1/2xwLABZaDAcZW/8TLji8hDDw5NL+2RGfpaIi7RTpZZJWvvZtB4UMwAcUFRQBrUgrcg2OWcC7tju9L4Vy/FSApYmmlsicm/ZAcDeU9KqmG0mnKMGILsk+CUnkEYgTDZe7/17CUYfMpXm87ipMKSARjTbHgq6KqlWjblPvTF92k0sNIhOsjIxLAP2ufUnGZYqrhj4lg80yauVnumEynTiVoxssDHs9UaBOYKx1k3JNNCrUwfHKoX1rlqW29uS8qg0bZgRUikpnBwSwLHNjnSN83OImUQeII0QUorNTJEPJUEOJXgkBMPiCefdhREr6YmfGdMwsFBJsIojJjiSJ3g4FvdsLYojQIIGm+Vq4S4LVxg0xp+b5DsljDH1H7LSAS1F75dDhP/1zvTMdyjRsKO/mG+BVS+Y+yepabNRaIuJ3JnDMyTJPq5pFNJEiH6ME/FpCEJHaePYTF9UG0XY8SrxhOrRG7DSioP/yx6kzVow+GisHPlwKBMVZ65UNPW0y3ei8Gz+tCInhF0btVmCBjTxEjtWzFS7WzSU5kmx9nnZm2EMEy1r75S9/+Vvf+tZVV111zTXXRAKekXEp4zTlQgZGB9g9dpWeW8Su3M9kM8DWaBFJjyayLFa4tpxQHwSQzareqmtNdNlkXGoaFRoBZsrOa7NZ1VyLU2v5LXEQ3Kth9nzOip8ma9VEt/YWlmCliyEdKFkw6DlPGBpUm2lBa9CSOOJgGK+aESiSOX8idvzJSOC0Yi2VgnjFFbQ6/PbEW7wJpa/KclVf7PyeaAnax63UvY7dHC+WEK2kxW8jOztgV32m0SJciaVQBEQYEQnQ6VYZxDIzACGOysL5XM1rAwCWxVaGCBWhm6QAIgVBsywY3BzdAxFEXoWIKbuKeqokWIq0xLmpemPRdK6E0jhf+feW7oTefcxOV4Px8eO0AtqGbYGWUyIkpyDlWNCShjSpq7jq8aizoM3aKwTrlltueepTn/rFL35x//79995774//+I+/+93vvuqqq853vTIyzid2Sy6Wjw1NnqVOV+1paedvcqY3948UBOJ6PBDLTgMkCkkRINDMWLZWAJy/riLSxDNjN+f1xrwaKVVqNSk0IJZagQ/KIJWxxrLvHAWiBgsRNaEboqKmSlEaFDQwmNDbRo2RO0vY7CYtACKiifwUHSSOvBi8uCDoluJI4O7kxhoB8asLvXYKERuaFVVZKCFTqFNgUn42j52xY2BUCd+h5/neQZdpxdSdNJfzirM0Xmz33MvUV4OFpHOQofQAFy9dBMArRAXEOv9EFBdfl9ymBQIiYox1vGhUaAhbc7JFZlQqNLxgwxYPIPLKqpRbdXzqMXEE808YpEmYoYuE4sQU36SDHMWrUsLf6kuCFTBGrIu8qlFHhXkHtJW3LQFYvL9gPA3QF5Szir2iJfq93/u9e++99+abbz527NhNN9109OjRG2644XxXKiPjPONM5EKS/7bP2VbsSzqYtNlVkrFlGZRE5RMnwcG7XCiofCyLZWbxqiMRqJktCyBMCr06KtfH5eqomBTFSKtRofeNyyvWJpeNR0S4VZm7Tm7dfXLr2NZss6qntamtjcoqt5xQAApFpValIkWkERXhSKuRVi6gg7uvItRERKSJCq1KpTSRJnQGF/KKNGQRF/EBAAjRRYdnEUJURIqipXHYpZ3DAsaI1iDTGGCaTyDNm03/b/5JS2sbXXsfOilwOaT33x7HWRwv0rfdUl9Jcqp1UprvFT5HQ8AT2ZLO65XIfVL7m2W2IgKNgLgm53I5h79pXU+rel77rQoU0UjrQisiR8LEWK6NrY01YTMEDMFE/JoMRBW2Qg+bpAuICLP4+/sHiCSt/YZcoW4nK26Zz+MFzgMydeB3DZhtQuAEgCFaJH2HIVE2wqtM2mba6EORzeuLQpLeIvZXbYacSlX34XYkN9tjTxCs6XT6j//4j3/0R3/04Ac/GAAe+tCHvvjFL77xxhvvvvvu8121jIzzhnMjF91BeyjL0OkWu+pQsqZTQxAAFrDsQig0vrTse2DXrYplmRszreuT83pa1YaZCFfLYm08Wh+P1sfl+qhcGxUjrXVYju78t2rHq5I6srjpKpZKjQo90sqtt3JbtmlFjmaFzGItG8s2+G9x7N/dLm9huZZz4SqUKhQJAHNUlUVW1VuD1VTJP29yC+j7pUnyYrscKxnfO99jGccCP6zsfc60c+yKXCx5Ib3BtkNz3Q/pnBq6MKql0tJ7FCLwl+brB9N2dOADcGFHSGG0QAMg1NbOa1NbG28bG7Avv9EcN8td3X+pS3u8s88LkQ8NeFBhqBYIg4DTEbtoJbEaQWkc9GGxxr4uCAA+nIS0Jm3xt0D3HbWlJPLVBRwLWg83gCUis3vYEybCEydOPPvZz77++utjyubmJgAYY85fpTIyzjPOgVy0R400Mf5qWwYXZh1OdtYKCb63/gwCATpO5KhV6I1RWIy1J2eWCAtFE+9qgghgRUSc9kuiYimwE6+UIkSFpJQzC6JKF6YH7ytXCVcxSoghN9Eao13Pm/+i23zD7dj5CAcPd/SWwmRAlTRwdtAi+OrEFYhhwAE31w8WDz/xX2D0SHJ0k9O/6alTXqi+l7G7ciGnMdAOiUR7vgGJviQ9m8iWE4VorA6yJiICSCCuIQqAtSLCRC6mriKLtWXX8GpjrYgmKbTyTDrIWWiViAAUTIKOV3VDuncolDeaJ5bv9JET/0KfFUGshWCDhLDb9KJW1/YP9G5hCGFXaScS4e0EMYwuYtFiCCFMqkSvxdRWGCrd+yGJzbF1qnU0IESnhT1BsA4dOvRXf/VX8fD2229/wxve8NjHPvbQoUNpts997nOf/exn05Rvf/vb973vnlDCZVyIYGalznclFuNM5OLA/v3LCx/QhHSpVStHb2hoxpKW5r3dW/sFgmEsEZfC4jpwRFSILNZYrpkVYqHUSllMyqI2trL23unc7UWIAM7A527PAi5AFnqHLVSIWrkAC0BIFNznMYQwdV1yuMgRvjDjFoBm6zYRlsQzBSGJ4GBZLDj7IAZ6B06TpagJLe3uET3i43ASUyi8YcI4nIWw2c4/C/wo5DhWM9ok7ifp+OU9XxKfd+iMELHwHYwcPOBts4dwJnJxxYED4WiIUKUC0GJRLa4kXfFo5g6NRiVlJm3TVKuwMEnwTlOhZVpoLHqFIsM8r61lVkQSlhNqItFKjK0tc/C4cx+Xwo6cccOo9mKL1tP6ptdY8RCxHUklVS+lei8Jj+snGCKWA68DIAUAwsY/mbsFsz9kbjRxYb0ICHT1atDcAcLEJ4imBK/EHscCCXFIu55X7VyD7lsLyZVlPlXCtCcIVop3vetdL3rRiyaTydvf/vbOqWPHjn3zm99MU6bTKcDqOaxdxkWGU5i1nl+cslwsJVg7fOzBbNL9MZArDDiBszQaLAhLovwkF+NeN8y1ZSuCXjcEhLhWFgJQWz45r6aVcSooTkIkOE92haQIi2QgCTUTZpCG2EDsoSVYOiTUV1w4dtfdO6dg9GsArfPvDYEkBKS27JUErg6KCMH6h/T6rGbdVkI6vVIhqrJ6k+eENqV6rHam5D13lBGLlqMvumBBrotXLhZi4SO3GnxfKZVOQqCb1PCtdpFpewAEEEdxAlEBBBHLbAUUUqGVBgQBY9myOGrlHLMQUBEBsFcDgwQhSAyCgbu1VgumzT8CsZEHjIZC9iyEwyJZ2/ZbT4yAqJRz5AJ3sTAiQrLAs9VA0U8rJLlrSqBShiee/0HoUWKGJDRv66jDk/q6q23Ry3nqcrGHCNY3vvGNZz3rWZ/97Gdf8IIXvPSlL11bW+tkeNKTnvSkJz0pTXnpS18qcsc5rGPGRQWiPay/Cjg9uZhubi4q0Hf6vb5CuodL+dXg5am3roDnK6GTCi5H3pDh580iisi5RjmKEvOzyMxYCJl9uGpxTh8QXdGdYwqFMQTDwCHgQrqDo0oAIOLtjBBMJ2FIc0OPD1DlPMMQQQRZxLpwEgCIzuedAXyAR0SsLaNz6GUWrznwhdtQTgw8kQzADcmLLAshjandCuke9Fhhph8tI23KFJKayToMmQu3XV2o9rJeN+D05GK+jGNF9EShddBjT+3Uvu6qT7zcN5V4EDMG25b7RG7zKMXefXBaG/C74qA1XBuOek9/P3QaXIiOg9HdKuhxHH3pfvyknLRt+szOXTA4xLu5RtNUJXWxYhFhEEEkYSvCpDQAClv/kE4aGw8xrzOD1KTYtgQ2OiloKGDCviRsLxXFIpEcSCWkIx9p2hB6p05DLvYKwfriF7943XXXPfrRj/7qV7/6wAc+8HxXJyNjT2B35SIMBkM6p/Yv6SSkVzbjSjC8QXI2pHrOIiDtnWoUkRW2DNa6peZQmdqZDZ2lAwAmRaEIS62NtSxiGNwpESFCAiTCkVaaSCEqRRSifTpeZT2vCi4pAhXHabEHR7+qkNONeQyiEBWRe2zPRNg/o1OSAcC0NiJAiCuldmNXWShCZAHjIssjomOB0ZgooQ7R7yYcYGRKbrCIg6Dbj7A53RlcBnaGbrOvRe3APduOzIV7E2dlvBgiTAItYegbB1vi0C6kMZ3HzL69QWQwAj6CpmEGgODGDiLiWpFhrowdl8VIqS2sZ8Y4e7eTFbdsEJw9EVERFVp5Z8RgH4ewnCI4tqeIzCMobpGCAdqpqYTZOu8tYRZrRASJvLcYxwds2rb3uTQ1ECIpYRZrAQCVErYggKTYGjGGdNEsB2QGAdLB8x3I7Rfq7iUQ6Z3XXcdtPCH5kTpl+Wphx1AYlMJ+n9BkOtNz3Nq5pmsJ9gTBYuZf/dVfvf7669/3vvcl7m+XOqJryPmuSMb5wS7KRTPJHVJLDaqqeqcHTCFJnhZrk8ZPBQGAEKzEeOhezVNb5+0EzoOKRBCxMrZmrqxFBhcTwREaQmQRQFDoIymUKriUiLAAgwRrCCpCtySwMtbVxAe5dsNYmAljWOrkrnLu84jgwg457zEfkDE8cm2ti2I60qoslLPUuN12NZGIGGYiKggZhFmAQBhEJAQ3allooudH9LGSMDykQX6g6ejDUdP3D4wCHTPhwnEi3B4uNJp1DsaLZHohQ6mtc73JCfQErSUd6Ezk4IWE0HfybhJBWse9niAsCTSWNZFWBAYs+5jmhhm4rcpNg4wEfa5va14AvRdfONEoT0PN4jP5q5CUt5k7wx+R01FJ4rMIwogEhC7KA7glIO4yZiQCIjFGhFPK1dwuYZ0JWXWiIUkFE/N5cHFva9OiZXBbdrTDbGeKPUGwbrzxxptvvvkpT3nKW97yljT9yJEjk8nkfNXqPENak92MSxC7IhfDQ8XS3LLkouFFUtJNckY6ARZnJfRpLGKsZ0KK0Fg2LOiiqAei42iK82ffqo2xggilokIRha2dFVGpfAB3cMWyzGvLQWsFEPkTAKBlNyY0/bDjT7GyLlETKqLUHVxEUBAJFSIi1JYBoSAaaQ0Ac2Pnxu+E6FY1IkCp/cDjwqVysIK4reKiv3zo2pOxTRCStYfJlDp1eA/XygIzSPhKmLCshSyqsTouyLAncRbGCxk8WiQwjgy02VUiDolZUJIc0J51xMsYQAESIgNaEcPWq558qBCoLQPUfttBx/JFO3rD7JmOVkRIzp89yJHXg7nI7oDp+kLpzdyxpZ5zjMcRMiRPmwC8FT6a9wLvQefPbi2bGgFRKVTKXYVI7qytKyREXQizI2TCDMxAKpgOKXlXDOD2W4jrN9wfCM74TnXlZKhhS14svFoLW5OY8zGY7gmC9bWvfQ0AXvOa13TSf+EXfuFSI1jsZddH7824lHEmciGt4WGBP1XI2T4czNohWi1ulZxL58oA4EwYIO3YPGwZAUutRlpzCBDKLErRSqlLre7c2DLMBVGplaYQ5xNQKSyDBcSwsLWGhVkI0UWpdvTF+jgOHKMsUpirc1xGiABO7+X0Z4ia0LLMTO26YQ5O7m4EU4gYQsNXhjeraaForPWk0LW1leXa8lir1XFJiLPaCEBBNGdmkXGhEQAJNCkXYCKyqDBYQNzJJw7J0ekqnWs340UcVsKY3RtBmjWHyxA1BL0tCvcszsZ4kbCldOLQkaGGWEl6WdtWnhAt/zFTjztXRNTmirOzESMCEaJAHbYlKIhYRBFVxp6c15ZlbVyulsW0Nidmc0JShONCu/WzpdZBN0wQGoyj9UYMAvpgJ75e3joZt4eKbc79dBUDAAAUawARlbbzKQBQUQISiAVAMUaYUSmxVtgikSpHzpLI1iApJAUiZmuDTV2sXQZEYi0IUzECRDvbIl2gUna6hUqR0mJtQ46QAFDYYjSNg9vLEyC+O0cXIQnxEKM6SPMkLfug6wAw+SCRjZ0FhdaeGMWf85znyBCuvPLK81218wM6H1x7p7hQuuELH2csF+L1SAs+mXQ+Zmu6DTCkvuqcao01EspDP4tsQomGS6wIiw/UYKwYF9MdfCc5r83cWBFx6qtpbTbmVWUsAkwKvVLqlaIYaVUqVSgqFLnY6wJSWTutbWVtzWwsO7rj9sF1flq+MsFThEXmxs7c+nYWy+JiVyvykbcMS2297k0hjbUqlHeOYRYGWSn0alkUijbm1ca8rowdaVUoZSxvzObGMgJU1lp2eiy0LJbFMNfG1621L7X7To0/j9ceQHx5IaH/UdKjZeas5YLrWUC3RexNnOPxwolFyq7iCf9tohj0PlOj34ofU5qrRYClWWALABCCVImAazAuNAMhVtZuzivHzp3nuqNTWjWWQQQwlo3l2sYA7n7L8hDnNtWvJQ8BkfHHKKBW2AobAERSiIikSGsEFGu9Gdsa8Js4CRIhKa4rrmZsjBqNqSiRFJvazra4mlNRIqKwRVKIJNavzQVmJEStAdGvOkypTvJKQ3Ujj016nm6/Fc+mn6gz6VyC4UnmsisWYE9osDIcnK/G+a7FdtjzFczwOKUOoTUedM/JklzJ2BB7PwIUH8PdDzTkemnm2sYBy6u1rPjdZ22gNYRQKPLdLGIMQo0IxvvB+7hBhVKE6IK515ZTjysAqCxLJDGIfito8YyKfAgGMSzIUFtWhAqxsmyZXUPXRKVWlnlubGRsI6UQcauq58YCwGpZrI6KK9ZXBeDE1myrqseFKhQZy4VWo0K56jlfMgHRhIrafrfRG8ZZhRLTHg7PrBMF1rJ59ynOyFsqsYwl6CwlbH7GuUTUW7UZsDTfN7xtZrHAWikfnyFsVS7o5yQi4uKuzWpLiACuHSIRlsovFYyugs43XADEWmclJ0JfYhABlwkFJBjZAQCafS9dHC4QcIZtARAgUuUIQNgYx7oAAEkBkSdGgo4rAhIpBQBcV8KWqzkgqclE2Nr5DIRBF2wqrmsqSqf9cvItzF691O5vpDGGu74EY00TAzmEC8N7GI7JkGqqus6Kbc/33UEmWHsCUR97nuuRcWmiP7+DzlS8GSriMOJVLOlwEjI6FtRM3wWsBL9eEdsok9DFZpgH04DzDXfBGkqlSk0KqVA0Knz0A8tsQZhhbozXPInvcb39UWCr9hP4kVbK+bxzMESK24UQNZIVnvklWW53HSFChTgOWxauFIUVPj6dT43VhE4RNRVjWNZGhXOyd9vmbM7rezbvPlnVInLlvtXa2o1ZVShyEbwU4aQotKLNeSUApVIxgAWFoSMx1jQ2jWCs9AQRJGj7/OtPVhUm5Ch2In442okzVrclXCroMaEucwr/dlU+iR4qJVXuhyQpQbGVlhCM5iBAiBaksklkVwQQsCLOgR0Atiobol6BC4JVFkorKhQVWrkCK+t9ARvvLQEr3kXLeSuKiF+rqEghESEEz3oMCjCxFhBRKREBr6lynojCbICZTWU2T6JSemW9WF2z85mt5mJqAUAiAKRyBIjVsaPOxUqv7RsdvA8ize7+LhUjNVkzWxtcV6Q0iJjNk4BQ7jtg51M7m6rJCoiwNaQLQPQB4uNEBNJWL34jBhYgcm/ZmwYDAwtNP3zYdNlsy9be42HDLOt0RudMsM4/nLAh7m3LYMbFhf5IKkvPLjkXHYnCKQzxmprBRiGyG2YQUQQBLAsLOxcoi2CsuCXo4AkHKm8EJEXoQv4QNjcPBhTxe0UDlIoQwQoAgCJ0QSIqZitSGcsAhLBS6Gh/tCIIONZKAAwLiCgiTS5wttTM90xnJ2b1ycocWClHSheK1selsbxZmWltXAXWRyWhZZG5YURYKYt5bWu2mujA6sQ5HTPLzJiT80oRjbVSRFF3UBuLQUsHQ/18+kL9u4aeG0l64eDYsMvT8ksDDWNKE1IdbmKbSqYjyWwlMceFdMeTIFAFcc7nIq4Nk1ehoEKojNWKwp4BTvcFYbUgFkTab1gADD5igvUxqhI3pODw7nSohG5pSFgn60sFFZ0ClQoPJkgEiFxXACCMpLQgirGoi2J1jcqxmU3Z1G7zZhqNAdDOttTKKgKwqZ1fpBqvIFK9tYFIVI5AmKu5521+WaIWEa4rscZr2kCCE5nvDeIHCA258SZzeYMPVlsaErVXdGBsy8IgvdpNZIJ1PhFn9oSY2VXGHkKPRQ1QLmnRKgRoNr9IrgqdOAIAImhCCwQsQsxWDHOplCYSAb/foA/XSaWikdbOmmaEQaQWMZZFgEVq5rBm0PeRM3cOnHkRrfDxWV374AuoEBXicVs5m4cLVaqJZoY1Yamotjw1RgRGWiGAYb5nWrHASNFEK5e5VAoEFOLxygjIROuVQs+trY2dFGp9XBZE92zNCqVWR4XzetGaUAEYAIFJoQtFzh8LScKwh27dYTJFB+/FBgAglOis0pDYvUEh06hdRn/KkaQkTb2l7G0UYR0/xaDWclZCDCzI70xgmSEsiRUQTeTijGii2jIGGlQoVWpya2m93LmNlgEEgK2Puo4CAOJX5gZLPXkqIsbaeMpZGCXGEQUQYee97h2yYmAFXSApVEoXpRpN2BqztQFIUtcioidrSMh1hUh2NgVrqRyLMJtKhKWuqRyx03UZAwiCWOzbLyJijJ1uijUuUJYwN05a1rq4va037g9jpK4kSKkEs19j6d5GPdWVmUaptTvIBOu8wdlKdF4tmHHOMaS+GlZaSevPUAKEns9t9RHcSiSU6biDizIFAFqRInC+uiOtprU5ujkVt4OyuG3+aH1UOOf0QpFbiz43Zm44DjzezsiOjYEgclAAAMDMWNcVu3GoZp4btiCWXZxSYBFA1IIsUrPfbZpZnCf7vbO6VLRaqH2jwnHDe2e1iwX/jXs2Vgp1YGV05foKixjmu7dmk0JdvjLWhJXhLTaXr4yN5aMnpy4MvWU5uDq+bDyalPrEbK6QSk2IOK1rBFwdFeSG0tq4+mNQZ7m4XyEsPEiIgC0+G3Rn6uGX9JcTQmvinolYF7FRN/a+Rm0VqVLM2SJPjUHQ66wkFBRlym0NLo1exmlwWcIGmgqRAeZVrRWVSm3MKkQcazU31nkEOt3q+nhUaiLEUuva2MqatVFpWSxzZazzPiTfAMTJXc0clhBGrTI6QyEhlloBSG04mBqZTe1CgKqynB+7GxDGBw6Z2ZYI15sbiKRXVrmqZnffCSCkC65rW83UaMK2RkbShZ1N7WyTRmNQSuaVOXmi2He5Xl2fHf0uKa3X9tlqJnXNANXxe6gcqXIMosC5h4mAsDDYag5sRYR0Ed+kX1GIGsR1GIJIQCBuf0MAT7niZCXZ3jOYGhPhkNSoLr0AvVHDeEaykgnW+YFhFhCFmV1l7AUMs6t+tnQe37kmMioAz6piVPKgoAcRsczOrlEZ1kQjrScFuyBS4lVc5IYfC8AihSK3igoBDIuxxg0W09oGp3Yfl6GgEM5doLY8NfbE3LAIC2jCQiEhKoY589QwACjEkaYHXLZiRY5Nq+OVKRWXiuaWN2s7NfbAuJwau1WbQtEoON1Xlo9Pq8qwi+xw+WRUaAKBE7MKAcaFdgu+FNIVq6Xz61opipp5s7Lr43J1VLo5FYvb+Qcse+4ZNAgA6Y5s3v8kGk5aXwITL6z4A9oUKtOpU0VfcZUeSTtZBnLG5YUACfX1WiIBFtFIflIR11u4OYOxk0ILwKw2paJk1oGlUspveoOayBKzkc15VWilQtzQqBN18uIExHkLAoD1O2p6TRsDTMpCvD89sLPeM7M1bI2erFJZIikR5moGSKQLO9syW6LGK2o0ZmucwzspLWzNxgkgpGIEAECKp1tgamCmlTESOaerYn0/lSVYBiJh5npKRYm6F8+V4gAAIABJREFUMNNNnk9RaRyNASDG3EJSgOCd333ABc/DRBjCgsfkxbsNSsOr9p8lUWJJ7IraJvbmG+6yrGSCdX6AwWiSNIWMjHMB6R30qdLC031VVqL7EonKLHBTehfP0zEeZ7MwVhSBJpqJscyFUqVWlbGOPhChczB3BdaWa7f3H+HqqKit3ZjXJmxz46yHc2utCADOLTu11pbbYQfAilSWp0ZYZKWgsaJ75/beua2sHBgrRc7ZBWfGfvtkNTWyUtCKxoOTAgGOzerKsosvulKokVIFoVZUGa6ZrUihaFxoV/mTVX3vrBopWhdBBOet5ZziC0Vusb0m1EQnZ/PK2NVRSYTGcm1teFh0ls20M3ADiA+JGr2wTuljNx/rLI8kFywGWnfP+yqmdjM3TvLdK9q+8M1ZFzHEd/1+E3TxtjjAmq1b3jGv7dywYdfOwQW7isU5MXGGbLRoneolbDdOiMJiEeKydCeVYWtOF+1WABCFiUgEK2MrY8elFlODiJ1tIalyff/cWDbGzudIpFdWWRdcVzQaUzmSudj5hgAgEmkNgMAsphJmnk2FWZUjVBoQ7WzK1QyLErWy1RyUAlNzXanJqhpNAMTOtsDbOhmVAiIxtSvYWSeRCBLtlAgDCDqbZ6NqZLc7Q+vzYaqH6sw7oKcA7uGMh+ZMsM41LHMt1k1iStq19z+35s7ZSRG5rBzvK8Z3zU7ePZ/Wwlet7h8rbYQJ8Oh887atje8bTQ5P1sdKa1IAwCIb9UwANNKam3/sEpxmexcLzNh9YG8QgEX6rP5kPl0n5Sx0IGFBn+sw3bImFqnZ06/KWGeqs8wzY0MoUFCEK2XholsVWomIYamMcbPNk7N6s64ti1sSCC6WleXgGgyWeW55pFWpSRFu1fbE3JyoLItMNB2YlDNjZ0Y0wf+zXu4b6ZF2ru72a/dMCeHAWF1737WRVpblzs2ZYYuAd23VmnCtVAcA58aesMwiY61WCqUQjeVjZn7LsY2CcKXQV65NSqUAYWNeMwvAfN+4LJQ6PpvfszVfK/XaqLj75NQKKyLLc0QcabU+HmHgVLVlyxx7dAqdf5iW+8+FiG6EDkFQIS6sakaR9pgxOIJkjpViiRAkrlQQaVVs9B1Tofs/iID/Y2NkTwC39oLBb745KtA5mBvLpVZi5MRsToiFoq2qBoCRVmOtR1o55ahjUZWx06requpSqUqsc4R30qGJjLXiV8sSAFhmrchYdl7zAHD05JZhvmwyYqtkbvRk9ba7771sZQz1vN44XqzvLy87QOXozhObK2UxvfUmKkfF2mVszGj/QUSa33u3rWbmxD3O9UpsLaxBhOs5FSMAQV24JYoiDFVteCrWKKT65AYiiqlBuLzsgJ1PZ3d9h0aTyaH7c13N77lTmIvVdbHWTreoHHm3LbaoSGyw+jk/LURvMmdGIr+DodLgHPeJ3N0RyX8tbGy0iUojRGoQ8KEfWmqtjojsUM3fQiZY5xoCMKIiKv93BSeq2fF6ZpgPjlYQYMvUU2sKon1qtFaMCJHY3jPfAoBD45X7TfaNdeEunJl6w8ydvXKsNMCZEax2g8zs6gLAsk6jq61K/m0bRgLZirES3B/nrut4AHiXKbdFAXsdvYBxVgyiQqm1UVlqRYTWshGxzEc3ZwiwNiovXxmtc1lbe8/WXBEQ4rFpVVkWAUWgiCrLc8ssMDX22Mxs1Xyi4kOr+gHr4/vumxyYjO/emt0znbPAvpFeK4uaeVZbjfj/Xrl+5drk0L7Vjdn8xKzSBKulPllbATm8VirEgpxuCQpFJytTWa4sI9RaESGMlVKEhuX4rNJEiFBbRgSNNDfW7Ql95fqKsbxVmYOrk5VRgQCb81oTFZo255WxXCg1GRW1tcbyuNCul/dWVolT7cbWBNCaW/tBYZstnjtRfzJ66MlCqpxtZhTYzt0NcgnSZG6WvYn/AF6D5RRLVsQyOwNezewcELeq2jkaup0DRlqNXJxbtx0Ti7FcKCq1Ghf65LzSRKNCG8tupdRWZQiBCLVSIjCt6gNrEwScVmZu7MZ8rolWRwUhXrG+SkpZVUyrelLoyybj+b1HUWsqCihKFLnPvjVbzze9b7su1i+bVXWptbAVU9utTSxHqAsEDcJc12KMKA0AqLTYmk2FSE2oUqURUazhakajCY0mZnNDrAG2XM3ZGnCTh7piU2OIpEW6ANAiAGLAsaWm7Scec9EQJOx5lPN8bz6U9N2vfHpbTyXRNcsdZR+sCwXO6wJxN02Cm3V11/zk/nJyxWhlokuXKCIjo0ZK7SvG5Ge4ePlopSDVuXxmzbH5dF8xIqRdcAjL3ffFAUyJUz+5OYHRjRQwqOLD6OK8QkKbUESIPrBCLNbNyN1yJUIwzGRRrLgN/tyVG/P62LRaHxWTQlmRyloBqAzPLRNCzXxyzm6Vn0I8Nqu/tVFPa7lihR68v/yh79u3fzwaF8qw7BuXI62ce68JKxBLRfdZm6yUurb2+Ky6d1oJyPetjPeNis3KOM8wI3J0a+5WGoJ3xgeFYCwDwnikCNC60PBgCfGycTnWyoUnrSyPNF2xtjI3pjK2UFQb9mMqwry2J+eVYdFkDLMVcVG7JFWEuF10mhfZ9uzp/Bw43Db90oX0GNXCnP2DZp2gNMLSqHVBUh1WiNBGIaK6Xz/IYlkYpVTKbQ1OiHNja2RA0ETjQk9KPSk0oA+QKyAzY2AG+yajlbKYGysCs8oggtIupK11OwqUE22snRtDiBvT+fdObB5cndQWC6Xue/k+ZoF6vmXUtKoRoNDK1nM2Ro0mqhwbtvON4yCCWo+uOGxnm7aandian5xXV6yviDXg9ENsxRpUGpVCY0ApsQaQkITr2hv7rNPesZhaXCR3tz3ObBMQ1coaApqtk1SUVI6kroUMIFIxEjZ2tqX2XQ5EPN0SZiri+OUdrXyP0zgkinAvbpZTT6WzxVZsOGhzrNYk5cy1vJlgnTvMrS1Ind6yQRHZqOf7yrE7nJr6ts1777uyvl6MV4sDncyIeOVkH8QQhQCKetwKAAD2jyb7RxMAMGyt8LH5FiFOVLFRzxmEAA+OVnPPfMlBBn53PEoEonKlrbgC18v5qTuHgIouKyEKAotMazM3lhBLReOxdq5OG7PKhfqcGVtZCwIHV8ZXrE4s88a8undazS3PjN2srYCwwD1TY1j2j9TU8FjT7RvV0S3+vhV64lWXI6JhueXYJstJAKisjDStleqq/WsjrefGHN2cIWKp1W3HNzfmpmY+OCnHWlWWv72xdXAy+v79ayuF3qrN9za2/uO7J+dWdNhXEREPjGmiaVLQycpaFk14cKVc0WqklaN9pmJENMxbVX1sOl8ti0mh796caqL1UakVVbVFwAOrE+dxZlncTKgy1q2ct2GI1trZO3xoRIAYZ8ybEaNGJJl9Z5PgMrQasvQTu2ypq7ZtlhYmVsKO7ioxGor3R2Qg5STFRdPlsLrWMtdsgVEhGhZCIITVsV4tSwAoCy0iJ2cVIhRKjbU+MZufmM0RsSCaGwsIpVLHp9VIKxa46+QWAN7/wGUoShF94bbvza09tDY5iNWVV1xmgDZnVaHUaDQesbi4IUQIRKPLD9r5TNiiqYu1fYhYbRwXtuX+g1zXut4cr1/GLMXaZQBQrF1mZlvm5AlUSq+uiwgbYzbuVeMJ68KxLp5usanBrdFlq8qxgFBRUjkWU3M9x7rCcjS67ICdbpqTx9VoQuMVsVZs7Zy6AECMsfOpi32KKEhKRICt2Bp1gc5hy0d2MICISMI2BJiwfvYm0kT1jd+1UXWcLenIBOscwXlLnN43nNl6y1RrehQPv7FxD4OsF+NQ+nDz6MfWqtn29VgAoElpUN88eUwj7StGx+t5zVYEjPCKLgskZ1U841WrGRcqWs5aIYxPDOrjByqvxHKOqCLgvW7dsiY/VLlgie4aEQFsYhOg5wqEiIAV2++c2CwUrRS6UOrgqlKI3zs5dUPC/z22VVk5tFo8YN/k6FZ1dFoblgdcpv/X5Sta0d1b86mxK4VyS7GOz41CYIGNeV1ZdsSOAdyG0JOCCsZbj0/HivaPtRX5zsZ0ZuyByWham83KXLWvVISlovVSu52hp8aemNebNZ+wtSIsCXFazQs91tY9XRHUXYpw/2RUEAHASlmMtNJEc2M1YanJMrMgArilZArJ7VotYcNs9zYiYY0IIz75nz2p7HUJWW5TDOikwm/p/EjpVjtzYFhJuqdT7ndgXn76EWa8iC7GOiCiS0RBFqiMcdRZERbKRV9Ht75WKyLCaWXSSG+IeHJesUih1PHpXBFOCv29jS1FeHjfyrw2ZaEtyz3T+X33rVx9+Ao727JA89oQglbkWkipNYCwtUQkgKS0i4AFpBCRiqKebloiZ57TbIUtag26ED3SAPXxe9zmPoAALowCkVcsWcv1nKs5ACAp4LHby5mKkpS2pub5DAB0UYqwmW5KXeFkTawVUzUmP3TBFwQAgBmQAAnFeV8KoduoRyi8/GADFCByMzxsLDPRzSp+wEHVVTTK7wIywToXqKwFAAIfQveUsGWqY/PpvnJUKv+x7plvFUT3Ga82mXbcGApSU1NPVNG/xDBrpInSa7pc1SULA+BY6Zk1x83spJmziELaV44HKVrGxYoBQ0oSZDHkQMSwSYUzCLodb1DA7TRGaBmEeVYbK8zinLFAodtPzTnFOkdvERFNSKi2KrMxN9/lmWFeLfRIkwiMFN1TVZbh8GrxfSslImqFNcv3r5cPObB2cGV81+a0VDTRihDn1s4MTzQ5mvKtE1sIMNZqpEjAxXeAiaa1goyVqbFbtS0UaYTNynz35MywjDQ9+MCa80Q+sDJeKfVIq7mxx6fze7bm3zi2aUUUoXN+H2vlQptakX2jolRqXKhSKbe8caXU/z97b7YjS5JkiR0RUbXF3SPirrl0VdbW3dMz7J7hNsQAfCIIEJwX/ik/YB74QBDgwzwMiCbQPeyenqrKqs7lrrH4YmaqKiJ8UDMPj7tkZWZlddVUhuDeCHdzcw93VzPToyJHzhHm2ZyEGEAqVasBQtTFEJh9MYF2n31RiDDfp4W6ebv+PhmJYyLl3Wms+wzW1wu/i6dw50a9t6Svbh9cUrdLEqsuNu4AMj8dWZvbA6t9jbubmmUzmvORaIOE2d+GctFqCZBVaxYmqfUx1IJyJ0HNJtUGcnkYs9qHZ5s/eXj+encYd4cxl6fr7qePH5TtNW8uhpQIVA/CKVvfxqod5aZelzhVfl1ipZNzbKXtdRzcLJ4/sDRpGrtHT4dUHM5Vft1Ip8FzdtNw9mDOZqXJ8uSl6LCDg7uVMLsVV0VsqgO0q1IIxOw5Q5UkuptNI9woxqob4aqWJlet5jkze93MSuYYSWT2brwdpYWjcKuGdTIcvgg91LrhVyR8v6O4B1i/88imyQoTrRaO1NePq+mwju0P1henG/9kdfG+/b9O9AvD/e342eYRgHq5PzLFGgnn6F6Ne3Uj8nt09X2LtxoNlyX+cvmyZRlfe86PZJFFnQFEKLm674GJqkR0G1gWr9msWsyA6gqCsWj1otm0cdOimBHoekwvD+mQ9Vc3aVL/n350QUSvh/R6zKsof/Fo1cdwM+afX+5fj4UAJly0oRUC8HLIY3FhbCqR65CzORMi06MuVie4dSObNhS1Q9Ft1n2x80Yu2tDMClhujhf7IQwUmItZYH64av+XJ+dCnFX3KR9S2aUcmTdtDEz7VKZiu5QX4SvvggRhX/Ssji36jch535r7lEtSrbpfUTiICNEh5ZqlmLOAS9aQarOAOzNj6ZTCCe/tjTG7h1dvh7/z5vHuifIocGwenHdw3KKxk7ZBHGGWzzndGXhV9l4xy6pNqLLqqDKhpSqSqFVie2BeN1GYiqk7hlyq2Pp2SsJdIzzmspsyEy66djvletb87YvrPsj/9pc/vR7GL662TzarV7vhekz/zScfCHNRKblEEXcsqB5jKszUBiEid/NqiehuZjruarmwffi04UflsK91OulWmqYGsFLSuA+rjauW3bVNI0z5YQeWZn1WxkO+fu1abBy4W3HTumZXdVMwc9MSM8emysTn7ZVr4a73UkxHik3oVqaTpTHfWN0fLKg9mCXpOFiemouHINJhxEIDrdiVjEgCql1PLbyYkgiqg3st6lbm1olW1oLB6CSPtXC5FiGVb3GA3QOsf4q4u9L8urHL02fD9i/b1e/iLR3D3BkEgrlFFnpPCfDxacLsPv5o4i309L54k6Fycntubq66NLUx2iuIwjHz0tQru9lYcjEnwqaJQViYhSiIty5j0VJg7qsYIvMhl+sxAWCi7ZS3WQPRl/u8Tf6DMzlkvZ4yE01qu6SbRmhI26TZvBUiIDA5fJdtUk/qfeROeCw2qakjMgVGI1zM91mHYsL0sA3nbThrAlCSebNkudS9YW6EixkBWW2fcs3AVbC1T/lymIq5ObLZfsoOjEWj8DqG865Rs2Iehd3d4OsmtiEQoagxUxTZT2kqWoXBaDELYiJ1L2rCJDx/zccCRs1sLdqq9wjqt4k3z4H3nxMn6au3pK5u0dhp7stnSlY1FK85XjM/+rnUuzV3G4Qi3y48quFBVi0WiKguPKq1EuBMdDOl3ZTP2vjzq93NpP/iyTlQ2Vrk7l0U87ifkjmYqI+BiIIwG6VcpqIOrGOjKUnTAOSkltO8ODLj2LgWHQ9gdi3S9dJ2ANLVa2l7d7OUALgb3GFaiVCWp7yHl8SxkdVGD1vpVty0OuwJxG1PxF6KTZO7kTQgci1gJmYdD+4msQHgJVuauO0rDrM8gdhZrBRXrW2JOo2WEoU4MwzqO2dmYjd1U6bWF5t5uINPJHzfcQycEhm/m7gHWL/bUDMhDizyHuDyFfHL3VXzu1c6ULfKgD+WIO/jPk7D7/w6nVFOElcni30i8MInPeZ+5o48taR21GePIm2QKt9AoH3KxSyr1UxP67xLSGrF/It9AtAIvR7sUcc/uegvxzwUW0d+PZRRfZutEwpMq8gEqCOpf77PScHA414I2GW9HFWIalrLHEm9+g8GRi9s8EPWyNwK9yvZNAFANTEs5rspvThMUYhAgemsIXP/xaubXZq1T5moC+KOfS7qvo6hfpDtmKptzsO+rfSaLoZKgUcl/rsfUlG3WvTh5ae7F1XUkivg5tUw+yiA4gATqtLYkr6a493Xm5PJ4x6OvR1fsdY4ZbvjlNu+/D/p+ThJbN0FYLX8B6As6gzuruZJNakRoQsShaNIEK5G4PXYaIJU86ik6pNnNXM3p+2UonAU/nKXf/qg+4sPHz2/2YOwbuPVYRTmTRuroWE1wwHg7lMu1QehbyIDLlI7WE3VzdzU3auqgrnreKjnd9M9AgeYWk4cG9NSSeUcGufkbhxaKwklWZjC+kza3nICs5u66syFYrac3NSmQdoVxwZurjXD5DaNFCOxwM01w12atsq+Vya7a3BTECg0cLM0WkkSG8xkLMNSR3fVuaNwVletGXTCm6oM76IVvxtjfeMUCe4B1u80hpLVrZfYfnPs8nfXLx613W9ZDfw6cVvyW46qSctNHp92mzf2nLR8iw9yH39o8XbS6uuksW4Vko/aDPV4mQWVyWn24rDZenZuR6+TRC0CqnkVOwBQW6VqegZOYy5V8XwqejOmZKbmbZhZTT/YtKPas336l0+7j8+6XSqTWmS6mrSPvIrI5kl9m+yQbZfn97eKFJgAfLkv5hDGOrK7H4rv83xdXUWOjFFxOeZWsIq8ihKYGPj7yyGpCyEwFXN1/OmDthMBoO5f7Mbd5T4ynzXSRzlkTWpJHfDAJETXnCPzKsoHm+7xqqviQ8XM3V/tx6wqTOsmFjMHAlPL8ahhr+ZZMwB375vATNVTBY46MdfhqP0Bi1IGjmXCtzWv5rv36OpOnFb8cCy/4ljsO7J7FjB1TF/dcttvWwXvFgdnC0KCe4UvRFR9oooaAcJcrQZr7iqrtYFXMazb2MfQBKlCo4eUd1Mmoka4PgVhRl3JrBVW8799fv1XT9f/w48+cmA35XUbt2Oq6lnm3oio+W5MVXotMEeRKOwONXOnJgTNkx5rLPXNV36Vm5vZNLq7rTdkqtMYzx+yiO13II7nD+LZg5f/97/zkrof/GklOREzEaerV/n6ZTx/bGm0NBLznKwydS2WJuk3Ng162FHTkgSXwl3PsQGRjgdLU+Xae8muxXIGMpiJmELDbVeGuk/9c7SYQwdisVIsTxTijO1EYEYiNekL4pN0lR8FZpYP/126Pd/Pl7+rMPdsWly/nTz6WWw+7s+/83f1zjD3fZ7UvQ/R3K7Su9FVMRWaD+d/mjd2H/8UQZgVEO9sed+922r3kX1yuicWaw6ukgwwGKoggmUv7g6vl/4mBHcfSu5CqAzfTdsIl5oHMvex6MvDVAsoL4d8nXQs/uOLbsz6ekjumMzNfZ99mywVTOpZ4UArqCjuZqoMYjSCRuBOz5MWA4AoEKLa6icVBALJKE82qTdMxX0s9qCVx31U96y2jmHTyKfX49WkP71oo/A5UWRy4NWQdkmLYSh2yJWkTB+uwjqiGFfujpplR0WZRTUI9zG0IRSzohYCV8+4qtEF92MXYRAGyGAEEB+5JoSl0+qoTe04rSL+hvie1xQXUPq+0vc7t/rtU+9oYN35/cYZMfv/0UzGqEVncZC7uU9Fk6o5hEmYhakLobIYA/M+5alYVjuk7E1Qs6xGmMXSqtDuUHSX9a8+fJBVX+0OUTirZrUgnLMKc1KtVMgos1vnMd1GVPVIjVgq92om4pt5SSCmEG0cLE/u7qUgQNqWiMtw0PHAsQFxOWxBkPV5PZ6k64lZ0+imFBowU4gUoqVxRqBaLE162HKI7uY5xfU5iBYEpm4jxwgWAixPVayhJglPmv7MVDH3xgAATOdBrUkyd+bKu1qGg27VsHxWbfB5kI7D+9bt3/I0uQdYv6vIMxz5xt9wUr1Ow6N29U/mUZisbGJHM+nSHrfryiyZtKzjLTG/uA1pqN5w2bSKxQfi86YLxKvQ3AOv/3LjdKpZbhPB/U14VdmkcwHQyeF0VP0x95pOqdoDdZ6okKKWJISpkdA3oUotpKJT1lR0zFrMHq66+iKHXMx9LHbImtS3WZ8fihA96sQdr6Z0KCZESW1Uf3HQrCAglblklhRWoObZwAAz1HDIKOrFEBhBYE7CHhzuEPZGqGEcsh2yR6F1pFboR2fNo77pg6hbZF414T+/3n15KFPxXdY+cCd83kZhOje/knw9lWJ+3pIQusBnTSDCLpcvtsN6ylUKtRGOIo3wKoY+xqOpYhNEhK16yVVva/PKs1lyVDPeqsQsXhr+j/POV6AqWoq1x/HF9xtdvRlv9PudVsFPb7wl2v727UWU4fb1KhgmIjUPgasau7HDHMBUi4PAugmtSC3+HlLpIwAMqQiROXapVFBVzJPmPoqaHbJGNnN/2MVG5PV+GLOedU11o9IxCVMfuaKrSumr8M6tiqHw4vtJYFjJNQnkWtzMVIlqhwpRbElVxwO3fehX6eaybK8Bl37jJZVpXP3on4G53FyWkrkaNrtRiNKv4Y6mJRabBtdieUItRGop+5tq5zwfxGBXtfFAIUjXc4hWYONAItx0tVngeCRbKTDjWlFxd9PbTCLRIn/FtWgILKRF8xPm21IfXHDbuyjup3FPcv9DCndvJX4d6lVWjSIAng9bAA+a/mm/qa9wxFhJC0CN/E46+Dq57SucJUkd2fRUE7WVcKwPJi27kjoJQixEgdjhV+nwsFnfQ6z/IuKYDf82cXfVTkthionIqWZfKrqqCop12V2pV3BkUikzzahvQhDeTbmLspvsl5fbVZA6ExyyblMeiz07lGz+rz9c9zEUs1/fjAYI0afXeZ/dgQctUaSxuLmrI6vvJ2SFOsygyz8iBMZZD3OYIaunUue4Waaoj9QGhNlA2oVom/TVeEjqZw1HZnVvhP7iYTsUm9QedfGsDQD6KOsm/uVHjzZt7JtY+VJZ7cV2D0DNXuyGqgTWBq4c5z4GB67HCY4uhj4GM9+XbO6bNhJIzZggLMKUsh5xWGAGwfTIbT+d9L0mJ+B4c21Gb84Y3/P01W0ciVTveORuorYKkMzz8gnFapnYZ0HduWGwajA51z4PoBIQuxiK6VSUCMVczdW8kvw2TVy3UYiK2bgYml8OUxRet2E/le2Ub6Z8OeYu8FDk0+uBif7NDx4BntR+dbXro/QhfHa9B7wL8njdC9FYSmASZlcb4aIcA3cxAlCzKXsI3EjI+y3MHO6lzAQzs8VAkaTtXDXvrmm/zSESkfQrVx2f/Vq6Vbx4xGcP8vYKROX6tU1DOHvgpbgbxzaePQCzTaOboaqTBGYJ3LTT88+4acPZAx0PMKPY2DS6lnjxCJX7pYVYpF9x2+mLz7lpScTN3IqlUboVxQZmmkYilm7l5ihlNo2mW2NB18KxrckzCnHOY1WJPubTefbuqXLSmvtt4x5gfffh7pOWQfOaKHwNO+eKrq7TcJXHf3b+tG60EyP0Q0kOfLdOzF8d9UJxOQ1PunV4S5ehkfDoXWSsb94oeR+/yzguzr7WwHzVfnP6YwFTtDSteeVa+eks78Ccu6LZIaeyT9zdFd5IqIxdB8ytmFU3D2EOTElNi7ZBHnTNw77523SzivyglXUTdqlcjWVSB7DLdjN5EJxFagPtk0/Fh+yHjMOEl1sUhTnUSG1etQZBG3wq1bsQwvOFtDbnCYOpXme9DWSGQ7ZVpItWOuEv9/lZynB8vAlJdZeNgGf79PyQAJw3ctaGVPSib1cxnHVtDGyO5WuZPz4YVWqhmCVVNVf3szYGoZrMc6Da+apaNovL8qa2LjJTEAbNE98iiTX/gWUEFz4WnY7d11md3x3s70u897zwNx4/TUgdf70Bzvxkj1OSIsiXgq8tHk1qXtTUvVS3cqE+hnUTa6etuu9T2TTRHNdjvuiaIGRaTfa0AAAgAElEQVRzxssIeD2UfbafXnRt4Kshbadc7TJ3KR9y2VR3HWDIpZi1QeYSoUkbEJxtsVivjSaaJy8Lb3EW/J0779zUcqrOgDBzmJvR0uRYa38VDHFs4tnD4Vd/L/ksnD20abA0ercGQHXNrgWA9Gsv2VWpablp3c1L8ZI5NEQMNw6RWHQaLI1ETCIg9to5KOFIyaqcqllcrBSEUDWxZhGGesyb09xOaMTk5u52rPvNmcXTsT4RTL4dvd8u7gHWdx/ZdLIixN9IMmpfUn+SSTpeDbd5EqJ3oqtiau4101u33AXj3zLm3INbMj2UfN4IgKTlN7YZqlv47Q0N7+M7iuNa7DfApndteCfaeuMF6TjJM3AiguXLIVR1Mo+3+xii8KqJ7shmUykEosUUvI9MaG6mNBXbprKO0giPxR534aNNu03leiqjGoBdtpcHZUYfSJheHmw7+SHh+Q32I6ZMqcwyzkOiolAlYRcBM73agghBfNN5E9EI2ojAYCAVmHsJFBhguGOfDcAkfpPskD0wItPjPp618RdXh19ep6R4uuJDtldjqXWcLsimnarae1Idi6r5qgnrht1RBdxrmaOSq6p6RTatiEqYzbyYVWc6LPmPo9Z9fTQKn179T/oP3tUU9XWuB3ew+PcIYQF48yRY8lYzfertdeO7kl5+K4M1l7scqM2xPosHAAtrKghVKdpJ6wUcQtQEYaIyK5H6VHQVgzCp+1h0yEpAF2QTw1D0+aE8XclHm+5mzFdjGotdMO9S2aeybsKmiV0M+ymPpQB01KLbtNRAzL1qzhEQGoaZleymbn77sczcDeZuxfJEKpWfThLgVnZ7bpOsNs2DJ26q4+BauO3BLP2G2w5wS6OOBwBeMjctheBppOob3bBNI9U5ywxwTxNCg6oXz+JaZjZViIB7bVdk4qYlIi/FF2foymGHGbGQiFcpecwSJnADB3d3MxC759uxpDdE3oGZ7f61j5OvF/cA6zsOc48sgeUbEZJ+tb980q5PlUiJkLQMmrulCTFpmawk1WzqABOdx7bh4MBNGrOpY1YB9UUDumF5O//01TFpMbc+NGfcncUOjp9vX2Wzj/uzQ0nq/j5BLHP/djaL9/G7iGUNRrc/vyKP9d6SIc1TDTC7N5+ws3ypjlQyFoGYqKoUCjGxq/s+ZfOlmwowny1vuyBjLttpWggilJWmom0QYX6xH/9xOz4/5EdduGjDWGyfNKuNxZ4fdJ+rFjY+v7HLPT6/pMpYJXKb3ySGiaZENhEAMNQJCjbQ8hkvG3D0pvEHG2+DNxGrBlEQxIfkbUAXSR1XowL6dMVPe2kDE+HlIV9P5WEXGqZk/qSP6j6UuQwqTF9sD4Fo3YQoXPln10Mairr7g74JzFFYiJiJQfuUK6JZNbFOsWMuAKpyt81tg3OaLauqORGYqseO13Jkhbx8TGQtNBPc+t7epq/ee1Wq6bt/MuLn7y9O01J1Ij4Cy6XKd0z42XIKkM8Bqy0h7kdce0xQ1dHxpXYIeM1UAShuDs9VdIN41DIW3aVy0cY2SBvE3ces2XTKWnVApqLVoKn6PtVxGYp+epP++aPuL56cZ7V/vDnssya1m6mo+yrKRRd3qaIurYnPVrgR6aM0IkV1yqUJ0gbpYqz5ZQmN0uBltJxsGk6I5O6mXnK9Z9NAEue1C+A5QYKlqexvyu6aQNz1j//H/zVdvx4+/XsAYXNh03D49O+ahx+0H35CsbVpyFcv+0/+1LpUdtc67KVfcb/RwxbjnrUQUVXekn7DsaUYdb+rqhDS9iTB8lQpYiTBVa2msoJI17uqm0nX1MPfzdyMAh3f/22WbjkITuuDNaGFI/n95Mr526Qt7gHWdxxqVlwd+Pq67VWo+jR9BcDck2k9HCYt2XSXJyaOzOvYqJnBk+mopbhl0zq9FS3mBiAQs9FEvAlt/CbMrTeFGAgriQfk6jN9KOmdz3L3ZKWT92rE38fvJU7pzP4umPUV+a07OxzT6EfERXdy7b6oKWKeacwXpfJ64dJqdgsAntVP4BmyWnAm8kq/3eeSzbO6GvrAh6L7rC8P5VDcHEnr38L16LsRU8GjjUcBM6732I04TLS75pDQKJRhDACicIIxRCHq7NBCRWgK9Nqtb7FqAHcRBEExREGbvXRoBY0QURXWssBUDIdiqyg/PO9XMYxFb6Z8cPv1dgr7tInysAurKLtUDlkB1DbDih27IF47ABgMqvOx1FRWEABHyYa6VqnYi+kWMAFg4iqedDsqJ0O4VA/fGlc6/nh7jOmNQ+WPPd5zyPubN/zWX/vOSXBL0fG3tp1stJO/U4vmFTQXq3Qnd0Ddq/wV1xQl6GqcGMRMfaTIXMxaETUfigbmL/f5erKPNj0R7XM5ZD1krQLxgYmAm6m4e3FfRYnMDozF1J0J+5QrV7Kjmd2u5iLscGKmSu8rGW51+YTjv4q1ciZVEJEED2Yl+zTCzLVUHxvLSaexwjIQSbcmFteiw87S6GY2HrjtODReClSlX1FobNh5SYhNFSx1M6puhm5eipUkIYIYzFYyVZ9ELJDIqyBqBMhyquqjfvK265shiZjzWEfsaLNnzh0SRT2n+GQ8f9u4B1jfcWTXScs3qpQ9G7eB+I0RzabqRsCouRbsVqFZh0aYb9J40JzNdGa/uNBceHA4g4Q5mVbrQCFShIbDt27x+2g1q0Wo21UabvL4YXdWNegWuWG7SgOA3+av3MfvOt6HpU63H2/7beGJ3pjI/WQ+X9SYAMAWa2ev9CMiBoJwlSFgQiPSRiFQKmUsJTBv2oaAq2GqjVRFrbgH5lbY4V2gTZRRrZiP6urujrFUvxEcErKCCUGQFVd7/Pq5WCIu6PKcqeqSBzUxS0FyYDc02cihTKLeZGfzcZSbDruV46GuGgihKMxQFEW9i1i3uFBXM3V/1MkmyqT2asiP++asjf/fq+2X+9wwXbRSzB0emQk0FXV4JxKYHIjMTeBDLgAakVZEqAIsEubI7O5Jzd0DcyWuuR+5VreVWSIwQ919bjA8QVfvqu/NGj/f6sD44407xJuTX3fibicgTnd0v3P7HfvMCpfzK9STopg3Ui+YbuZlWWUI0aqJWa3KZRV1Ig/gYs5Uk76ezYdiDvtipwBWTdinvJ3KPps6CBjVV0RJbZsKVbtoZnM/ZB2LrqIwURSNwiIzOjHzwDQrcEoA8wwJzd3U0uiqcCMJcyKnOj3PPXo853tChLtNI3c9t9304vOyu7Y09Z/8OTGn189ZguWkhx0A0yzx3N2sZMuJQgP3st9y28G9FiuJmUS8ZCsFVEBEIkQMM88JIRKxQxftBrgpcQc3y2l2NtRyHOiax+LIbgo34lDzkm7GQXxO7i546s3z5zuAWfcA67uMYlbMum+iLPqr3eWu5P/qwQf1bk3mT1au0xBY1KzmlmvB/tV0GDTvSjlZo7o58uzNjl5Cw8xEtbmvYexKskVErmFpJTz6Jt472zyexQ7AX7/+Yh3iz84eHyHU8YYwP+7WScuzYVtcO4nnsbuXJP0DDDrNY51MzvOEQ7UO6Efq58zMwWLifBc9L1hq3szEYDczYgKhqBmQih6NcZoQiJBVN13TWzykXNQqDWVSrfTeIeuo9jcvh/OG/9UHm0d9+8urfVInICm2kwPI6rsJqkgFuxGfv5IyEQixcepcE8XB+ynFPErekxvc1q4zJwMAFFbgChJwvKAAYnAYV0+/7Nv9GX34ga5bbyJyRFZkdYKtG+oC/fWzPJW0auiTc/l3P7/6/Pr1nz+R//6jdc0obKd8NSYiBKYuxIerdt1EAn59tbsc07N9Ke7rKKsgqyY0wl2QJ5tVIDLg8jAFptqE6O5FlZmFqFJ5mOeeKGauOcOq17AoZjgTY7YJoePw1qGtXN7jyPmiHY/KYlkOgO9P3JIIa5LpttJ3+0XUh459/e5zZ2Y9TSpHfOatu9WvV5fcLarSFVVjTWeisWg1tKwenVWIZJcLgAd9c9ZGJmT3ai8oTJMqgF9cbs+aeN7GX1wd1lHOmvB//GJ/3tL//OOzL7eHf7gc1CGESX2f/UHLQ7Fd1rNGzL0RHopmdXectaKOIWvkUoyLVgSPprpbmhFzFWgAnJvWtSBnm0abDjaNOg21jijrM5LgLF6y7m+8FO5W4ewBSXAtrho2/fjZz0HUffyTfPXi8Iv/mK9edB//JJw/4qYdP/8ltx033fT8MwoxnF1Ivy77G9di01huXnPTyeaCpHXzsntNEiiEcPbQ3XTYWcnkHpq2MsYgAUAVlajJLS+Zmw6ApQkzMcbdFA4SsVoorERGV9dCTedW5qsYzacI3S4Z5yIwbm15v81Zcj8LfpdRc06LuMhvjs8O19d5+uExRWRGRIOmfUkNB4OPViJxNjtoSabqTkBkVrdsNqplt2Ke3CrvqheNdCu+xkQNsxAJcSCKLI3mQLwK8au5WUmLugfmTeiS6pfDzSY2P1xdfMXnaiQE4n1Jo2oxe9j29xXDP8B4L9tqefi2Gf3dcbcmQnM+vWZSK+eDQEJkRDobyKANQZgrr0XNAa2UIGFqwMKRiK6GZI5G+OWQmPCj8/ZB1/zyav96rHUNqKGROXc1ZWTFkLCfCIA0zoySgETthC5l0UKzB5nBFTbBCix72bomt0wcSToKK4RN3S2U6exg/RSfa5S1n6/sgwfOBGZsp+pRgz6iETpraR25C/STi/Dji347lf/rV68d6AIB6ITXUS66uNYQCq2b5p9/+HDM5fIw/fJqNxZ9NWQATd+2IRCQ1MyNgOp5YkvxdJkifLnA++n0f5QYRYVT/I5UylccAO+7+z2IZVEx46q5/lUVLghHzEqzROhSJlzYe378xuZnnTx2fHVz56oP5yCmWhwkUDZz92KezZgoMkfmKFzMKznvkIq5V2LiVAzInYi673J5NZRVQ//th93PHp39n5+++Hynm4YADNmZMaofsjVCTDYUa8XOG4lCgSmbe9ZiVguOHkTNrOpAgIgZThyCh+g5eTlYTl7yLDeq2aahegdU4VCutbzKLgeUmZtO1ueWxvT6OYUYNg8oxPHzX1oaue3djWNDsdFhD7fK8eLYcreS1VmFL/n6VRVx0MPWS/ZS3JRiJAmA67AHwIsio5cya1yZwqzmaH2hH1RKO8mRkQhifrP7YyEu+NKTUD9ghVbuRrXJZa7M/1anyD3A+s7C3aWK9n/tp1xO49N29XBJKdXF66Sllvy2aRq1rEPca97mnKs0DvGomt2SWTIv5sU9+6y8UswjmwOTWd3SCTdMLXPLEri0LGexZaXo1r4fAEUWs8KgutD50eZhMbvJw/Nx98n6AYDrNKj7G8mwp/3mQdNvy/Ry3CfTTsLTbnNfNPwDjGPq4nbLLap6G4PddpfN63nMlcK5s3vZY+GfOCrnmkBEgakJHKqKJuDuWT0wz09xHFLJamPRbSpRKJv/+Lz5cN1tU/6HqyEQNUJD8cDoA/3i0rYjiHBIOEyUyzz9lQw5UJM9FmczEBlHBIIruXKuMERJepIec05HwAJLcAUokHDoRcsHr8qway830kZl8iagKLaTF/OPzphBxf35ofzwLP7swerz7fiL61Tcf3bRVI+dSa1KHBFozErIjzf9w83q4Tofcnl1mAAVpmoKNOZS/bD7JrQx0GI0VHWz5hLGCR+LaE5PvdHmeVJSPPoYnQznO0/B+/MSXzWBvtWPebu0eNuJ6I1nVQZTre6FY8KspnXdq3R7K1wdC5jIHbo0CZlDHV5M3S+HzFQ2UV4O+T+/1r/6IP7Zo81Y9GrU+udeDxaYNoG+2CoTHq/octSh+CbyOiI4intSj0IOymZEXMW31F3Niukso8JytLLxnKsPINytFE+jSyAWHfZEB6upI3diJgk6Hrxk7jdw85LdLF0+tzS2H/xA1uf51Re6u7aLJxJbuOphly9fhPNHauYlc2y57bhp66u5uW6vvO29TbI+Iw4g8pRsPHDTEvFcbDXlECsd3uFgrlAPNRuH+SQhlpniIDKXbGmBTScMrTvj+54h/W1OlXuA9Z1FNjNY/7UFzV9PByGqDKcKqtTtJo2b2EQO/+/llw3LJsbPh/1lSnvV8xBa4cnKVcqjeZqFG+e2LCIwaFA7KKrzK4N41nskdR9US7HifpXTWYirENYShTmSPGi6NyQYiKjmn8aSuxDN/a8vv3zQtH969rjucNH07/xQUeSRrBqWQfOo+XI6tBJ6iXLfYPgHFvVKdIdQdSwUYtZov7v77dJ/3jKvAlEX6IFJzQA3IKkBXtVEs9qYp8frPgZ2R9/EIeV9ykedp6rj8HjVdkE+341quFiF12PapwLHQe31WF/KP9/alHHeYzdiO5A7uogovhtQEp/vi5gZ8dTEoCaqBCM1MkXewUa34joCBgc4EAVwoHgB6QH3w2dkRTiE/qMmbVbj6mXuv+jRruzPPrJNj6Jg8rMWDzr65Kz5cp//9/949Sfn/OOL6I5PbzJTPm/4v/vo3OE3Y362Gx72DQj/6fnleRcfrft/88lTEk6G//TsdbV/LmbViLdKj465SGVggaqZI4iqcXYtFGJBtMeBmGeUpeh1pG3R7cbby5G/ue/3N/w9xdGFeuW3+xwXDadEq6Wl47h3nf7NnXwxw1n2VDMXVp+VRfdZ62q8eg5WjHV9mIJwI/zqMO6yTsXquF1ORQi/vC4vdv6v/+sHRPj3n71WRxvo9WCNkDB+eakEfHjG16O93HsUCHk222VP6l3gVSCCVEG1wKTuqSgT8X5sgrQx0MJqn5XcSyFmig03XS7FpxG1507Vtdh4cDOOTfsnP5Fubb6jw44q03w8UNNKv0mvvhx+8bd5e9V++EObBsuTrM5Igk2jHrYcW2W2Z7+ChHjxuHn41DYXNo1TSW6ar19RbDi2XjwfdkTE3brSszwnIqLYuDtKWUBhBsss4O6ztyDF4CUDxLF1s4rJLKdbbvvSnkMhzuCsdoPdXhLvOVh/MJFNB02Tlrdd/N4Xuzx1C6xZVjx+FttWwqvpwER9CKOWq5wGVXMPTIPqdS4vJlVHIPRCWk9mEDkKfDI3h7oXq+LaWAdvWVvmTZAquDKqqadBS47WzFIOtH67fxAA0IUI4MvhpmU5C81VGs5jV1sa36fXAGAT201s1ew6D/ZdSHPdx7eIr0VersSS9+93qrEEgPykN6om1onUtDZF1cQ7+QlZ3lGt03BswqjmekWLmTA1gR9JdzVMN1Pa5yKEJ6t41sSxaCt80cqhmJCPxS8Hvx6warCb8HKLIB4iiPDFJeslP90mci8ScqB+yjGPrInLCB1QDpZeu2W4miW41Y9cP7aEVxTWHFYkHVjhDk3Ek3Dop5aNU+EvWn9c/HyFKF7Ms9KT3vrAP36AH57FbdK/f53/7ksHcNbrptk96RsATGiE1zHWktMh5bO+Y0In/GDVTlkB1GIQE5mjmKp7s5ws9XvmxUDt9hS6JdEteIuwqOrTHfB0q2V9+9R5n688Jf+oT9c7cPOWgXWy6b0xc9vv2g0eO2nvPnkW3ydCHUrHXJUjVIZ7MCfgrI0VdWWzoWhtIDUv5j5kq06aLwa9HKwNYKKxlG2yQ547agPjxY09u8HPntDN5NeDB5kFO14cdJ9cmD5ce2COTEnd3KJwUUsEr2wWpmAWRW7FXNzcik2jlww3jo25ec61E9BLsWl0VUsTv37u5w85NJBMWWwaZXXWffSjcPZw9/f/D/frbnMBIsuT7m7y1cv2ox9xt8pXL7ntwvkjN/XxQCyy2nDbx7YvuyvdXcN0Jq0zA6DYELOpEktVtAIwWzjXbKE58W2G0eHkt0xEYvZcFsEFW0rAx30Xs+djjv43NYV8o7gHWN9NVKlA/dpg4lCSwddhLtI1IgAVNQcu0/Bs3HUi+5Kfj2MyI6KO6SrlZ1O5yZWGBWI6qCd1AwLB4MUw6iw1VI8tptpbjkB+I9owNUzrIDWnJVQyc2YLxOau3rwhLZFNq7BWL/Fhi+L2xf56KK8OWiazf/vxT4momL6PziXMLYda7Pjtvt37+JbxGxhXt6jJT+4e52palMhnnIT5arTkveaZf7aerRXAhR1Kbm7ujUhsZhvj2qBe1IgQmK+G0SpxMEobZG3hs+1o5g87cfg2lV3WZD4Wv0n2YmfXAwBMBZc7ZMV5DwJSwXjDm+S7vhlbsKGbvDu8Jh1gGXnrOroltwkOELP0gLmp2wQ3Ny3Ta6RrlkbiA3AgjlSriprXw9DmOObwOsiYbcjWCNQxZf8bTx9u+ON1rH2zH2/EPlQCPtzw076pLEgi2qWS1ddNUPMxl6y2bmMXIxMTzaJWwsyErFrMjvMxL6VAJhiccXpdoblceKwbYgFhcxH3XcmpuzXF952Q38MT9Qg36XTbu84ZXxDWneeerCWOBXJa1swEspksXdWbHdUN0F2IqgdlLZEfJdAqg1aYJvXrSYmwTR6YHq+xS3nIOqkP2bNhyD4Vf7EDgH3yqwOY8HgDIozqX2xdCI/XFJkISOYllVWUYrVG6eZYRTtRsmVw/ScgrpbMlobKjnJTnUaYuprlVKty5ea1a5Gul9UZQmPT4KaWko4Him1z8ZhDk69f2TROLz7T3bZ5/CGFUHbXkpP0GxKpKg962AHEm3NZn9mwr7U8yxOxcNtVyat6ZLsWjhFmbmVRcnc6jgORVycskds64C1bzpcS4d0BJFR1V140zGbK45Ip/vbH1j3A+g6jZWm+nqrndRqu0sggWdQcJi3FbFsmdd/lNGgJxF+Mw7boRQiBQMCnw3SdXBgrIRCS4jp5mRPRNXE1r3qpnqXLJMgEIT8oGB4ZZ9EbRmRikAdx+FWeBi2jFiFuOBwv5WpWAdbDdpWHbTJtma/NivuTpv06UFKIy9y6dR+/t/iNMOuN2ff0iaezSZ09jiyHejGa+9Hml6F6KBLNqg2rJrQhxMBT1mIGR7Gas4GaJ7XArGZNkIu+XcfBHWdtTGpJ7XrSSf2QLSmYadW4MJ7fgAhPzsCEVDBmIODwCCJOW9ocbD3sqRzgBTpZ2cOyw0BhQYhVI0fdCuBEDJ45JVZ2ICESBhOsnp5shbzbp3YY6DX4vLcnAX2LffJ9cl+DgEd9/ORc/uyBRaGn6+6ia/ZT3uei7tspb5EdrRARkTABmLJOpWQ1NY/C1R4nFSUgVJL7QpKTOgheVd3pzUGZ6XBUFQGOhcVbeu/Jz7vxZu3je4ir3oiT0t/t3dufJ1/Yndl5BrlztdBPXwLAIgVXM5TqbubqXps5usCBqbKysllNnoxF61+KTEIITLtsrw72dM0POv5iNw7F9tknxX7yMouJYNXgy2uY4+kZzFHU9xP2E56coREMxc2NyFaRG+GkNqkBCMYVjNcfJEISKouYjm9f1bWaQBcd9rW10m3BWPX2NFrOsj4DUdlejZ//Ij58It2qYhpu2vTq2fTs83jxkNueiOtJaDmRBSKCm40HYvZ+Le2qhEjMVXOLmo4kwMzSWDlVborYuJaaRZilreaT2qvZjrsRQsWFy3CcaG6c1HuxOHfWvF2FWu+4Us50vG+T2boHWN9NMEgJDX0tgHWZhk7iR/0ZAHccytRIUPfIUkpOpgA+PRzM/TyEenS8SmVQbwOGgi8mF4I6xgIzaE1zorJh5sOA+bYIQAQmbwOEIYRRLTKY8HwceqEHjXzUtoHpJid1X4UoxO6+iW0XblnwT7tNPe8+7ocX4/4yTXX7V3cjZq91EP1GYqf38R0EvTltEk6mkbvgacFMd9CSzywtOJZ+5fm5s9w1M1WMNfO0MZcJlyueAxhyGXNpQ+iaIGDAhKjSjz48Ww25jEXHrM92wxe78aN198OLNRO2U/7RBT1d6z6V12O+mWzMBZHU/OEaj88wJLzeYT9hO9CDC90NrDtiQwoUYxfCivIWrpUA45at7N2yWQEM4BOLDCcKYCEwQCQNSw+ojS9oeiXrH2tzLqYXO92rHIx++QxfXvmTM/9XPyR1/Pwq/dnD5uNN96hvLrr25X74D19c//Wz9GTNH63lx+ddG7gPMhXtglx0TVabyhSYhUmXVrJDKurWiHQxMFMxayQIk1nVXKjS7QtmWnItyxY6brntNVzENeZVOy1w+LjPkbjlJ6gNJzDiewK4bifdW0VR3JlI/fiLfG7jwEK3qmfGzMGaez4cdYafH0bNWhFqhtKHooesgHchdFHWTRxLyepmvp1yVo/C/3gzMuFBF58PquY3oz/s6V88borhb16OV6NPxYeEqwOC4HIPIaihKB5vYI6rA7YjdgN+8Ai7CYdknzyYnQAe9jAryawRBsCkU9Eo2phQICLmEGiWPyhWkpXimm0aqxWgl6L7vaWJQoC75aKHA3dd6Nfp9QtX5bZtHjweP/95uX4FFrjJahMuHnd/8lObhsOn/6CHLXcrABwaT6MDbgYCSGga5zxibCg2Nuy430DES9Zx4LaX9ZkedhQb1+IlU9NWZVFuW8uJRYjZzTDb7LjlRERuBs/EYloAJxY3RUWV8xAB9W14xVe1e6Bex9gXC4oj3fGbxj3A+g7C3EfN2Y3lN1O5Jy0APlyoWkRYxxbAUHJSfTkNoykBQgjE2SwwDWo32ZhwKNgldAHuSIpUSBVqUJ0TEHYEWDJLe1SkdbxSE6COVtAGNIxinkwjpXWQhvl1GkctvQSDHzSfx/ZIZi9ukQTARdML8ctp/Gx/fdF0g+avoJ0RKJsOnu8B1u8jTq8Ifrvtfe0yXx0n0069Eh7RGBPZ3aU/gMAcGOYuTFG4PmzuSa3avBzz9kx43LdqftHFKLybcs3uFLPPd+n5oYwF6mgEzuTuY8GUYY5UiAhFSQs8gBXrqXTTjnSAJXhxndwmNyUKqGW5fHCf4E4cQEzEICF3J9OyJ5tcUug/JmFYRroSOPkmcOhHKsLh3AnYjrga/IMNRaHPd3mb7OkqfbwprchfPF797ct8efBVsKTm8C5IF6R+UesmDrmAwETJrUWLqnwAACAASURBVJqozJAmEC0W78K1+X+GxEcld17GYVHFOsr3LJyqGU3dWW3fErDuZrbecYzQO7f+ccabbZjzzyrW8HY18DaF9c7y4bFKaCfP0+VOrccBKOZVFs6BKNKGUEvDVXMnma1FzDGqhaRCeHbwlzv/t3/edUE+26ak2E8Owsst9hO6BkURG+QCZgwZY4EqrvYAsJ/gjrMeY/FiYEIbjABhTKqBKTJXJ59iBgozSpyplA4zuMHhqpZGywkAiTigu/2RsOVqXop0vaVJ9zuYxQePvVfdXlnJsaRw/ig++mAt/3L8/Ff58gVELE067i2N4eKRbq/g1n78Y7h7TiTCTUcsldIOoJpGc9d7yZan0HTVKoeJTRPV3kDTGSJbIa+eWbMRIdzciUN001oDrZBu6bpdioFYwNYRUr0j7jNYv6eoDdVCFL9Gr1wgPgt362uObR4/H26KezKTWQwN6pbdO/BV1kG9GIYCc4wFQ0YqlDNUUVF7jeOrljJfE6qBpggskjCIoIaBvQl42CEQBvUXUxnVVkEYVO13zmOrsJs8HQHWNk+9xD5EAJvY/mR9/unh5uV0WIf4qF0lLf17rIGyaYaeo/vWX+99fLt4K6lNC3vH3+Rene5ygpyOv+itfeujdVNtWbU53U6oMphCteZVsXXllxAgTIC4e1aLgfsYhjwFRh9EmA8p71Oeil1P+XLMX+6LGlaR2gA1HLJnRVEQYcooiiA4jHAjOD643IVpC1dYZWwwSUvETsVsIoO7Ae5WzIqXPUBELNKxtCwtSQt308HyDTcXCGsQw5WsOJERROFObbQg+PIaRPbjKMXw65vy4lCuR/1o05y38ZNzcfgnZ82PLlZJTc37GLLazZg+Ol+vKNbOweqdMuQiRF0MYVZvRxSmRakSwEnmcNZrwC2aQrWF80VMvxo5LNy433BsLD/prYTmH3+cTqNvHdZ+XDy88VAt3i6Fpxny+qKzQLeZrXr0wcyJUCtVNflly5klRM2ivmHmSbUuKsw9MiXD5Vg2kVPRV1v8YNM+P6TLSZP6zQARvNxSDPOCGcCQEAPcEQU3Aw4TnfV+fUAMWHd4tXdhrCJNxYU8sqdincyu0mqWi/Kq5xCNuGpcQe1Wj4oAM0uTDgNMidhSrrU5YqailrPnAiYvOj57ZilRiNJ2Zb/NN1dhe0USZH3ePv2obK/Lfts8/QjuZXsdH30IoGyvu08aAG7GTcNdTyFg8pqp8pK8ZGKxaXQzCsFKJhCIoQqpeg1WSWRuNrcVzFwqclViAROKIjCBZ577LNlAOO1O8JmtNV/5ZvEsWpj19wDr9xTFrJPQSfw6tKR/2L56ciIftc/TZHqdxkC8DuHZOAhRMhvVHDD4p/u8zS6MZ3uMidSQpvk0z1NdY8CKw6uFVD1KcCQgL/UDsIAELNR0qMZTuwF966uIbH6TtRfbRv3/2XuXXsuyq1zwG2M+1lr7cR7xjnQ6wdiXWzwkirpQhiqEoNykYYF1OzSQEA03oEnDDSOZFj/BHYSggUSrVP8AZAmXyirVg1s8LrYvtjOdkZEZEeexX2vNOccY1Zhr7bNPRGQ6M8Ngk46h0Dl7r732jn3WXGvNMb/vG9+YeZ45XpdyFELr/LfXZ63zd7vljWa2zkNRGaTUv/Q7292tGEutN36X7GoRGjV7PGzPhu0yNB+08/TLeIF4SrJzBXQYTZtHn8RDrrCSRyNdOM691yXANQOzPTt1wLoxqRnUbCilts3pKHi2KoSv2iNHZITa6KnvSxJlwnmf1qkYEB175jd3u6y2jO5TJ7GYPenlrbVWCWobRtNRNTTBUqGUCQaXcTmbN6Fth43XDDQAE21Vd1LWZXiiks1KFY4zB1ADGExVk0giWjk/c37GfqayxVDIL6i7axyNHZuyOSOs15QKH89s2dobT/DOSn7tk/4njiMzmRkDgfk///T9J9vhnx6vHqx3//HWsag9WO1uz9vo+GI3dME7plvLmZld7Po3ztdFLRXRWE1ZiZkr5RrCPp260rBPhQR7EnCc7olY95LePR1MV2OEZ/rqHJwjByP77g5PH6U4QE/JTHk8wwlThUE9Dnbl8nqVyNayaB0HYPxANR2bcwO1UWxdcjBGlZWaKSyJFrXO82kXo3eblAHsSqmiQzFLwlnNEZ2lMog9OMflll45mr2xGi4He/PcLnZoAtTQBpyvSRRF7XzDR53tADM8ueR5p0Om1Y5O5qqK20doPERry071BRdDEbMkOgsegGMuItXyoLbzg3O18bNs17LdaBogki8upB8AWBbNRUXrX06erVyCyUXPTdh8+43t69+9+T/9CjFbGtLjt3S3mX3yZ6u3gg7D6h//vxu/9GvNnVd3r3/DzZe+WwwPX2/uvlqBqObWK0S8+84/l9U591sA1UZBhx03HTlv2zU1HQgmgpqkmpJzI4S+NyB1ruZGFOKBaFFrj53qUzqyipUx1MmXmNzoKrln3c32JPsHjZcJ1vchcvVYf3+1cr2Uwz3VbObCBXoD1jn1okvvbTJWyYpNsaQgQ58oF5QC1RG1kmwYEyyYmpUx0xpvsQRyRpPzqTkQkbBpgfPkAup5WMQIyAyDeVapAgJAYQuzm9HtJD/uNzfb+SI0ADYlMdHtdvE/37qTVP7b+nL/t+xKejbTOortpqR1SQacxO5lReG/TdAzT69IjsMXJ/HNXoTzHh91jSScSgmJKnVFmOywVa2IUrVjAMSMgSrxdsy17yyNom+WLMHxzVl70mpWNYNnWkaf1QCc9WVTtC92a8ZmWCUbyki4hClX9w7FTAJpgpfCmgGDFWga+6yBiTyxwRiaqyprzCSI2UUmJnIgViukhcMS5GCjeyFAyfvsyQjsAEMqYEbnAcJ3LsUMJ62LjgfRLrj/7v6thxfrbS7/98MVcPGJk4VjuujTURPYcRKJcGY2iyE4d7FL29Fr1EQNvNexPTtWB4CWPe+lKUW4NjyHw79HbeipFw6zrY/85Xl9RfHUAbhSZYH4CtmrCatNcAdNYGFdZ9iE5k5KRDzVm8gMqlbEZFr2Nt4FR0OxLLpNpVYXJrHAorBt0aEYEW0TxMBEwREDlzt4hhmGjM2AszXdOtIs1A/UBsuFkqAUFBlniiETkQ0ZqSB6LFtkwcC2K0pEQBlEoo51FXiK4x+3mJYi/U5TgmpNrcxgRSQpOdKsxArA1MquNCdEBOnz7o1vkXN+eWR5SGc9f/ebHJv5J3+6rM7f+F//t9mr34w371pO5fKMbzVIvZWiJZsUvzwNRzeGdqY5aU4w49pekGrypGY6GZMYMZtpLYHUkg88rgDiaRXIpvtUbCwtJGYzI3ZXxib7U2I8Clc9c6Yj8zLB+kFEVfW+f/hw5sPh3kzkmActRW0npXPcOl6VomYKDKK9IAsUSBmlQARaIMVq54+xHYjA1DSblWuZNtGEMxA4EDmQgylJNldgLalClKI3xxBDrFIZUgKplaJ2FKIjGrTsSupcrGfdZe6XoX1ldgzg8dB/Z3322uIUQFbt7Dm36Fvt/PXN+ToPDJx8kE6IL+MF47lz5nVMC+O8OzGHh+Kdw1bBe1jrqY8xu9px8sICEXlm73jfNkrUQIje9bkwc8usZp5Bk/CIPJ/vUl9kk8sgSkBSI0JkWkZ2hIukRa3S3AQEBwMco3IlhVB6GkIAFm1ej9+xJljsfTw2U7Nc0lp1UBEtAwhEnojJRSLPflYlHcSBONZLBQaosJkwqUNwVlvi9gnBITqsenvAYsCnTsM267fONrPw9lBkEf1x4x6s0yL0dxfdWT8kUccsRaJzWVTNuhhuzFrXD0ORmhKpjW4Xbmp3NQ3S1JVlEiTQQTqFaRavOQGuv3N8uf66llBcreundPNaGv4RDrqaLmnCL4xGC9pDuWIFPSZ+8GlK/UqwtV8SM6CwCRIbBVgGq/IPANHV8kB2xICKalYTG3uE9kUZGIptst3sxm4Hm1QqWjlkNAF9QsrEhJSJCKst6ZZSS9ueJBMUfYIUEI0rgfVgVRu8y9Y4eEYvRiSOMbq6qxXRZlS4W5WKmxSTbKUAVl2vNBdTlSQmBjMZFFSbIFi9VrQYUe87b2bpyRNiMhG/PLFhs/32Pzd3PhZvf8x1Cz+LuzffCDe/6Y9v5PNHZX0RTm5p6usl4Hdr18780Q3LQ9msTAqj2xuEVu/Qq0UG8WiIBTMp7HxNZlHNek2JGQQrwiFeUTwYsd8rtdV4zu9HfsyoCWx6fcw/YLxMsF40Bi2i1vD7PZI8mdYAWOehc6GYipmYDioNu8tcLksphlXRy2S7giLoM+UMU0iGJNMCSVY2I0grw4F3WgWjZdqiBiJy4MjkQI5cy+QgjiTBN5QDVCkEeIe+2CLaIhg3lEw3RWZ+t/RhICHQzuXWhZOmA3CedgAe7tabUgIP6fLx/W55FNskJT5jWBrY3W7nfSlbyScveLhfxgeKgylzr7+6nktV0rD+vJKYYD9/H9SgYc8iEYBad0c6uVdjmvs9w7zLIiXrvAlSbXRUa6fb4FjURJSJdrlk0aGIms2jb7yrrdMCMwFnfWodB0bnbZOVgVmgy0FFET2WHfpcy2NtM9Bqi6EhL9wmM9eRKWQAMbkW7GS3VunNhIid65xrLdiE6jhiR+TYRQ4Ldh0okGvg5+Zn6mcpdtmxMozRtTaLcM6Y4R2Cg2cUwcON3JmV145ms+geb4ebs+YkNP/pPq9TOe9T9O7uYrYeUhdcRfJSKRc7m0V55fTotsjltr/YDVaZ1oqn7ROsScQ+5lVVa1Kpq3F8qu4Ntf3z5Ncwjux4DuzJ35EYxqiXm55W4vGKJ/tIh5rx1B8QNRmqKRLRSP/piCCO5QVqOGAG6SC7rX2Nqp9ZbfNMU9VZFvXMRbWoZdGiKqpZNATXeBddFeHpLhfAGBjKuKjYFctqBFwmFYF3uBjSKsnDlS079AnffcJqWO/YBG89cXxGAVg/5q43wLIn9DTLtlnSeo2to7oKD96ih5ltM4JTR6yKTSpM5JlTKW1sXdPW6j/NyXLSYZB+W1aX1YghXW51EBXLm7GJyLAhERAhRKuUyPZcu+UQF9w/POPo09mKnGvu3CdVKzmfP5LV2fInf0JTWv3j353+4q/EW6/0b36r+9gnLaf+8cNw4256581w4244vsk+0Nnb6e03YCablZstLCedznsrhdiBSIeem1ZztpzgQ23qXPk9zcm1M1PVPLimlaEnx7V996isqlFRinpZsbMRMxMTZXYqQs6Z6Ye7MF4mWC8UZjZIySqNe37rmGcjOM5jLShmPlZ/uaITFUxIqmq4yLotlhWqqH4nRCgFZTAt0GRlp5oNalqsshlQ08GezrgN1VrbFDXBAsCR9pOpNxQ3njtDBhOYkIN5IiVsSpn74Ak7yaiEpo8ATmKnZiehu9Gsz1PfOX+Rd/MQo/ODlGdN4ZehjVwuc/8hD/TL+FDxFCL17MNnIa46y14V8O+318JmAk3SLDtgQ1QVgKvODRNFVVRFrTo8MBEcVMFE3hFQKhm9GtKjbTpu/K15+2Q7rIbMTJF5m8smS3RMhKJ2MUgxSG2vGUZHElEgoghq3wIwjGiIEXQUemKAOVpZWUqAkWuYeMJr6lEZoX8iR+SIPEAgT2EJAMTGUdkJ8xBZHMAohTRYwxBFFnRhxC2Co3e2Jbr+FWpvzdvXbhwdz7rz7S4X+ZcnF2e74UbXALQa8s1Z2wRfjwzMmhAAeMe1GbYj2hcGjjBVxULoqnpgenptyCpqMs39z+Lp7wqy0/UdPvLZ1TUyaDrPbX9Cj5lTtRoZ0azqDD5KohU0ZrpAVbRPXSAnNGtEWKeEbHxcm4X3oo7piOB41MyJjbwhE/UiRa0vet5rXzAjnMzRBLvoMyYF2KrH9pK7pZYCA8qaTnaSPYcCAsjMJbAZmTU7B6Ohw3pHapi3GIpRD2usiPVi6yy9yNz8OPGMx2Q8t0yrH6/qMMiu15QBSFZJJgWSAaAU5EwAlWIxmvO23bGZumiAODUOrn/rIVTD8Wl68rZJ8csTYhdPTs0sPXqrufeaXyzL5oJjqyUBpjlpv4Vz3M784jg9emCqlgfYzHQSoZuNVYHVcRRkUqzaYlVyt97CVIlIpYz0rinBjWDtwVqyDh+uViWTK+nYokqJ/KiI/+DxMsF6oagjMdTF+XvGruSkJbI78u2TtK1ITx2xJ2lbNcKOaCPlsshObFdGw8aiECUzSM2usmmB7FSTmZhlMzFTWDErpqlerNfkBKilrKbkiFxNtogjE0OBgqktpsExUTYmXHo1cOdwkcvM5ZMYBxMCOQr7/MnMwHS7Xdxs5kx0kXb1L3XvciI2zvvC9r7Fai/jRWPKng5wq2uv0tNbafrxDF9IV78njfzIs1SKfFxWAo6pqq8ccyplX2xVRYrMMIMnCo6TSOPcLHggARS9WzZhm8sgWkTXuYjaceeLWl1EMOCZFg2ZYSjYslWWUBSeMWut722I1DduuWlmBucbv3kTKgD55iaqCaEms2JaJumGI3IAjURh5Tx8B/IgVvbGzohyhDHAJjrSNI6RCpLg2JFNjRPWSc6H3IteDvn+0ewnbt9ggpj9H995GB3PG78ZclZtDUxUSwi7SvNg7DO4txaz6RjXg1x5VtvnW9ckIyOoNU38Vw4OT2VM+4G9PqSHA/9CbMi/o6BRjkaGej+sN8u6Nph2gV1Jn8cBIUBHc3bQaAk71haOGRjsqsSo9sbhg0/MaruiMo0OTxlYUY2O11m2WQex8531GfNj+rGbdNnbv1wMqFpDwfmaw4B4arsto+DkUmJJhFgcKVGbCjCK85uUigtD6/s1UzC0tumhEdHjMln1+6WK0hkqnLYXdaP+UoGKStGUy7avrIhklIySSYVEIUKixIKcqWlUlNZb5y/L7AQmgkFd2/dvvw2AnJfNqvt40NQ3t+819z5++V++5pcnbn5cLp5QiADVqUhTTz64bs7NrIqFaxtpYoxXmopVcZUI1MzURConuOd8MdlNVENUqGK0tlIQ2/UMa6IdMe45gcSYlouqyh+qne7LBOtFY+6bbPo9E6zOh79//Hbn/H88ujXzofJoxXST0uNhd6vpVjkV002RpKpmSWHAJo3a9pyQNlYGM0U6H9WSZS1WDArZqVXBe7GpgJhggBq0XkagjskTOeJkFIi96ty5SBYpE0tGcUSMIpQKmOwi6zLgVgPr+3Upr3TdZR4u8hDYERCdzyrneedAVVZ1HLv/evHOUWhuvrvKqjaBnr1LyeHL+P7GnhUCsE+xxomFAJDR1Zr7ALI6YAZpqqUaZ/vx/ksTFQWCKKp7OBFq8xczVUP0LrZNEa3UiZ8s4mrHGABdCLMYjrqGiCpP8eM3j28tus2Q31ptmei0jYH5csiZ7UbrU7Be1My22QAEB1E4w7JDF63PwIkyYTvQ2ngI3WIXZnKL4onTwXYPrWxNBzMxM+Lo/AyAWSEwuZZcQxzAERygCc6pb/t23kevTMbgxpxDGy14FEHjUR8YMI9U/zgmKmqvLGdJ5M2LzT88PNtkuTdvf+xk8Xjb91nuH80c8ybleQxtcABqnXwZfcEsi1YKRIC950sFlUHgic5j2ncxmhjEqUhwEv/Y2Otofw5M6RNdZcn7wT5cnH/006xKCdaCjKlArKa8UzkhEUYIagSiRJSeeglUhVOidggAFVUCJRFM3SRrxhsdD0Uik5gNRVIRx+wdF9XAtMnaeueZVknFkAVPNmiC/srHWyb639/oiXC2waMVNpeMBruBTh+JERbbMyMXci++YSl+ONOwIC1GTDJQd+Pkkvrg0inWO2bW466u2+10hsbbKknrc+M5i+SicVKCmxTtd5oGK0WHQXLWJP1ZLgNKoX5LBpRCu8KOLCk5JTVcDhzYDPT4zBOVdkl5rZo2HLdlvTv9T/+D9rv+u/8ifa9pcLNlvHWvf/Adcs7Pl9bvXDfT1PujU1OxofjFsevmHBtNPQOWE7wfS/9EoEqx1bQDseYBIA7RRChEqCIELQWmKsVK4RirKymYoNUoS6r4fSwndH5/i1OtabMSucl39MPDuy8TrBcOgid29L3T23UpZtesz0V1K4mAxvmLPFRAqiiKISnUMAhyQc6QAhVYQe2rS7UcKtfaX7VkVhmUfkqwbErM43hamCkiWSAYkTIM2KkJOSFyBJCppYFChBl2eaRj5l49wVHZSonszKyXEtlF51sfovO95L7kiuSdxraXcpH72+751qNWa5gPVnUv498mDqjASSSyn2TpYKd3hTf2YOiowNrvwEyqIxbgHJuh8l8s8FVryrxXAQNwTKmITu5BgB230TO3wfdF1kPapgLAO2qc2xUpqgR4ImXzSsFRowAsCwxghujoAuWdDRl9JsxtGIjg2Y59ya4MzpQkQXvqHwMKjhxPa6mglfUk1WpADNep7wAYeTYzwhDHP9w78w6Nt+jBjOAQfV3uYh6o+lNk0STSeFdx3OBK492nbp/eG9LFbqippJlVEyzHBCJVHZflWmduAFfuShW+AmgST+0H5VrLwYOXnkUqnz4VngG2DvKw573jIxu2/wFMpQMTaWjAZIEBqijsHvC1Ef6oPXCeTsuYJrvRA+MMmCXR6Lgq7epKZE/LqaHIyIPUjakgFxw1fubdatjVysHLHZPCzSxt+dawKj5S6YkcTMiEJEF2DMAUHEkGX4YW2MWZDgRBabBNZLDjDknQF+uLJNGhaBFlIs3JpBAR+WCmlpPmDIOmIlkAlEIloc9j56adwBMpkCtiZxCt/BytVw4QdujX5oMxD7JdczuDSDy9CdjuO1/38yURynolQ++ajthpGmBmJZOP5AOpkg9IvY0bPawyfZg87ZQcQ3V01jad6mcnNEsVMGLWUtgHXEG8Nv7c41hXp/3VafHhrBkO42WC9UJhBjWdIIHvEXTV4AIA1DSbJJWqhdyJlNEuBUWRBWIoAhFINRTNldmosCd0GJlBHcwGRQHEkGvdk1FWAGAydmMjs15NGAIFSBVG5EkTYCCnAHNA7mFGPmDIo69PLxbZotq6lIVHZLcuqZskVnUOaMPYUaf1wQyD5vc4CMU0aWldeI99Xsa/QtAzP7FPs/b8xx7Nwn4rpsl3qpbdQyZ7P1KikW9kJlVzTBXcqpZCU33cWGDomYUNqqkIgOjdrcUMGLOT+mF1NU9Ej7dDVmOiLrATAqQtlUrDUEBk0Y0UYfDY9BiAxpu12CoGpeKikxhLt9g2TjLLwH4BU5jACojhIrm2mj5rPCYTgPruWJmVqDgWJvVwrXlnwVsbLHrUf96hZlpFDKhdmcFEu1w76Vrj3VEbq9XQUds4pnWfHdNVO0egyqqsKkZGD6r9tAuqtkwTb8hXGNUVTUjX8939IB7scu0UOECynl2U/8ikVlNcP80JNbUiPKeBKo0FQ3sGDYfH60rLZdMEXlOxcbesltQcEWjvhWn7FlME9KKDGCYjrspAeKbG86qHKIpiGMgI3lu7AksmF0gTAGgmU2iGJGgBB4JBepbBEbdJvZARhkxFAKCoZbFBkNSSaF+kaG2lLJO5KBE7U9XaEs0gvdQ2faKUBUXJETKQDyorFWCDA0zhM2Hluk5FkAawk7JexbaDYxQy1Xz+ONy47WZLEJf1BdoZOW95qLmUCw05T65wiMoMFS2ZMdsXCULK9B+PMCSmhPjKT4Ngk4B9Ys3HgZ68Hmq2vG8XjXHnqTT6ua79HyheJlgvFESjzc/7QbCOQ7zbzvdPp8bM5Ije2K4uciYar8OtWBKkgiFT6iHFTCGDaTErJoNahmbVrepWUayKXDAobzOIoEY5V58rrBjOG7MFB88W2ODhTHpAQZEsMgiSjAPB2BSSiRklUipovCXVQYwpb4rcbRsAb/Ubz67aYs1D/H+fPOhVbsXuk0c3iRDIvRtGFdg9GjZJy0nEyxzrXzWeOvx0ODcDGIm+SWOwxzDGSduuqgWn5Gv0YqgOipM0AXXNoMpMalBVZgrkah2Wd6NHQxbUO9oo7gaic2oWnGu863NZto0Bl5frwIzokeGUdlmY6ch7R7zOxZF6psDUFxtEl8FqyVUbLBXbZQSHeYOh2JM1Zo05xqanzY6GntfzOQwhY7m9EUphLaxiRAAVH5QdgOzcEB2AUHQInAN4acwagaOZzRtrAtqILsA7tAHBwREdNVTNJu7MQxJbZ0kiR21YNvGf3j5/Y92L2mtHF7dmzbIJatZ6v2gDgZgoegegCb7yU0MRURNVdhwc1yPspqxoLxHZZ1TXtIxEsCve7zrS9TRkRaOI+0pyc5U2/AjE3mUUlRIagagJeZrm5z1paAdCJUyuImLTSyAAYmZArUwUNSaWCrQA1Z5jm3NRNUNgjr6WbuguCxPtigBYJ0mijug8yc05rXpbNMRED9a9CNYDhow8UEjo13xvtxtqg7J0AVOzTLyFFZMEGPk5rJgpJe/zZmkmLuQQV++E7ZEdz3U71C7Rlk5sVzTkskt5O6ST+RJEVoqmwaQA0JxlN5Bnjrx9W3OiIbMaFWCtWE1ZZoHFehyABrQ1BKFVIdvya7fKZs39gMXrD8j57mM/xjfuDO88GB4+0JzCyQ03W5S33gDgl8fSb7XfwsxKgqlrOr84lu1K+50OO5stTLKZOnZWstXegiIcx/6JVF3dMbYUrI2lJ4kxATVFft7JUOtGKztI1VuLpxyr7ocPR52/TLBeKOol5/Zunu8Zm1Lag/I6g40WKWobKcUsEIlBbDSqFqWxktRGp6tqkWgFo7x9UBQDgGTYCe8KaqOlIhg2UBn7MblAzpMFUweDDWqRwCS9sjJUORIRrECSkSf2kAL1UEISeMZWLKtllTbnV7tYTC9zXxMsAJ750W63yuVG053GmWPuJT83f6rq+Kxa7eBf+PC/jPeKZ3Os5+91ODXXTdOvp8Ct/YvXtLBUJdjEVFH7Wlk1VepMpFgWrQhuFX4prAuhCrOSSJ8LUTVUZFZSs6Ikgbj3cQAAIABJREFUZos4FoLM4ApTVmOCY22UWm/brEwqil2FHoCeYMBRV2c7nK/JDBQNBEtkBatZMAoA2kHZoEx9HLkhp0gBGrBTBgHeGm9dY8HBsQWPeYM2IAY0Hq2n6MFA68kR1BCZO09D0aHoZsid9//LT358O6S3V9s3LjZZ1DF1ztfm1osm0AGZF71fdg0Puc/1egZT7c+Lg7LBPXR1bTivhuZgy/4XPf3w2i7PPr2uxvtoRs2KDEoHU+iUdSlwlWvW1GrseDMK4cdqvoqA7CGtyaqzyhNr14F6qpOoeaY9S+6ZPFOV6+1yYa41hpbV1OAZBswCZbEu4LgJb66GimUOmWCI2ZwSgOJcKMU0wQRjodNY7oQC0wxiymtwYFmQZjINwWeCGl3sbN5g0cIMfZHoSPZEDNUaPTURmBGT5qJZKiiXhbJip6MIZUsisMZYyMQoggeoBxuQjcywBiQjBEuZhvM+nJ+F45P5vY9bzvn8THZbmEGEY9RhkM3KLU80DSCwiAy9azvu5hxbzclKtpyMmKKD2RXGWOvvK7Ll3DXdeh1DmmoPJ3zxGi5lNrXBmbZfX4zSs1fPB4mXCdYLBVUQ+P0d/Wx6CHQFckzkiOuVUeux6nWoNp4wYw2LwQSYSgWrp6jmSXdloFXhPqEUmJIUKz0mJwgrPciRi2iX4xfuGcYItazdlKCDgcAEHUy8uQBVqn0IikINSZDNAFzm4mdMRIPI/g/5mZO7t5vVZR4ucp9UbreL90ieWvbFdG9U8TJ+ULFHRHCQMO0xLUx3lr005QrmunbTmfoPAmQ0iUvG1b9IbbpXHRzIDAyA2QxZtIlMhFx0FoOabYfMRI33alZU68SGBqpW1NTARF6NiRqnYrbNNWODmTIhOniGZ4sewaEItglNsCaaY6y2nAtyA45WL8HVwJxBBp1b7b2TEwEgZ3E22lx5Z8Fh1oyiK8foIrxD62kW0Tpips7TLHD9Jq3nSu4QUVGdNyFKuv2x232R715uz/v0M3dPG89VhuiYMWGBgLUh1FtAFhm9fmiEqca2atcG4CDZOlRiXY3u/vHT96Z3A6t+dEAsOjyLn/qTr8jxusd+67jtUJRDGEU/OlYO2oTvwjNpLUSDiRnbmIrV7jKeuK46UoVbAKu0nRoBgYmAVBCYmLDO0gb0VVxoaLIgAzAyc1KgxazAFCRQAZGWHVGq31dh7OdUNvVP9jpTcZueVLFojQmbrEyYB1SwmYg4NmAyybX8ltgBkEHKoABESZR6QKqgFraxksANXCaFIZFGIw/aGiIgsPXWzWcSHIaVNpeb9PhRc++Cu3l7977mpP0unT1y7cxMpd+6xbGVBGJTkd2amF07d7Ol5iTblaYBRL5pzXQs/BztL/ZHEQeGkAds+n7Q9hufHveDoul9CSH2xOKzZPr7jZcJ1gsFEQ1axGz5PuCYmXPFDhILQhXwykQdD6a9WBrN6+rnwwxaoMU0TzXmvWpvlg2DIRuy8sVFxatsuBQZbGy7JgC7MCciTSsHo3YJKS4X886it4W3aNSxeLJC1hA5wlaTMfG4bu4LWo/gcZH0OLIakspRbIrqRdrtW0G3LojZUWi+sXryt48e/tLN29Xn/dm42cy3kgYpouo+VOHry3j/QVN3uecs3Z6ZXvYQ19NLuPG+NG61UR1PqE7HU9c2g9WbNIAsomoG05RVFUTR12ZhlIpU4KpW3maRPpf1kIPjV06WRbXyaFXDVC3isugs+rqGXqdsZsVsNZR5cEl0ESWJZbW3t0WVDNhly4pdtrvHpoqsGLJkQSpY76gozDC/bY2HGi635J0R1b4iICB4A8CE0wU8wzFOZlfQQnCYBTpqODJ1ntUQHLWOCRQdHzdhnUpfpBP5pwePCNTuys8ex5/utLvzsf/r2w/a4BZNxIGSVs2Kmmd0MTDRLuXqNUoA15kYE3x1za/oqd94/u/rI3v49HC49zn0szt/9KLWYFbji8NKQNWpKQFGunDPJNoIbVQrsv1SZMqrxnpDTKBj1cGCgGIGIImqmWdepVxlVUV1KOKZ+yKilsTEbJPNgJOWH25kM6AXe3sziOGow7rHricuiCW7kkDU9cWVnVkBYJprZyczKcNjEDNHld43N4gY2zcpnjK5JqVm3W0Gbu6LIwwFj3fqCEU1FRFVFTEpHDvXLaqLuus6jh4Y8tZK4SS0UmRggG5Ji5kBK8u1/moLJkOBnSJcQAOIgTcyvbp1J8dyecbAhv077cceu26mOcdb95u7rw5vvX72f/5tOD4h57TfFsDNljb0+clDqLr5Ubhxh3zYXj7RfgMCcGw51caFlcesVBARm9nk4j1BWBWZeuq+V9vsTIjjgSjRwNNKZsq/x6mQ+cPlWD9cCdY3v/nNr3/96z//8z9/9+7dH/R3eV8hown7+1r6rUp5fbs6Dt1hYmGordxQ3dcxVWXraI4NU0BhOlm0K6oDFnT8R1mhAhVoMROTJNJb7VMIIiL2MxBrWrMLcAGlkEUwWXaoLd5nbAwt011fTIsJkwjMIApClUNaw7aTsrTYsNuVvAwtT9ArgHlofu7G/Y/N1u/027m/Sr8OI7CL5rOKPb2IeBnvGh/uurhaqT//1boum0QG14mmZ2bZq0U/7W35Dvvi1TcdoCnVSrGoOiLH40RV3cYrFbgesog6plkM65STaPDOCkzUOxY1BwN8FnVTtzQ1dGZmVtSKWnSUhR1TUeuLiLo6z22yDmJdIFXrC5LYUJAKRHEyMwNEsBkQHJoAIhOBc5g3xgzPiB5qyILGo4vwjMbTLMAxeYZnNI5mnpngmYIjRxQdU/VO9VjEUI/Kso3Ru8Z7yrt8eZbO3vnxV3/ybNMTEMYqQ3hmGIqI5wDULuxEUz414lg2rcSv6dmvcYTPgV0OzoD3OkcmGc2/x6vxReaLeqrs9Vg0+YXuD+shXTj5YAEAgbS6YU2sX+UcS+33jImNOnB+3xcVVthFJ6QkMO3MeMKPmTAUg6eiAHC2tXWSu7PwD1aSAIAvgIFMSK3WatRVk1lGtRWQQSURsRpUs2nSsiVuiAianEiXhJXVMBR0giRWl/TV9Zed0zRo6okd+aBDX7svqZgqzODIDLSF1hlpOypUkKHFVKEtuQQdoAE0QAPYoOvCiwLHGHaUzrcQsVJks+7Tt+KNO+0rPx5P/1GHXrYb3ICVXA1OkbNJgQr5wG2Hqqyy0QF1T83uB2xCmQzYt7B/hhY/KFC4Cpug4MO3XF1ddC0P+4DxwwIhDMPw2c9+9lOf+tRv/uZv3rt374/+6I9+0N/ofUX1+HmfxZwL7y9SenN3cfV2U5kuN7PR1bd+2IGPv9nkmVarFnHVBgcQo8rWaTbptQxSdibJat8l05JWki5Ns5be+kukLcqAklEUVc2ZzHo1mQReClhN2EwKzJAVWaGGYmaGXqWXigJgqAsIoHVhPrlb3WoXnffbkp9/QtKIkL/PrPRHPF78ungGvKDDUrW6A13Nxc/Pya4U1teeHuxMY/JERMzkmB2TY2LAMR969NHUcHg7pNWQxOw04FN3biyaMORSv0zNwKJzjXeNd613jfet921w8+hnMcyiX0S/jOGoCadtOGnDcRPuzsOdWbjRupPGnbbuzoxvzvi4pWVDJx3dXtArx3RnSTfnuH2EW0s0AUw4nWPZYRZxPMNRi3mL0znuHuHeMeYNFg1OOuoC2kBHDR03fNzwPHDjuPUcmDrvGseByTMpTNQaz9FzRUREbZfyv2zl7ORj7U/87HH0r944WrZNNWIlouAc87jStmluFtWxALMODT0zUzxFC04ZLx0c5OeM4vc4NyZS+N+DBOsFr4uxSuzgDjSOwVPI335Stf1OI+NEo9X7aGZJe3s5G01DJt6wuomOtbr1zM+ijtkzMZOOqw6IwTPEsMlKwMkMlzt8+zI5RnQYMlThpX4GkWSSRPt6ba0JktZ+UGpFNZkWlUHyesxFpGdJMRenGDJtB4gilRFpE61+neDYmBTNg2tnxGwlA2YCFYiSI0RgS7KDqFlvsrMyFeVaMikwhQ2kBhRCrfTbGXY9157LaS0y7DQPplLW6/T4oaa+uXvfdTMrBQBUUUrtAFlzKWLHPhI7aJ2Z1PbSmcMR3auvDtjuyVD0aoCv3jjBks9b6h++64XiRRGsr33ta2+++eZv/MZvhPBCmuU//uM//uu//uuvfvWrn/70p//iL/7i937v937hF37hs5/97At+vX/tqFeOI5Lr+qrDeGt7KWaNc5++9WpRfTSsn9rBE5shm1UNr2fwXnplo1Qdk9p9nwNZNhqEklARlF76c5Vq9J5VS8mb6qXGLua0MtO2u22aKV2ya6nMKLfsbmgXEKAbBcGxk50CIMejU13BkMk72xUQwRXzrBc5OyIFOufXZQjsPHPj/CoP7/TrXrIn9+OLG+9x0IJzXtxOcmD3UTXE+iG4Lp6aKg7Bj+tSquv7vFuOdbXbwSv7voQ1b6tPCWi8G/edSBbHtZE4vHN1shE1NSuiWiw//vbddi40Y6JZE/YQbxap/kA6wQk6OXMeNbGYwqBmSTQVyapZtLaLrrWKg6gaRC2rqiFJLSvBILYrKopKx1fFcSrmmaru0DM6T57JDNGhdaxAdDT3XEXKVWcTHM8mR4n6ycHxIgYiEOioa2ZNTKVsUzFgPQzHnpq2K6KT6M0qW1oXTwRiGtsNEcA89iMcfbDIDoVVhwttGuf7p8sKDx9O9gHPruvp8MG/dnb1Q3BdANO8uze7qiSsYcyNrpCQ8fdz3j+mZ0QwPbxgJsZcbVp4B6aNmmNyREWrI4MQ4JkTBNOKIolVx9HLS7u75J/7GO2Kff2xfPt8d3PO0euo6q4oZr4AMcAghibVBBMjJ2Wr0hN5sKqk3D9hF308tXxhml08dr4hhPWaoqfTxZgX7opucxmKGCwcnZpI329gyu3MsNUspkaE9cDFoICaXViqTOtKkiOacSimAHZWIjiAI7HCMsEb72BPen6lUQDbC6THj2aLo+b2fR12+fzR+ut/H2/c6l77pA47UyUfVbKJcOygYiIcG4qNmy2k38qw8yqkYuxs0rlPAMdYa0DA1BhuXAiaaa0ltNr/Zl9BfW2ZefALkya+IlAvUGf7ogjW66+//lu/9Vv379//gz/4g6997Wsf7kNE5M///M8///nP//Iv/zIz/+7v/u6v/uqv/tmf/dkLfrd/g3DMnrjeXt9tn3VJqzIkFQCe+V53tH+JiRg0OjWPUkfIBHzSPtXWa1UR408FxKAKERvpPVPNqkUlAUTsDCaSas2qau2qI1K2JgNMKBdKgmIwWK6pm1kxq+sHgxlKQS5Upe71C2S1bZFdKbU+OesIYh3HdubCUWhvTE7u7wHsVY3ni9u4/dDGj8h1QRMkdn2eJi1ZSwHARI7ZTVP/2IqYiIleOV2+erq8e7zg2DQnt13TzproHYOuALAm+Bh8E1xwLjjXBD9v4qyJ8xiXXVw2cdHGo6456Zob8/a0a47beNLGm11zs2tO2nhn1txftK8s25tdvNWFe4v46lH76rJ5dRnvz8MnjuPP3Go/vgx3Z+7jS//asX9l6V9d+I8v/Z2ZO27cvZm/O/enrb/Z+ZutP4pu2fhl9MsmLBs/j34R/Tz6Wf0Z/Cy46NgzR+e846FIEY3ed8EHx0X0suDty81qN1SbhpFyJXLMe4Vc9K4NPripPyhNGNZVOSH2GOSzlQpPjQ9dCX2fmkJ+MPHDcl3s76LXWNcx3u0QTcDHgSrrSr9zfZ894URjmQLReJ8Xsyx6ZXQyORvWS0gV2wTPOGn51sy1HqsefTYmMEN56peoCaPuyqZlTG0DpTr2piXTopoqUWhla7KDZjZhRSXRcqkKEMtqjriI7oYMAKogrrV1VeSuxUzhCGIYJsw7Wa22RTIRs2KqMAAZWv8JDDAHGDAApYyZT7640JS4acl5K1l2W2J2s3l9Ss7BbCQBpwNK7EC1n9ye3LGrjMfsIOd9ZsAOR/zph9N18RS+dY0PtGff9f7jRROsz33uc9/61rf+8A//8Ctf+cqnP/3pn/qpn/qTP/mT119//QN9yLe//e0HDx585jOf2W/5zGc+89WvfvUFv9u/QQR2cd+Y711i4WNk1z2vsI5AntkRE0gml1E9aHVzJXO5Dl+bGsRIlIpAMqrc0Ewl6ZgoTf+0GMAczIqW3qoWXkvFWqkIVW9SG5nHagZRxV6oeK3s5V4wQ+15mE0UZmZpqgcM7C7z8KjfPhm2dcu6DO9x6OrU+wGP97+b+BG7LsaTf5rFbdRJwBxzpQiJibkW2I26YO43nXcAKDQptNLMmBAcRyYtWdIgaYBKdK4JftbELoYuhjb6LvguhkXbLLtm2TZHbXPUNSez9rhrjtrmuGtuztobs+a0i7cX3d1Fd385u7do7y27147nN7q4jOFGF1876u7Om9M23pvH27NwexZ/4rj7saPm3iLem8dXFvHOLNyc1VfjaRdvzuKNNhzFsGj8PLjjJhw1YRnDLPhKYs6CX8SwiME7Ds5F52pJYBF9uNr808Oz//Lg8ePNjoAmODWtOdZIMIEqgkWE2kHlKr+asiSmPQpJU950lWMdHH86yHp/6OKH6rqY0qBrt+59Fe3BC3udIuj6Qa3z8sQP7qneK2nXfkcGmMgTZbVdkRFNNBggZqqjlWFtADUUi47G4tmplBtAcbDqKSADNFdZF4hAzkxME6CmRbUQsWpRyTBV6bUuqlVICqsRGxGKotSaX6CoFq1drci0AOC2A5GVUnXfVl2rqbavtQpfGUYCVMcaKyNATJOpTSTpCFcDuYykW17vpN+C2Z/cIOc1Zx36Op9oGlCzKKkadqmp3tjElImcH4dl0rVhP1REwB7FPVhOvMvUbBN/eLU/0X6sn+UNP9zV9H0Qub/22mtf+MIXvvCFL/zd3/3dX/7lX375y1/+4he/+Ou//uu/8zu/87nPfW4+n3/PT3jrrbcAHAoV79279/jx41KK9z9cMvxno2HfU34PH6x7s6NH/frvLx79jzdfccRZpfVjssVEkV1gbhw7ogFmhtqFkNkAmuSQgI0n3jjOCpSqxypIW9SGJMqmBQZmL6U3mEp2vjGToT/rZrcVWTWH5pjqVZp6YgaTZW+RqtARSqPhlkALVKmaCNflC4BBNciIdfupJ3yNVUn/9fLCgM+EZh6aZWjf7Zi4sd3mRzk+WtfF/lb5HjtMywwzch6mkrMLYb+YB9U+UQS2Kukr23VpZv/tnfPjrnnlZFl2WzCPzValmJn0OzMjZgBUSQFVco6JTNWbERE5HwGDLRrH84bYjcv62mWMXe1AwkRZZJdycK6Mzls05KIjySg01pdhkzJNM0eVmzOTo9G7qKYwo0rdEBzLaP0FGJgpeufrFyZE7xrHP9nqf4i+uXH7Hx6e06w9mbW7VOqrIuqYxbQiHASImYhiavBc0b56iA/49JpajV1crlN+P+zxQ3FdTLBFXcROGzDV29ZtV01y8G4HdvIanUprYaNtKZgoTU2QmMbqtOg4i/Vl7D5Z8S0x2xZpPL2zlS5Q9Pa337BHr+SfuxtOZ3pnQetk3gGEElCca0zNBCUTR5OBOLDrSv/4ELsyM9NSv57kSyJHHGDZ5Y3XhfMsipRRFDXnqz1zdrkEmD+6IZsVVFw7193WspBDbAFADA4YIGLGoGQiphjZFLUx2UJvhRABFJgHbaEE7DI30QLp8KRPj94Jy+Plz/xiH9t8cXbxj/+UL85nn/gPmnrtt25xpCWbqeaeHI8XsveknianKysZ1cxsUicTkdXWOjUVA0wrM6hgD1OMFvqVGjK+wqamtKxCc6Lk/F5HbyDmvc79A8f3E0L45Cc/+Yu/+Iu/9Eu/BOArX/nK5z//+fv373/5y1/+nm88Pz8HsFwu91uWy6WZnZ2dHe72pS99ia7H3/zN33wfv/+HCyJyxO9Ndt1qF3Pvv7F6/Obu8vBKrYzJWJINEBB4fMB79JlG/artk639JzCBHdgRByJX+4SzCyBSzUyOnTcTJsfsMda2jOJLANAMneCrqbtAXQOPqq/rTGXVrKhV22Irz7STeG1+/N+f3vzUYvHPq8fvfdAccUXY3udB/leKnN+rq8/3K/5dXRd2/YHt4dP3yK6uVupW++faVDiN8W42NTNWEdQbn6nrZnl1YY/edERnm93j9ZacMymSes1JS9Y0aMmaBxl2ZbMqm0vpdzL00u9kty2bVdms8mZVtuu8vizri3x5Npw97p+83T9+e/fOg93bbw7nT4bzx7K51M1lWV+4kk5m3Sz6ZfQ3FrNby/nHbx7fOZrfmLd3j+Z3jxan8/aka+4sZrcWs1uL2d2j+Z3F7OaiO+3ak649mbXHbVy2cdnGRRMXTZzFEL2L3gXHbfAVXXNTmSSBiuggSuzy+aPNd75x1MZtylm0jd4xO2IeuzXu0Y5REM17JvU6YjJhVKAr1dT3P9JH/boYCdkxqzrkh65iRLIOfJaee6yvct5r2e8Ibu2lb1Rhx6kHjpgxkSMyM0ekBk9EREns1oKY8PpjbIren/tPnAQzOEI1Csijxf++oa3CChFbdUrEyKNV+4b6n5rKqNslB1i1VMmFsoyy+nXWwBwcD0VMFarkAzlPPoB4/BRGha8OD1SVt08pJtRMYPuT00/TogICiKECUpJMdjvZbdKTt02k+/gnXBO3331QLp6QD5qHWp6FsR+zmggAcn6cBQ9qvvaQ+bucKfYMbUjXfz71xoMBtoMb4DS0Kad3+Y/eNb4PCdZ6vf6rv/qrz33uc7dv3/7t3/7t1Wr1p3/6pw8fPnzw4MEXv/jF3//93/+et/ubN28CWK1W+y0XFxdEdHJycrjbl770Jbsev/Zrv/bi3/8Fo2ZI8pzmVdfiJ5c3v7Fe/z9nj7+zuXjqJU9MqEtkRCbHAEbYecRYR0J8hDSn+yuBAGZwxcPqPWQU5akWNSFyKkVNmAPMKmJcr0arLLnKiLXiaiYdNbF2ldJV1lIxtTqsGrBa2Xtd8/xKd/Sp5c1NKY/6p7X8h0GESXD8g4wXVNq+d/ygr4un9QjTT7v+dL/R3mWf9xejMMUquzyW+ezLPmiyWlY1FZUiQ08+um5W1hefvHN6czETVQqRnYeZllxJRhl2Oux06K1kzclykn5TtuuyXclmVTarsr7Iq/OyPs+XZ+n8cTp7Oz16K509yuePhidv59V5vjgbHj8cHr2VL54MT97ePvjO8OSd4fyxbVfSb9LleSQ96pqjJhw1/uZifmMxu3+6vHeyuHM0v72c31zOTmfdUdcsu2bexGXXLNu4aJt5E7qaUcWwbJtlG7vgG++8czH44Dh41wTvmEWtOb0Zjm+Y6scWzXHXbIZMgGMGzFcXfNBUSzgqcKtTwyHlh+uTw//P3rv0TJJcV4Ln3Gtm7vH4HplZWS9SFJ9SQ5oZSWh1tzACpAF3PZjFcKG/oJ/AX6CVtoIAQRv9hVloSWCmG9A0BPR0owdEj9BNkVSRrGc+vmdEuJvZvbMw94j4MrPIYrFIFYt5UciKL97h5m527Zxzz/25RvosXxfHcSdDfXH6dPfeifXap1DwDx2PeQLfV+3K7GxazN29qQz3nQcB9Ipc8cpSfu0Bhoz//qgGwRurbpW47BCD01CCmCgYZu0ImwikXXpk0yq1Xnsgw2xTPn0np4rVqcQczY7EiyGbTRYqqbOSrWRpVYS1SKPtOX1/Azjpoejz5kqnbbg3q9Xmnq37ogGgybNqZZsG3Azg8O5b+cn70i0Xn3sTjvHpEwlxFmCJtz7qtcKNGlo9wQQDHBcM/sSKWd//M/95eDKfeRqOx/R4/nMHmGL68I95cfysRMPf/u3f/smf/Ekp5etf//pf/MVffOMb37h//1BB9s1vfvOv//qvv/3tb//4TOj111/HDPy2ePfddx8+fPhzXf8+wTD3ig9NsK7z7iT2q9j9q/sPNyUvw+FHCTnU6kAQ9irZfYOqc8muCkQggaJwbWJ4sG18xD3Sg8KcqUfeNF+GENdWB4N3/b1aR7hp6EgBaFYoSgnT+ueOtIQGCBE4ZdrtXLRDcj+VHBsJT4JG2Ff3oVo2G60e10426lMhv332ytNxW8xeXx4U/cfh7tV9sLKUn/qU/aWIT8d18eEbu2f//Whv96yyZLoX7c4ZuAJIDY3Xc7dp6066GUTqOFDE3fPVU7hLt7j8j/9nR8bzV2zxm16ylWK7DQCrxYYdrM6fa3BYGb1kuLtZ8+fxMk44WcltXrZhQ7aTVSlCVRsHtAQudZOkAwBFYpJ+6bUADMs1SLfqtVIDVRmixCSpT11HKoM6nEJKAJzaEOKpJoUkwGqWawUmKVVbAupum84eLF79nJutRG93o5XcPr99VlsnZpF7GEpxs7mH+jRMR77jM+X6At724z30i4tPw3XRFOUNKWynruytsKbEA+5O7HtI+d0aMhewwnh47ZR4WWtQ6DjeArsj6oTlFPdsrrVZZKGZenj2JLLJZRVlEbya/5tfi/dW5Z8e+fdWZVs2J4mvnvD+ib19IVWw61br0LMYLFOi1x3cNC5rvqGoSGPOBSBFVTuHC1V0CS+QQMAG1uBR4Y6b0ZeRl0N+stl97myt3aKd8wzRrVKDpCi6qwUq3gtHQ4J0kEq/9dzmfxJKKW4CJqqSg1ucEDD0YAGEKMaSmXr3Ut3q9u23wmKpq5P1b/5P8ez+9kdv2bCL61PPo57en+r+4CCpQWJnIVoeffIA8yYeoIibUcOB6fOpPc6U5B5owRmsnCoKPiw5vot6/WwXys+aYN27d69dJ21X8Xx861vfevjw4Y9/ky984Qtf+tKXvvWtb/3bf/tv96/6oz/6o5/xu/1iYmp88eEZ9DpMPfvud8tlyIGSrUZRAEl0tCpgpAZKoM2EPYQIinkhAGXGuOjQqSjeo8CUpaJlThSSwt6zmd0QQFsJ2sVGEYmiaVoMJECjB3UVtHc+xDQzV1i5AAAgAElEQVRD7HdrzStFiCbVVNKbHamZ6wtOwG3No9UfwwC2K2GsJYq2Q/EZi0/ldfHxp4p9UjXzy4eJbLpxeA4B91rgApCq811zSx13uFPExoGq6fxBWJ16LRQV1eaNa3kE6bXW7U2TZDUBltdqw9bL6OYUei1ea+sOCxEbtgBAse3NpNwSRa2Ao82/qro89Zq9Fl2sGFKl4PIxSFJaa44pWxKBqKSFpE7SYEOiBk76HkoIFKWqaUAD7QAJkSKioYsBAEErozsYwq0JiVisE/iwWauSetiIm3njjRp+PIFax5voZ1LhH5Mff7yHfnHxKbkuiLtV98etC+b8k4d19sX56AznHCBfACRa78IZHpuEdC2Bq1PTJ5g5BeYeSBAqE9zVBziggkVECigVH2zqaSerhHU/Sb2GGNaMoMwTtIIi0pkMcKcEGOZduLUeoe5GCaDCK1tZktMMQeHAbZ4EtQ5Qw3Squ7VLhkHdWxseKKFApCjYZFiB4nBzKKRxhYHCCbJycQIIR4e21ungUgOqgUINnrOkRBUreVJNURonOtO3zq7nLvpuM7fw3V8wchi8O0NomCtz71LBM/KHozEDHN52hHcGeP/vx42fNcH6wz/8wz/8wz/8MU/44he/+BPfhOSf/umf/tmf/dk3vvGNP/iDP/ibv/mbv/u7v/vWt771M363X0w0NP8nJhMAngyb4rXXuK3llX4FIEoARoMvQlha2U2nPpobVgweAidCUMAABjJTIj3CByDQXb0GUqmdhmp11zbmACgqEq2Ok1ebJpEgEqfNlQSoQgRKyN2TqSGvd5nKdnUFmZ4y1RXijo7q3e3VK906iCTRk9Dph6sC25axwKrZZzLB+oxcFy8kcR2HBcWPn9NueeP44E5R1cnN383mMqspsYjrE12sdmMRvyzD1n2s46gpSeq85jaHeh6tNM8RgbvXUndbr9lLafxFS7C8ZJCWh0n6WouNO6+VqjDzWhi7dht4hyFStaaecdpstBtyewVVUqb7RaUfJPUSIzVKTPvnmypDogZpAHDT29RKVdEqMe4PjNdS8rDLuB3zg9XCrx7V7S1DWLz2+Ym7mffcE6kKAh71M3hFtPh0Xhd7jwy8EPp7oVbHn3nR/rXzor5nrmZ+d8qifSoiEmijgZsmm0Bxj8pN9uvRqmGZEBXFsC3eBd5buQtQMUZ6WLDcwDNIMkCCaCc1WR1IoURKEO1a51rVbpLehiWoYhUCVcfckK1N5o0BDP1iDAG1UlseJRJC+zlCF7iCHSQ4B5qCka3NgutUDcIIziY/IKDT8jUdoFZwCHfp+rBe2ziUyyfS9V6L9ou9WxUIUg5pMEVCnB5tPXqPVyaf+nZPH9JwR29NuX2W1Dgwt4d0HHKtfdxhEqev8LG17fv4tNToffOb3/z+97//x3/8x6oqIn/5l3/59a9//Z/7S32kEHKh8bYMudYXz4yOd7ZXg5W9/ebVuBtq6TQEkXXoitk6xEa9Xedagld3DyiGEn0bWAPcKIG6EACWTRYCh40OwjRKPeewY+jFq+dtldtVWlvZ1rLV0Er5mkArSlhqWlE7hN6DWheQhLHJQCBxPk0FFIgeOG5zFIMJojCSJJ4XuWer//cHP+xU/s0rn//xB00ptQHZn8Za8k9R/LNcF3fTqhmXunvnrAHd8ymYVps2AzrcqruLWQOxvOS2r/da3XJTZVEHlaDLdbm9tjyWzU3ZuOfRhsHyCMJKtt3WW98xq3C3YetWUa1ubxqd500OP2y9VhuHut1QlRq8lrq5bY6PNo4AtUtu5ubadbpagaSqpG4CyTRI6rRfMQSoSoiyWEuIAKRbSNdTI1MSjRDRxYoaQJGUOJXpy8Qqamg1ZU0m7GbrmyevPHxz52QIEKEGt6nDu8bUqE8AbjY1TxDCoTH6DH7s9+h7LKQNwP7Pn/cp8WmLn+G6OKjOW58wzGczcdCjTic20FCZWUrViGCYmcydm1sIWFunZ/ozWEozgVMykMugV1avRtuVKmRzH81mQZiUu+pK/PDCALxxJv/rb/Q/usn/5e2Sgr9+Iq+eMJ6YPRUANyevnpQthseU5BgpHbWXMFBCydeiiRJjF9wLgdDdBwCKU3aL8zEEOEQQA3LFZvR1YnV/92arIp+7dyKxk34pXQ8CbpJiXHd9tqsLqKB3nJoSyLAzSRl2ayWQ1V2JnpqgBm+YgAEKxNl1qB1lUdhYytXF6e/8z8N7b13/1//iZovP/3r/xue9FK9FUn8AqJqpkLuk3t0pCqtuVVLvNVOVpION6uVhr94+as5vP4QSf4Gt7jEYTxxox497iX1aEiwR+au/+qs///M//8d//Mff+q3f6rrun/sb/RShpLkXt+j6AkSRWIZ4sdk92t280q8B3JbR4Z0GAJ0GAgR7Db0oiUAKPQqigIQGiNLV9zkQlTCwFyRDs5oKghpbZk6N4tWtaIqUUPIt4IRQo2ovoaP2kADAVSf4Cm2v0XSM80TCA28oM5qlhJL7zZlSjjVYby7OnozDo2H3UQ5ae5fPsBXWJxK/yOtizpOeuffO/yb8yp+7B3MSMG8rp8nukJbR55ZmLVWqu+14+Tie3v/21Rhk9blXX+98tHFwUYd7GdybwSBb2uF5dDMvxfPobnW38Tx6LV6Lm9mwq9uN11p327rdSQgQ2pi91inhq7Vud2G9tGEst5uw21EVBFUpKilJTDaONo5UkdhZTFpKFYG7rs8kD9Qg3cLaTpqkBoITnQEnhSFw7yAnSnW4a+q2m5vbt/57uv8qRMPqhM9Atk0rYtZSUrcykRWmTQXk+3rMaeLfb73vgId30qwD4/XZjJ/hujjIcOaqoTu86Z2j1tbZabojnnsC5xYbJJrdeaO/jlU8046VTT3bpEg+VuvUozYvDggYZELKguJyix9e2L96Xd5cx+8tyljRBVTHeuFPr5BGXC/D+mbN8Qk5TfuiCys3IFT7BviYm+iKFFBbO1qWndZa+oRZfBK19e70TiVQxlKbzqRhRaAwJqqGZVduR5GaghdDApu79AKBqDvWCAXN4Qn7Gq0pFAhHiYyIUyBdsJzdavfwc9uT727e+tHicy7dstYbrwUibubW6rHMS/FaGeLMrbT8eFbB40jsRkxo1gyCzWPz3OWw/8v3+deeEJ7y7/l9nzsrfpr4tCRYLU5PT3/v937vn/tb/NRB0NxHK4HyQhDrLC1uy/jvP3j3K6vVV0/u4+hyFXIR4sW4CyILDQImZaoczbUlWAoNrZVnu3whgVZBBRfiMBCT2p2EVYhKXdftE4pKWKo7YKSSgRpJhcYGT3mUveCLSkmcxF6t1FdmlhAQuk2bPYR5IrfnTjsV+bXlyb5B4Y8PJZX8sP5CL+M4PuZ18cy08vwsM+vTn1ljjh698zcO+dKBHNmLSfc41j4NcKtuFYgOZwiea5OTN6jG4Tbstj/67u/81u+//fTK3PPVUxu27Z2tFB930oAic8uD59HLCJGmc/c82LCznG23bUlYub3xal5LvrptjJvnRl9Au+DuXoZZrTVunt6AEJWwXkgKEqJ0iSFQRLpeuwVDsGHb2EmK+rhrsl8JibE9U5tShJRm1c0aWmNQUtydIaIWIyRGL7nuNtr1mnoAddhyMii2ts32WgGXBm6xTqZfvl+qjsexHf19duDHOe/Mw06PvADicn/xkvNLGB97vfC7fcpfKO9oJzPv/r1//jFBiOfSr1bXgVY5SDoQhZlse1QS21z7oH0MQSSJjJhArGK+7rgd/fENvnMxfOms+/K98PZ1jUIVnK/sae9hi03ibnG+2H0Ar6R6HRkWzD2wU67dCyWhDqRKXJEKiQwrUMSLAxRXmX5aEOSK6t5HTUGrWasLYYiSOomJqpISlSm5EENhqMhAcApYYBESW09oeIQQVEzV5U4IEDmr3IAQAEJipLBcPOre+GI4vQf8aBJrhuB+4M3ZnE5DAoFZSTw9Kq05VHPIaw7vDtDN90rKiRycwC2ZL5TjrHky2d9vXKaHfE68J9Xox2/2/OlKsH5JQ0WEvM7DtuQPq5t7c3n2vy9OP9jdfDDcFjMlTzH5cJ6lxZNhe1tyEm2Y0VmS61yDoA/YBXgHAL7mSMGt6VIYnTv34q700TxFzwGDyW1GqexPFfQ60qum2S1GlKF3DaAgBOsTlgoCiewonUhHBkpqDD6bc1Y789quJAl7ZSeS3QAo6UAQOSazA3VT60c5aL0G+SRI7pfxYXG8/rZZfo97HGaLu2DU/p7DW9whDPfz0NGa7pPcqJX8TFois5oHz9lqcffQLVofDAD7PagNO4aoMb33f/0fSpFX3lz99u/f7IZV3139t/9Xur7moVw+ZkiA1+sLAM21AWY2DnW3bUKrcn1VN1s3szGX7ViH6sVac49x62UEgNiNTTu7/e5IIkSPCwDwijzsRBCX6E6jF3Ng+fqZLnqGqH0nMUnX27hjSNIvdLGS1Eu/tHGYdO6720YOSuqoESIy7qRbUFQ0uEi9vZJuoWcPpmpKVXf3YQRADVZycxnSvm+LRx2HJi72Wh2giKhOC5T7TGbNNQOHevU9QbsfxqPBm2o7Z2LR3Y8ysKOR98N7fmbDgaYul6nBJTAVA7bHp+V1WlqPMyfD4fhMup7GdGNC/TG9ZKISCQYlACWjyrbUPqg7xupv3+xytS7o+SIJ+Wiz22a73xMoffB7KzxY4789Kt95XJaJSbGKsoz++pmVWn8AXT71i3UHfG3x5B+8f411i3Kj/UMbLyQsrGxIoQSrAyXJ4vWW1JT+fg7dGNl1RmCs2Iw4X/K0481YTlJ5sOyDiGlgTA2vDafn8vh9tyuSp69zd2FjZldojgS9hhvDxNpQDeg5Sd3b3KDAMnhSHytTcAAaPC7Fay031xCJ9x5KSrrsdbkuN5fx7H7TbkqIVIUGr0VSR1XPg6QOtXgtpDAkrxlt9ZkLlqVtOw50YTM74aTZMruTe/mcS01wHRr2TArcqQJH43DcrF22H+Nse5lgfTIRRbe17OxDwZtdzb3G1/qTp+Pm/3ny/mBXX1xtfvt8MiPuVDdjdsppDKNlAElhFUEgnMToFGqCF1qmBKCDDDSHO2HNqFR8nMsZ+zVraV10JjlVt7JWNCJii4CFIhAAAyVSItlaOQRCDo0yRSCt4P1AHoJOJQWsbuaevcbZ+K66xY8ISjkoz/pQv4xPLJ5Zb6c7P3yO8Gc6cLW34OEVx0/wg+Jq+vfuDZ+QLPNxqM3mrevQSO5JUSQUtWErXb/4/NfyxQf54tHVd76d7r9afTWJ081s2NHM3crmutmL1O0tzCxnG3eN0fNaLZeyGVoX6Lqrw82sZRLUwlKYxymnzJlmJL3btcQQQsTOLWPzKJMIPS0Xty249byQrtNavVbpezTLifa6khmChAR3hgAPRkHOcEcjATXUYdd+SFifAV43t+HkDO5eC0ivdbqYBLCKGNsmW1StNuRv3j5PkFODqFtOwHl05r31PmemH1aOOXmaBu0APz4z8kfuGx9vGfmli712cD5EJN0m4c7x0Wypwn6O4n5/cbyv5OHRhlhxRkkE3LtJu3un4u5BuC12NZbNWM76bt350y2DMIBCrCIvtgbi1bU82diTW6+Ok85+7SS+elKvtr5aenrfTPRi3S2eBpAeT5hvqElCT10I6JY1nbNuSYX20M5Bk1BUAXTRuwjM3c+CIIqYYyzV3N2ql0JR6Zezpw90ESEcr3cingQwGLBz0IWEw9WZ6QLSoaDBZWoQNDFtXTdxeqFTK7XuBu2XMPNSJKXpugBaDUoDn0gyRHDCvAFgX+dLgop26rvBhSJ7o8iZHTxq0uyHoWoU7t2N/QTDz6DXfqiP1rKXCdY/Y3QaYs21WlOvP/+EJKGaqci9bvml1cmjcVvsIJI8jf1VHgerZzHuqg1mS2V1T4rW5rO9pSg0sQa6gwHSC8QoUnOF0ElPAmJqqKsBNcAM0gjB2GBVW0Z0gkQYEMhOGBuFOAm8KKROs4YIVFwIlSbAAoBArjQEYXOcO5YK7mpZfYRuFe5e3XRqB/Iyfv4xpRPHK+4Mgx9SqLsvmGCRvTTlsO7s86s9yTit9+2Udp/Ml0krue42bhVyNqHxzYPNqnS911w3NxClBivj5X/+9xBNr7yx/OK/0MXaxl0edxh3DImUOuxg1bYbr9VKtmHwUuqwq7vBcrGxDFcFgFcfd8yZpVDViWZaLWiFGpXtu+oApQf1ZW9WOW4dRFpAI8tm9GpUkRD2+1oA7VJyM8ujdL2E6Km6GzVKjEJxq16ypM5EaBUi4sHdNXUALGe413GwkrXrvVaYOysRAHgpvr8W3NHAklZp6OYgzKF6BCLiUGl+WOrvkFrPngATzTE/dZ8T47B4/EpkV7hzynOP6U4Wrwd09wDnzStuQ62mg3ggs9B8Ykk6jJyytal95Ow1CkyGWFHLrvi22M1YhOxDUGFSaR931snjaJdbv3dPVPDo1t6/wvs3lqScL3h/7Re3dkP2o12cqHf3QKmhCxIAUpdgYFihDk1027I+l1RDX0IcozrhQBddBdbKw2epiE3pvFCVqZMy2u6WIrroqWqPL90RFF0wVhZj76xA9dlTwQ1oBhLIQJgTrGoE0C8sD2wCrAYbymJVN1c27CQEG3YAvBaGyBDbzt7NNPXT9qKWJjAAZ2qvtc1p80+zwjKffLpbWucG6B1O/EC4H+defiTY2p8dL54Wf9p4mWB9MtFrPE/YlJytvjDBEnJnRVxIfOX0wVcAALd5XMUEYB271/vVB8MGwGt9d1OKuXdqV2LDwrcZQWiGkpunlVhG3RocDPTOIbDBUd0RfHRkcybAYeB28mqfFFcEkkAJgiuRhTBQkmgvVEgihdpRAlURO3TRFwlKLJVJGIUAzlP63GL9ZNy2ZfbYQuvt7c1N+cl9Nqpbaw31mZCC/BLEtO0+5Fdtu/Z8Q8gDXoIZ5z+edPb4VCMHJ6ZwkjX4wYuh5CYD93Hw2rKQVhEhlkd3m9KUfimx0+U6fOErbrZ7/+262/g45CfvQ4QhSb+qN5fl5hJwz2PdbWwc67DzPOarG8vZxjJeD2Vnln3cYthKqWyG0dV5vRUAAtw66rwbnVqKNJFh4WKUSATxZbJxh82VaxhS791aLF9oH8OqD7kwbCSo7nZUlZjCySk1Sup0fSbdAq2e0UxSoqiNA7XCHf0yLNdlt6GIxFh3G8sjAMtjYxgBeK2kmFXPDnByT22LfYikWCltT+4VmNb6ls7Ohop3M+NDinAohrr7591T4Tjz/hWJicybMECYO4XmHmTKsKa+k9wbks4vJDGNjrTnu3vbZwJQMgNBpJqbWxBWOzQcjCLiXgXLoGY1m1/sxm3OfQxJpQsShasoV6Od9wRwm+2sk2VgChYF378ofeArK5ZX/O9fE7liKPjhm2+uN7YYRlm8KmWLsIBNbqL7r1z6B7TiojeLtOvAhefCUv2kR1QAiMI+aBRxx81uXC9XdXuj/cprYUjx3gOGUG6u/YOLbi1x4fVtpODVyEFGR3XpgAIEqMN7UIERDIAD5r6rPF/UxRn9wmOPsOy176ia7r9etzd1c5tvbsLlk/6NX/NaJSbtV3BI6uCmizVEYNXyCDNKE05G1Mp+CfiEIJgxqZtRIptUC3BzBrpVkehurV9co2GaWNndOP0rk6qd4mYSwgzrGsm5F+rHkQu/TLA+sUgSRv44+dF1Ht4vN72G09jP4lPsu81E0XVITYm1DrjMuWuap+AGkD5EijRUoMnPxauDsBHSCeg+mgFQuAraZC3wTg97KAIkOrai4Sa6okA6MgAA2yLY6O8IVQRFQ9GCYN8QfqEaRIpZEo1UOeIEP2L7G5+cS18CWD//eF7qDtwBQuYHDg/imSVYJhRnzquOn3IwbJjRK2C/gnkT+rKBWyRbU41WLmHmtXotdvnErYblOl88KjeXulhJv5y84N32G02GADPLo9diObfsqu6KjVN2VTLNMGbZFrbG5NkxNmYQPsINWIACGvyKVuAEzlyjMxizaRSPgkVvos6NJYH2wUstm43E6DE2Awi427BjMBAyDgbAqogwROmXVrLngbFrfT8YIszyzaXXqouVhARg0uDXIrGbDpdjNiMSwLwUqNKq0+ccSggDpQ3CQct+B3vaD/R+/J7HtPa417Ha/VeSq99juD5zgc+xfhPYscd6pwPWGvph8m2XGaM6zmsAn9jGNqLeYE13JKUQxX2oXs1LNXckEQCdSrbqjqi42Lm5nXXy6lIuB3NHdajgdIHlwm8MngnFVRBcJa0LQOilJVjT76PSxrE1anZUmZCaLnnTIHUBShSbvl4QahOPa5Cul2EzNTMIkRrCIgJet6XrTIMPWwnZzZh8SiMiMIIJiIQ0P9UmbCdWa7MMOMJCGDSenqIZ1zXiz8ytVeOCMTF1zdAOQOuS7QBsKpFpLvMHaJFzWfteOIej5s3zdMQ9by6cMat2HdH9Rbv8Nq4Tafjx42WC9YmFkGEuVXhhnMW+mD0dd68uJuH5xbDZ1rzS1IcYRfupsMiXGlYaqpfiWMfqgBLbqaMGykCrDtCrUL2qtxPZRUB3dQT3rU0tA1f7JlLNn31WWUVKJ815l0o3sPWMFohCA2JEDOgUnU4XSRBMFCI41OLAUtPeZ2GsRchlCB/lhKxuZbb/eRk/n/A7q6bvzfU+/AV3E6fj5cLnRiJ33qDNQbAJpZ8zLACzzbRDm3NgI1+mtmgUbap4msFtfPzO8P4Pw9kDG3f15tJLDg7pOobEMO0q6m4zddrZbWHm1eouW6lWzcr0mSW3WdTNOTgGwIECz0CFj7TR7Rpo/rc7rwYnWOgR7F3EJDq1KaMgNXtcwIZSdyWuUvtpVVWigay7oD1c1a1ymvpn46tx51YZO12sdLnW1I1XT8vVhVvVxWqqfpJAwmv1YMS8ZhvY8kiAZlPdkxWqwtEu4Ek8PWXD+/45PBquhsvMGdgBgNwvOdjnrEfJ1jP51a/ElelwoZj7C6esA2WEKR1pB8ncZQa2JpOFGYk/VrOp0Ko1YEQ4aZKaZ1MUaWbn2ayYi5m5R5Vi1getlh1YBObqT7cO2O++uvz7t28f3eDVExTDScfTpVWTHJFHpKVfQRZDW8p7rTunOpVWSuzVOhMZgjqREzwARFKkABIpsOVY2dzdg0oK6jVTQ3PWldRL6hkjVcNqCdKKLc+rFew26KMjIxojoUCTRPWCIC42cfEhuLr3J9zdOAXppNMUw8mJu+eLR3BjjJLilOVTKMoQm8ZgOidF6OrmlkeSEs4PSc/kR9qqCA1H1jANZcQks5s52nmcGk55yMzaFSTcv3b69DtT4seJlwnWJxkLjRfjdvUhjwr5xvL0DeBy3J6lhbmfd0sA1QxA0uDAm4v1bck7K59fLi/G8Z3dLhBn0a+zmftmxFjoa+TMmuEuDC6dS2Tbx9vOvMKr+0p83/p8b7TWDHrSJGaf2u9EUqmJuhQJ0MS0ZNcjRUT1VUJgc8hiElkFDZTi9nTcPegW592inYtjLT/cXN5Pyy+v741WtyUvwo/rCybkaPW2DOe6/ASP/8u4EzPLt/9jZgpbzBLpJrY6pgMd88piwNxj9a5kYW7ZZt5qcxpvAjbPaFIcRopo9FpAUIOE6G512AGgaFisyu11vnoazh7YdjO8+9bp//Cv+3/9dbjf/uAfh0fv1IvHbM3+AK/VdluAEkK+uvZSJWjZ5rKtefCaYZXDyLGyGAcHgAA8Rh3pBh8b64ap94BjKuRQEI5Cv0a9Ze1dTyAhS6neJ+cjcy+p99VDcDPqIklKrjL5xZvV3QYkRaXrW0/DenNVrp9qv3Kzze0lY5fuv6aLVb56Um8vAejyRFKnixVD9FJsHKYZX9XNkEFSYpLUTeigT4WZpMLcvTZt1qx7cz9wghPY0uR2fhj0owTiwPDu/zwCNf14UflMx5SnQoS1mFCwdxaYDh6VUsxEpGlnS7WmhqtufQy3Qw4qra1REKlmQppDhUOpSqrIWGwRdVdqVKnuxaoKA0WCRxHAd8VuxyyMyxiy2TZbH6RTJpWh+v1ezf2/flC+fF76yEXyrz3Qf3hUnm7xG6/j3UvbDPjgStzRr+09Xzx8MgJ4fL5e7qqYq9WiOsRFUVZFiWDyRe/LzlP0GNAHREEXuIycuFGHuYcQJUTpFrpY27CT1OliPZm3iTAo7HrzuPRL6wz1Sk8JnTP8FZCiuTOZ58qofnJSNSAsdHxk995g9+Asnp33b34R7pf/+e/C+jSe3bdxlBAgqouV1+LjIDF5ydL1Xgo1MCZJqQkMQFoeG5AMECJs5r1u0lRZaJeFU4PDpeF5nLvtNkMZ0cnQYeb+3E0gR1Oi7PVeMIN+zPKPlwnWJxkki3+ozr26t3tvy3iTx03N56l/2K33eXSnQcheg8OL2zrGs1oGy0sFITfFzOHuNR145AIaIAkUoTgcXt0rbZx3EIdcHwAolG7q3k6FBEIoiboQiZSA0E3NZ1U8CFop1iJwoTwNulCt7sVdgPtpifkTkoalxquy+0J3b/ERDpSQnegLTHpexicb8w5sVtlMPOAdzvA4DdtrcqZXeWtlBhzPL3tahTCbVqRZnDWt3lOxKd2rtzZmgMQEUrtFa70M1eY7Vbe3YbkO5d7unbcoKjGuv/DVdO/h9kffz5ePbNjW26umnfAytqm2jLcQalIbzarXwloaycbiyECTASrosNFthFX4HqsgUODta21R25c/R2oI27Whd2KEmaToIXnelLDQoOK1WCZFPA+1jKBI6khp072PgzV6ZbHSfml5RK11cy1zE+K62zCmtnh4q851ayaU067aUYedlaKpYwhokNW0Zljjotx9bynwvIbueNSfu5NHo/8cTukf/tLPVszFGs65QGfPlM5I7YT1+1EVmU9E06S4cncVnRkq7hGPhmapcnIWFXGvKmzwLpulgDMqzX1jvsmlDxqDiPF6LOYWFedd3BV762pjGUsAACAASURBVDp/4SS+fmL/8Z1BiD7gJOmX7+HRplaHw9+7xHrhpWAoTGu7GNN6W4ceOWg3IhUxIgeOzYQ1eJvYRbDqkI46pXGfb6LJ0SYf0pbZS78M8BqCXF/qYkGRAdehY1xge+mLzkEbx9Y/czofRaYLbb22kJp1u6XO03nPoF6rdIt4/srj//DvdHG5+tJX48mZdM0SZQERy2PoFkADwm3CwkWbmfthHN1EhDJrYI6gWW+DStDbj5vQrPa6eXAPr5pVpWgoGib8cnrVx8evXiZYn3hkq1fjrg/hJPbPPNRpGGtJGs7i4p3t9baWdy6fPOm3ry3WAM7TAsAypF3NAK7yIMAqBBlyJaJwGaamUWWuaqqVJMo0W8ymHdW9ggKvmClngJi4PTkkXDpnWmEpmtjgq7YxCIogEEEUrCNPggiRRNzRmmIGkbZv29a8jh2AKHo7/mR5ewt3LDSp8GV29YuIPRH0TEfb+TE/flKLRlztURLsb8xE475+Z869Gnx19FkOuFdrjgNeCgBR1cUSgNdSh53XEtan+erCHfHk3vZH37Vhq4vVeHJeh22+fiqpj/detTyMTz6YVgEzhkAVH8bWdc0NtWDMrMbqKA4HMjzDy4Tb+uDV4AavUyk+jsrFXCAdhcBIy+5LCJxeCSBGtzpN73Cv20F7mErdbqA6dU9TpQYbdm0zratTSb1bnbrrqNTddvbQ6ijibl6zjc2nHoBDQWpzLWkFU5bJlnLNJes+Cyn3OfPRckLslVZ7xdVdSftR7cI0OC9SXv1KQFiNkLW5ZrDltQ1/NXedtyNTMb/stVXOSSY3vUzJ+c/pjWVO2YJIdVehkOYeVatNdbVKwr1TyebVcLHLneppn7rITvNQahJZBO2DfPuDcbuwz52Ef3hv7CJSwFDtC6cpyvhoa1+4RxW73nmbqAluTvxKFALvfRuYR6GjKth5+w198lZX20X0EX1s7WWnNWFfLLHP6SnS0Fa3yjxK1weywLUPXbscxqzRrKBWD8EB1EIAXe8lIwRfnjZvYFjF8h7jyXIqXAR0fTZe3IYxNwBYVyezr2mYlJdshvKgiNcKM8ZO2mEUedZNdP/tW4LYer0/ywzaAbZv+z/S3WWu6Znmt6N0+2i2+5gXxcsE6xOOpcarPFyXodf4fBvjJOFq3J2m/qvxwVs3T7PZb549BGDul+PWHefdYqlpW0eHj1Y7DZtSN7Xuqj3ofKl+lvxx8KGiGi6EJSN0zDvUTDfogo0itCw48oBs0TZrkx1D82LA1H5HAjRQAkQRAk4XLkBUPOi4DCLAaQinMdyUchKiUpqZw27OrtCQ1I88NQ9WgkgnL0+/n28cfJKAfV6EAyk4ydDnqeSYM+Lk09AoP5GJqGpvMLuJtqlwcl7gbNNAtJ5iE70Iwn373g+Gp+/H9dni1c9JSOX2qm5v63YDAF7zk/fCyTlDvP3Hb0vql1/+LYYYzx5svvf/WR7C8jTdfzg+ed9rsZK9Fq82Xg6WzQrc4GA13hYWxwhcwwzI9EsfzeFoLGEtboOXBlglaqJE6lJCs5kb3AySCDpGgI41kQtlYBrcLedNTqedm0kuFAmpowbbbTVEt1pvLxk7xiQll5sLANov27Y7nCzC+gxmoEhMU0k5YDW3KvTmrNhEaY0WsTyKCETbk6flZI8UNgYEe6pryoAPdOFeW3I86Ed59jTYPDpJ2jmwPxM+s9HAJ8nVgtAdSrbGkCTMjGyWktyLp+cj2lZlj0HMvFMVkSGXqDJPsYwquVoKGoNut0Mfg7tX8yAcAXdfxuDuW6unXbjNVQXvbcZdsTfNvvrKWRAZn15/5d5ym8u7t/nhSn54XV9dyr/8vP79P9XvXuJ/+1o67+Kjbc7mxfDFe1qtPr6Bub9/iVXv2yU3O6o6F9NFmQQO9MkJqGDReR+RFH3E2YKryD6wkZIiNPchlxRUUif9Uktu2nPRiH4Vzx/U7QZk/1qu261Xg9zWbRlu7DSaRowbUDwkxJXcvG+rB+wfrK5/eJtOQtnV1ZtnFMk3t8svflmX67A69WJU1dU6Xz5hiE297matFyFJ6frmiWV5tDzArblkMUQJqZlDes3SLWC2l7RTp/JAHOi/yYZDml+oTnQnMG8a3agyVRpi4hPdnEqvRlXMb/jTxssV7hOO07Qw4LaMj3a3bzzv6k7EWRX+hfW979xcfv/mSRJ9fXF6GvurvGvPWYS0KXm0GinnKYWShaWtFCROkmtGMYy9D8KcQbIG1OI1sxl/SJzoADf3ioNEk5DAZmknockQoJEamlsWQkCj593RKzqV1qw0kLtq22pv9DGIBEo1szt5PTcfwaBhH/6s1dvL+HnFQTr1ogfvUkVHN6ZH9tDIoYXFfMe0433BW7clSgQidHc3z2PNI2qNZ/clhFYHJDF5LYwdxiFfPon3Htbt7fjeD+r29uRr/2P/4HXbbXbvfL9ub3R1mgCvNV9eUkQXHeXGrdkjsJGQMp3gKPBCr3ADBq8F1lghISNU57KhCjev1bxVeqyZ4mHPCwe2hQCiMg/u7urwal7MWBrm0YhOkLbbeC1KYQgSE0CGEE7uWRkJ2m7bqsG9ZCxW1FCHncQEwPLYjKoBwM1q8ZK91nbYKRPBATc/ghaOh2DOqGZ6xo/yq8N4Pqd2v8MVzgP2PKT1mYz5Vx8kCofc887/W067r/jGnHZV83YamXsUqebw2XqpeT00QYhwKG1bMuk1ogoyDVioEkgqBG5zfbwdP5/LqotnfXSHuZvjXq+bXB5t7fdfX7xzs/ne+/inq+G6r9n8t1/pvnsxmvv9JVW8Gh5doYueghsEDpG2D2IMXiqjohmuC5ECuoggIBCVURiUexyrVMvVOg3UBs2qpM6tEs4QJSXtekmxHZ26Gby6RtdIEDVbXFKjSJRuZekkwT10DMvg5tp3bqZdaodV+2WbXmwctF9KTO4uqau7LeDUMLVsB1qtMcy85ObeMjUDbbKqPXC1T4dJzMzgQQwx5cCz8/5Rr6Q9crffcuwhyYmd/Bn2HS8TrE84hDyNHYGLcdfAqmeesAhpf/sspu/dXD8axz96KK90q0ApVne1rGP3oF+Vre1qWYcY5g5MQmqxYkb4aHBgo74VisIizDjuYE2DNSdVewHzvgKJnAR8EkiAgthNZ1tKUEGfvFdUwyowyrRoNYCqV1nH1LoNbmrujpJ6d+9fpDx7PtxdyefhvZfxCcdevPxsHKaW6a8XvHSfPBmeyYP3U9WMV7U/Z0KRcHhzrCFJcQXcIOJ5LLfX45MP4slZq1aV1NWdUUNYnY0XH1B0+eu/QWB8/4ebfpkvn9Zhy5iQB+2XkjqQ27e+V4eRIpq0bGstcEOpzOWQPig4wot7AAuZ3XdWG4uulAi2k9ncDV7clKRP7T3oCJj6Eiih4ubNf87n42HIc/W4uw27Zhuf7r/a3CVsHLxkhhhOzuFuZSxP3tflSpcnVHWrkLY4m6h6M9BSY1BSiWqlgGAIU5V4A6YwGzUchm9PXR0NMo9Xi/0Dz1g57I/TYW15JkP+uHzIL0fsdVf4Mb/0DhGL/YneGEAzjyp1KpyguXEeDXNPquZN8DeXc7YaNTRW0d09CkXYqwAYqt3m+mQzpKAnKW1LiSp94Lb4g4VcDpbNf+N++P7D/J9+VF5Z11dX8rX7q9tsV0Ml/d6Sp4nfe9/MkQLOVzZmmiMIirkQUV3Vo06uV0IsIrrAqPPcfjgy+6MDUqhRYif9sh2JaTsUoi6WkoqNo/RR3WVb4zrWsWq07jS1hSYuKoPUsfT3urDsLRuEnms8O3N3L9ndqNRFD0BSJ92CJGMnpQBgjBJ7hgjAa/E8uFuj/+Y2oDyelxx+YGTaQ+RER+57QmO//s17Er8zDdJntnESbM1T2yzV+xgn28sE65OPIHqvW2aru5olc0+iHce2jEnDWUyBXAZtqPVKOgBq9mTY3O+Wry1OAPzg9iKKrEO6ysPO6lDtac6bUq+LXYqfJpSlP91hLDCjLeHOasgZtcINZoDPOkYAR3NKQ61UESNS8EWEOaLiLCEIHvbySgo7s2bNcB5T27Rf5iGQr/Xrk9g/c8p99eTBTzw4Yy03ZSB4nGi+jE8+7qydx/DEfnE9unFEHh2JtOYt4CxKOMhzppv7mejwSW39af1irc2VIo0aMzOvdbx4VLa32rbFGsL6dHz8HijdK2+MT96naHzl9fqD71z+p38Hcv0v/iXcbXs7Pn7PxkEXy5Pf/t3h3R/u3n9P+9AH0etxe2OkC1kxyduXkOi8JXZeA+SEqVcb3bLXwWuDXVuj8QV0JTFABIxga685ziUBW8MwyrL4al1EEDrCUXc5rHuvte52YqZd3xri1mFbri8g2r/562F9pqszr1WXJ63ksJVHhdUZQ7A8NosvN0q3mLIuRoBQka6fKFyrbpWkq007rKlNjjS6yo9kWPOoTZv46QccjGTnNOsAWWHelh/Oih+LdH5mwvfeCjj68c1Z9GDI7lNOa2ZRdcxFSRF6PTCt1Vyk2ZS1VoZu7iCEzLW29284VsM7u6DZfKx1GYMBUbgKmlRuc70cyj9d3rr7SZ8aY/DrZ8v/8KPLIPzN+/23P9itk/zu5+XtKxNiKE7gK+eL9zfD1Thus3eB/8tvyvef2OMbrHoEcXPs8tQJpxWiCHG+QmrCdkEfsU4866QPklSqefvPmydWM9G1CiCc3LOYIGK7W7cKMyvZdltq6B9yePxUUoB5HevqjVU8WVouVkqnEpZ9Hcaw7PPNhkpdLCV1/Wtv6HLNmMYP3omny/6118L6rF0Ckrpm405VCak1S5CY8s1FuXoKM7QmiZzat1EDAZ+GTCZO8ND++ZA8HfeEniR32Lcz4jyPzdPafBVQjiyyPmL/t+fiZYL184peY9032XguWnpxlvrXFyeX4+77t1fr2LVUbBFiODKNPY3dVR4q7F7qt7VspBh8odJrHa0M1YW412MoGKrvMhwIDhFOLUmsIbKw5oHKiXpu8lkVqGKVvA8gsStYBATBQnkeNQoJaXNHdXOgF70X+5PYndxF5tz9ugzr2Cl+womYzap7JPcOqy/j5xHz7MKjBRUvus/v3vD9LbIRU8AsYmi3jp4+52dtlvIDfAUR96npHsysFrhL7Dy61+JlNBEv2fMg3VJXJ+X6otYColw/8ZKH9384fvAuRFZf+51479WWr5TLx3V7g1LivQdwv3r8nTrWdj670wEFpFlewRVcuu5gO9QKV7CnJkpy3WNXbWJu4ncAGV7djdJDACjQC5bRVktroG/o6NUkBe2ag2hgjG61bm8nE9HUxbMH8fyhdAvpeu2X2i/z1RMbtro6IUIdNsoVVW0cKYIItEoloY2D5dFrnbquiLSkqiU+DiP1aBv9YVTegexwHNUaPv/40XD/qsaBCz6CcI6mpCPo35sGntJmLZUJ/JDJphIkzSYauuFaU5sKQCmNoQ4qxUzIPuiu1CjSR1UyVCORq29yXUQT4VCMxL1er0fLZvcWUg0Avnxfq+Gti3o55FcWXTZ7sCiPYdvs5728eYYU7MktgqCLiIoho9hkO2oON2jEIqEPEyGowihMQhE2hb7BS7ViJjHaqCQpQlGJibGTkr1WCZELYQjDOGjf6bIfHl3EZUrnJ1SVGOt2542SdHd3qnYnq7BcAc6YdH3GkMbH73T37zGmur3tXv9C3Vx7a1QiyhAZ01wCAs/Zzfas7jQkbcvRLpY9pr7fDcpRwnRnVP3Obcxbkz3CdfzQjFnuS0M+xkn2MsH6ecVC487yh9RRT/GwXwNYx+7t7c272+uHbmdpASAc5ctnadFrvMkDyUWIfcnFLIn1otn9Yqzb6kIkQW9QojqqAXCTQ6felmkBbZM8n1R05bShMUc1rBMWAeY4jbJQIRiF21qFjCKRci/1SVXIbHWsZRm69lbv7W4AvNCc4plQstcQqS+zq19s+HP/3n3kmbuO0KopQ2++l3P52Yzy+B4i86NXsTUzdqMGs9ooQoo2toWiU9PiWuv2tvkR2LgDyNgB1OVJONnmyye7H35n9dXfSa+8If2ynJyPj9/dvf19UsLJ2f/P3ps1SZIc6YF6mfkRR1519QGgMSBlThkKZTnztCL7wvf9ofsX9mV/wC5J4XCGAwzQF/qsqqzMyIjww0xV98HcIyOrqhvVJ0B0qlTl4emRGRHuZvaZ6qffJ6tWn20sW6zd1HygioEM0XAHNqCz4wJYEEe3AUoiFybtq6k+Bgae3R1NgAKwIAZABggAEaERq6IDQE4YW0cmd6DIQESxIhFPyRCLNGI4e8jtUlZnyIJUtuCN5ZS31+nqGbLwcl26vqlqDEcAIIlFfBWRNQ2WRnD37MhMFOd3f1YvMztIhpcM152yxWsQlx8vJl+NyV5/B/z5xvQmHDGvbvcKt6zQOSVYlmmfMhqzczOhqhGiA+jk5QwZpibBshthKo2K0xcFyozqlXBg6rPWQo3woGrujKjufdZs1sbg4LtRL5rAmNXgrOI+ezJ/bx13yf7tuf6XL3Z//9AR4EEjkZQQ1KEReLQkQusTCENsYTdAPwIglGpgtrI0QBtRCKQgeYTiJ4tHxTD3oppbiFCMEihUFGswcwBOI4AXS5lwsvasSW5k0XDTUIyWxrzvSMRyRmFpW6piWK9RmEJECbJY2dh1H/0mPngsyzWYlfwumLkrhYntXqYFHXufqL04+SgUmDX/K+Zx80Wb1rZje9xbfHUHPOPxTY/HCOsIcR0Ofmu68D3A+qEiMA+W5WtTi9lUZirS73Y3n3b7R3W9lBiJD2rvfU61hGoSeYcxZEbc5TSYtsJjY/usT8cxmY8GNVsyMAAzUHdzSAen2hnr0SQcCgDgAIJwEqdE6V59yHAS8UEMZT6+znkl/FbdZLdIjIjJtCbJpotQAcDzfrfLowOcxTcRwILRFAEMf1Jz+h8lXsFSd3JVt74fZV2ZYdJts9kMp+YN4tQxcTBsns+aPjgUfVFTcHcz14wsbuY5I0lYLdzUxoHckRk5cFwWsQbd35SG8HS9RURql4u/+Fv6m3/gdlnQyfj8c4pR+z3Fqn7r5/2nH+p+u3jvvfrRbry8hA+eExvvLW0YARqCJ8Z7hx3YFkwnWdFSBkBGKGSsCCSAPK0oB8YZzgbLMDiMSpItBG9P3DLsnuXTXy7CakEx6n43Xl5yU1cPHto4EEC6/FJ3m7x5QSHKyXn18B1LQ3rxFBBXf/sPNg6eRht77ba0i+HsISK6qc/7HlmsPNeWBu32twLTc6t5KX8UFQzEkoUuaRGb8lHTinF4NYeFsjBL7hYHXzWEvlM6/AnFzMaZAAZRMQNAPlwCQJyLp0yoZlGYEMesUVjNTIsKgyOAEGZHdSckITd3IWKCIWsdBABEKTKrWRO4EjKHLmVGXEW+7NNQdsbuTWA1L3UMc8jm12MCgEqICR8s8dfPtJX+7WV42Mbz2rP5upIv98OH1+Nby4AIm8E2g68q342+H4AJKgEp/U+ITFCaBwNhIKqYAiEgZLNshSTmxEISPVYYIpoRgKzPVELZKYGbpVQ9oXT1fLx8vvjFzzAEJLJhyNsd1xU3tXadLJfILCzcLmS5rt9+j2I9fPmJ7q7T5qp68ITqlpuF58RVQ83CU6Kq5naFSCiBYz1cfmFjb2kAAFmdIDGyoMQyvUwyG0zgflsBPPyDCR2XyzgPg9srO+86Xgeevqft/z3A+gGDEL+mSngId382DhVRJBrM1ojJ7cWwP6taAOCjciEiVCznVVvzuM/pOg0IiIIGns2z+4J1NB/NO4Xsng1Qp0q8zJbpddG4Aix6ocUYa1BPBoRwWuPjSpKbOjDCeQiP6joSqdPjZtlwgClTNU3H6mbgj+pl+2acql0eA3H7rYwz7+PbxFetm/jSj19Na92VTpoPHJF0XkJvxaDt2LuePI+AMOlwap4arYmpqsPyRIcOAMAywNQn52koKCTvt/D8s+7DX4+XTwE8PnjCzVKWJ4DITatdmzdXgCirVX2+A+gtWxWMkJKBOTYOCORFUBR9657Bil0JF6RVFk4AmxqFMCCKYwQqSawKYVVrrJwIrp6SGbQL4zqAuw1D2uy4qbhd5O0NAJaiBtUt1y3FGkN0N9vdaLdDonxzzXVDzcKG3ktXrhuGiWsFRO6m/d5zspyAeWK2TXsgA5gkfw5eQxP96jiDdXsZXq4hTtjxTgLrddmsr8lw/WTikMeYMS4e1t/j1Fb5R4Ba7nLCUvujW5HSqbDIhGpOCEKU1YQIwEf3UiUcVRGxEspWNsO2T7qq4iKIGeTJ4QN5fhbmsE+WFH52SucN99mWEcx9l/JfPVyvotyMOqqvAkfCyLZPTlPFEoggMjIBI0SCQBCoCLiX9HOpcpT6oJs7+ZyVRkYJAEgSTKSoVXlOgPu8uXTNslyG9amNg5tp33HThPV6ePoUWWSxcjeuapRAVRPOH1PV3PzL/+c5hZMzqupDeyCK0IF24l48spAFVG3sPY2AhBLAAYiRyFNRT5h3RrdkqTtl3uMrB8cQa2JK4A99z98DrB8qzD2bZdfaAn8FnpCJl4f/eP54GapAvEn9qPnLfo8VnAEAwKvddq1ERiLE7BZMg5m6DWhkHiICgDlssw5mg8Fu0n8HIWBEQqhoKk2rF6ovdOqE2Ao8rPgkSCR6NoyCGJnfbdtAfJPGd9v1WWyKBaGaqVstBAC7nBjxDdHV3D9I9y2EP0a8HlodL6T+mjP9KJ+BeMia3PYVwvy5nFL0RUtZcBbEmmTHAQCcOBRmt6u6OQUqc3lYLGWxdD3vn31uQ+850fpU9zsduqKhlTaXN//6T3m3BQBE4neXrjm9eMrtsl2fdR/9m+53SFQ/OudmK/U2J03JUkLtMTsQQACMgOSwAO7RetceJjv2EQwB0LHksQRw5VwDRoCIIAiR3R12eypyvstW21P0bDn1rkpB4tkJxahdV11cyOkFxaqwdHl1QrEGQO13yMzN0vodMkvdSqwBwE09Z4hAVQ0AxQAk31wBIBBx1QCAH9rOAYEmq8cpoTXnJmcm+2u4RK98P1Oy/mCR8KcBsw4dIIcPcISKigJWkWZ46c04wBGcuxARp2whzcJZ88c5pwhehANHdyFM6gjIRNmymldM5qCW3SGbb4b0cFE3QRxgO2ZGZERmPK24YgTwivHxgh610ghf9umjTZ/MG6E2yJj1rJLNqIGQkALRKpoQjGruE7FdCGViLiEhtEKVUCA0d3UvzY+z2hoAUpFpAEJHUhaSiM2BL5gBUFYnXLeekw6dp5HrWpYnBcTE8wtZn1jfUbOYNEvbFcU6XV1y03C75HYFRIXhjiDgxou15+xuxfzA0jhleQsVDAlwlrYCR+JJbA/x2NJ8uiA4C4ce867mnx0l+F9bFgRw+EN04jeKe4D1Q8XUWmLwaXddc2g4vLadsMRFPRkYnsbmtzfPB9MnzRrm+uCr51csCJDNk6uaBaJ9zjc5bXMWxIooRhzNR7MFozkYeEkOl3tIp9m59CPBQjAS1YSnMTDioEaIDfNpiDXLNiVzP41Nr2mbxnWsD6V6AOg1FyX6N3pPANaxJrgHWH+smKcVP5pkyvd+dI7f8nvnJDqCaZmf3O88eFJnwMnPCwrSKj8xAyIMAQ8apOB5e120BPP5Q5CoDly3NvQ6dABueQQ3IJbFWlZn9vc73d+4e/XwHUAcvvh4fPZF/fYvwmIdTi9QRPc7zxlFKIS0e9ZvDTsMI6qjOih4YbivgVbOGXgHpuCKoOAAQADBSRwDwAliQGCEQM7kTJAUi0ngeq3tCYaFpF0xUqT68Sk3jfV9WK8nOYbiQp0Tt0vnoPubfP2cmiXVLVWNpSFvLrldkwgye86eM4Q4LQMOrgp0REw8NJATFsqau08rzXFypZx5S8Q6CAPA3WzW/O0ria3X3h0/rcA7L9kPDYZ38WtJAhYnnGKzc1cFEF5CYwRoExgDpilXGpiSghCa+ZgVAKKwufcZicDcr4d02Q2N8CIGIcpmaq7uD9o4ZLsecmB8ZxUeNkEdsvkHV/m8oV+dNi+64cOrnTk8WUQHGNWS+gIpEO7GNKgzQhsoEAihmpv7oECINXMUEqKSgQMAdzc3ZCER8IpyhiJ8z4whAqLvd6V/RZbrkrsdn30O5gAQLx6hxPHyy+rBw/jgkatiMdZkKV0g4GZprB49CesLd+VmUazfAclzplBB1bhmIAKzvL8BL5pYYboQk43PPArMgPhWQwVmu4OZ3/7Klb4TfjuKZkx250dHn79t3AOsHyqYaElVKzH3ts/pxdA9qBcrqQK/jC0uhz0jFnr7x7urs1j/YnFW7vVagpol14rkJZ5dZHk0I5tBUzLrNH2yvxlMs/lgSuiEWLJWhFgRIUAy36shIBOEYvpMGAkjUUCqmdWNmNchrEJYSdzltArxNNab1CPAg3pRnoYAAcDn+426n1dvZNicTQfNFQfG73TL3se3iteQse4o7N1ZcecdbKkcIMHBYgJmDYBD6Xte0WehGoJDKguAq8ZNte9s6BFxUjAfunT9fP/+P1PdhpOL5b/7u/btn+s4dJ99DA7x/PHw9NPx2WcAEB++7Zqt74bPP0Lm6snPV3/zD/1nH/SfvA/uXLdUNW6GQ0exOl8u83Y7vriR3w37HfUJl0bZYHDYQmFiYQ2k4HaEJwUgAIbC03IwgGxgjmoQxYVNxEMFln3cZGlIGgmrBtzzzY2sVvHisWtGxHD20HNyzfHiCbL0n74PLFw36eqZjX04OZ/JXQiI3C48Z+33XNVmjkSyOi2SWu5GHJF5Lt74pK9Y9iQzvJ3iFpDdvXpzfuV2BfnKWiEcPfInFHgkYjEdmeHFJI57aHM+aJVYKfmZEzLikLMwIWA2m7oIEZkoqzIRMY6qCChMZj6qOkBgHtUYcDdmRDytQ1LPZpXQwyZ2WffJPrvpCOG0jo+Xzc9OFubw5bbL5pEpmX2+Swjw1w9WmyEhBj4D2QAAIABJREFU4L8/D++s6lUl2yEFwmI/Fpgumrgd86gmhP/+HK0YsYPn0v/koO7ZoMsamYRQBIWQJ7o7IiCJEC+8LpLw5nlECagK4CiB65YkwgIBwdPIVQ3LNVUVSsybF9wuwvqsdNfK6tT6PYW4/Ov/ZOOw+81/i2cX1eOf8eoULLsZssjyBNypbi2NslxjswB3IPY06NCBKRIWkTkocgyESDLnZL1sQorbwa0iwzTUcO5TOKohHi443O3mKcesjBCbqZvf6Ta7B1g/bBDi42bVa3oxdM+H/eWwPwn1w7spn2OA8rPF6aD5w92LgPSkWQfiknxKpvGre/QqDoxq7usQR7Nkml3UTd3HI711c0huMre3RCQhDEg1UyBiJARwIEaMxC2LILUSFhLdQd0WEh3AzErF88Wwfzrsz6s34rYDQNnDqZvcO+T8qPG1taPpwPF3E8vndhPofndZPrJGhTvL+cQwtTn7hVgYSzYOFAISA7GlEYceTD2P1kMy2//+d2F1xnXNTQtuOnRIBMzW7W23AQAfB1mfhvMn3K76T9+3cQinF+Pl03xzhcSyOlFm7faYE1UxnCxO38nNJncbvN4QI7KhGyqAAvTgA9iArqVa7chAOr8sAmCHSBjAiSAGD5WHyjmim4M5RZK24qZCYm5qWZ1qtyu7c0AsXYTcrvrPPxy+/CQ+fJvqBTWlzTBy3cJMqUckkDAXONw1exo9J4fil20APGGAGWZNlwAPesHlLS9K7vgaaHXIY90STfwWX73+prib2Pxzjlt75sMG4zUr6VG2cD4V1Y0cEUHNAyOAFz3P8q7RZB+MhGDugihEvebSKjilXdwJsQ1SCY+aCgHrpAqRqWJV95vR1EcEWNdxGcNpHXdjHlQftdU+6S4ZAlRMZzV/vkvvX3XnjfzjOxd1N1z1aSrMA6xi6FVtyK04U9lp46g2qu2SEWIgD1RMmiEyBSYhcgdzVzMHJCIEQuYycpGkkCkxRCBEFtdcNFmoWaCEosPO7ZKq2voOJXC7gsIMWZ5QrPfv/3P3+9/Vb79HVWP9rnr8Mxt7GwcK0XJCIkDwnCjWh/y3DZ3nVIjtRXf0NrkOk8befH3upKDgqFEQAW5t3o9Pe+1WH+98+o45rPul7seImsN5VUZaym7F8vm1Z5r7x7urXU7/4fwtALhJ/SrUb1JQE+J15Ow2aB5NAQrjCpPZaJrdSol9NOs0l+k34KyrB+AOyW0p0nCIxAZeRBdrEgAYLZ/EpiJxcJr5ZJ9125NQvdOevMk7UBhpDsDfVrHtPr55vMnc8JoFtVBHEO52FB79psmXEMkPPRxeyo5zoXCqNoDlZHkEcIoVILlmHwcAoLoVABu6vL3W3/0PbpayOqke/4yq2k2pWcRYW9tZGmV5yu0SwMfnX+x+81+7j35XPXqLlye6vda+oxjDYlXUelLOpAaV149O4klquoE/GnZb2g+EhgjAABWgADfuBMg+sSwQgAAOY4wAhCEGaxYmFSBB6hwAQgXSRm4qCoGqiuoWzNyMYlU6LmV1Vr31i7y5HL/8BNy4WXgeqWqQWPdbcKeqdkSUAIgkMjUQIpmOOvalGgKAbgbF/ce9qBD5Eaj1Qp+ZV407tYzX86xeOvYmd8WfOcbC2/Tt9O28lTjc8IeKE5aC4KGAMNtBgt0ZHRPdooBZnuuFRTTL3AFQeEJh6t6EUg7GbF648KsYhDEwXve5/KqrPpUMZmBqowSlbLYITIhD1kENEffZH7f8F6eLpPZsNzjAz08Wz/fDdZ8eLepKqDzJQFgyW2qWzZlyMneHwBPwisKRiYnULGUNTObmjlyYT0TIQiECgrNwTqUl1oYeCCk2WDZORG6OTQsAlkaplhgimHG7rB6923/6u91v/4f1+/jwLSS2fo8cuAkAgBymvFOoXLNrplDZ0HnOPg6AgBKQBSUAgqsiYJHqLboMOPX+zoDpgJDwQLo6LgS+cjO8NDjuHPyumd17gPUjRcXykJcAYO4vhj2k4TQ2PDXiehGs+6K/Mfdfrs4PKGQVXnba+fo4JMPMfbQ8ar5JIxI0KIioZjY1dHtJSpXuVUYKREup1rFWs10eR8uFR19+2yI2RSfi0Pz9ebc5iW+KrgBgl4bsVrHIff/gjxp3aTW3y8er9imHHwFM8xKWTSQAgNltGsQmzwoAd9MZiTkQgpmbAyJJcM2m2VW5qlHiNCPnkaqKmgWYar/3NAKAa7Y0es79px+4ZhuHyYbMPd9cpaunSFJ0CKtH7178H//n+PyL/vf/FtZnGKL1+3xzBbHidgkO2u106FHEGw3rZXWedBh1P+y+6IcdDD2NuVTM3QHMEBFE3B1UMSsQApOX7QwipBFNPdRw9qulLFsqvm7MyCyLZfHvlOV6QkISPKfhi4+Hzz+kuq3f/iU1LTggyyTOTsRV41AcFS+pqrleWBpsHDxnBMQQps5zcE8JDqUNAECamgpva38FbM0rygQIbuVFvyJp6fM19iP5htfdKn/uMedBJjZ7qYDP/jYOhW6FToRmLkWFc95GBKY+ZQBgwmygbuBUizh4Ug3MQWhIykQ8QWEozT0OHpgQYFnFIeebIQWiQDQb70AgemtVJ7V90j7rdsz7lFcxPFw2j5bhX59eEeLDNm7H/PFNnwz+8y/OHq1aM//18+uLtlrX8aYfhTAQZrNFlLM6njfo7l1WMxfiCuCsiQDgAEVdgglzIcKjx5qZiYnMXJjcFABIQqFGYRbPyTWpZkAMZw+pbgApby7ZzN2oaq3f2dDH88cAjsTh4klYn6OEp//3/wUAy7/6j7rfcrsMF090fxPOH4XTB9ptAQFMZbFy1bJzy7tN3l4DEVUN1y0SFW/TMm6xqsFhsm0GRD7Wap+acCeJrCK9QXQ8DHCS2ybw2fV5vi+mZGXJDH/ndMA9wPqxgxAXIR5zqmjuPXnSrPd5LOjqdzfPWw5PXrWLfuO/UnNgIHVXN3PPbkJUPD3N3cEDRUEqWhIEiAgvhn0yM7fS0ggAnSbBVznpnt3ear7Bc2MiARK857b/KcRcPILD51f5oJO+6C1j/VCrKhIBREWf/ZgGNKk0EIK7q4IpxaKlCZpTmawBCUw9JyTGugGA8dnnlgaKFQB6ToCA80YWES0ls15OLmSx4sVadzcAIOvzdPklagYWWZ66ZRsHqhsUobrR3Y2No6WEqhQEl7gAqPYpddZdW86oimYg4kxOBObA5HUNAOAGasjkofLFBUkbwrIO65W72TACEQXhpsUYEQlFABGJC40XAKzb2TgU5ISx4rot9SJHt7EfrzOFipuFLNZlBtduX4ojyOxmABkQEblYBxdCG7gD2ORf67O53S2T5Ojj18TLeaufHOnqjcKnEvecCkGcpUQPNVhCIKK55IcAE5edmcaUk9kqSJlUeZJ0cEIsBQQhioylY6GoITQi6haYhqxFzYEQM4C7r6swqI7qUSgwlQJfYFwEIcK4H/dZzeGqG677sRb+2dlqEcN/3T4lxDqUgiTWQQqr3QGymgGYeWQ6iHzQ3PtIs3qUuWc1CECIplp8acrbg8QQqCiOUqiAqYxZZMHIgKT7LSBhrKBklesFt0tqFqWaH04vuF0WQ0NEckRwQxEkApByb5fWWt1vXXVqHmSBYo9zeA44C6PeYqPDMDgqds8L60t9ObePeOmY32a87v7Mp93ON497gPVHiPgKY/0QXU6jZkJKZntIx9Nil0dCehO19EME5hVWo2k2s9kQPpkWzNRKRIDR8iZlc0eFQNyIVCSlgjloRoBIL6uud5oc/BvlomoOPxFyx59ifD215vAjnP2b5wfNXx2yWrfoCiat9tmBGCevgLL9My1wCpEFzCyPrgkckHgSxCrKmTl5ToDIVUNVcwArlpP1e0QM63Mb+rzbeBo853xzlTeXKKFM3J5z8SXwNPNURThEZLGht3FQ6ShlyxkAKQo3CWnMvefR0zivGQiBnAQQwBzAoa091Mi1UCAk0j5p99zNgbB5ciHLlSxWU90hRFmdct1SVfPyFNzSi6dF2L0QsybOSjFNO+yGyyri5ubIQqWoOo10nHbqc8kDj2sft21rdrt+3F7g44sNd7DvHQ48vEzGOv7JTykO+cGjQy+dML1DM/+93O9F0h2KvUwpIyICAZSmvyis5qpOhTMOt1pTQZjMutHNnRAiszBaLmABZK4ZIGJgWkbZbvM2ZUYy96QWmLC0JQmtIu+SbsdSY4QyR9dBItM+KYAvglSBK2Y1N1chEqICngJzGfSBaYaJt9sss2KqWGAXQ9ENdiMJh2EL7kajp6Hks2V5ghLcTPc3KEJUuTtJKIZR4JYuv+DFKpw/osLZdXdTFPGci2QoVaEMFgBwMxv6kgCb3g4i4jBhLOZZrwTmYTJfuduS+Qwgb+lWr2HZvTwp3tYSXz3xW8Y9wPqxI5t9DTQpeg2j5r88eQgAm7G/Gruzqmk4VsUb8BuGEMtR/ulIXweymboF4sezavxx7NKg7qW38Xiu/nh3xYg/X5y94RNw95s0OHjD4Wt4+vfxg4Tf+fJoQvE7R+ev76Q5/MD6metP5gCAzAjos6MzIllOhY2EUgRF1XNGZpKgafRxMM0Uqsn7Yr8FRArBjUGCm8pyDUiWRuv3SIwcpG5hsZqMdExRQrr8wjW7abp6TiFWj9+t3vqF7rb55rL/7CPXzHVbv/VzS6N1eyXiunEz3d2U4qM2vefsqvFstDHZmPN2KLREAHAFy2DmxEgBpWaAyYeRIktbVw8uuG55seTFytOofYcisj7jZlnsaaleUKjGyy/cbPnX/8nzqN1edxuqF7JYU1V7TgihkMnA3cZ+6jwnBEMwoKoqRrau2XIuhUgwdZy026cyxzGZ1wFwFhOYCoazr85rJ4q7VxdgftztpzcjaP1ZxIFSVT4iQjEThGnLgOZTbyAcQTFCEGIHJwQm9sknBwujOqkxIhNthz6bNVGYCAHMgBGFqBLe9Hmf9KSpKuHIuh3SoMqEbZAu5Wy+rIKQmvt2zNlsFYQJL3d9E+RhW7/ohkFtWYVfnCyeLOtR7aof2yDnbfVPn1/uk/79kzMh6nIuiIoJmXxUdfdFDACQzYrOlppVIqX6KXxLCCkljpSzEIIpuFOMFKPnbGOv/R5MUQKH6FqDO1UNV412u7S55HoRzh6Bu+42FGtZn9nQ73/93/Lmsnr0DsWi0o7uLovV+OxzD0qxzn03bUgkIIsNnXZbHTow43aFIaIENyXion1VqF1Fpgu05MUn1ttk+VwQ2KGpEKngYMBDmwhMe4wDpJ1fvIMj0Msj4Vulr+AeYP348SYs7wMQaSWUoiHf3hbfKY5/iRB9lZjaNg0IsJqFu447kTpNj+s3Fb4CgGSqbg2He+2rHzv85a/95aPHcXeL5z7v7n2aa2aCNcKse8mCRD5ZJ5eJi9wVAKbEPk3TH7FQiO5uabQ0IHHpnUYJaJZ3GzdFpPjgrbL5jKcXQOQp5d2N9ntuFkik+xvdb7lZgLvubnb/9t+5bgEARUgCtwterHEcAMDG3s2QkOoGWXTsYRgACQWFyJsaAfzCXNWz5n2vQ/asDoCESEjMQEjC8eKUm5brhpuW6qboddnQg6msH3HTgjvFipcn3CzGZ5/pdsOLFVe1VzXFxtIAbnl3LeDI4qaAQKEus7+l0cauaKWW3T/kDDRJKc6yinPPoDsUv2HHl0uEXwOJ7so0vHryTzyj/JKOFcBMwDpKbRUFy8OZ5eJMDB9Ed6BJDH06gwjVTK14QlMxGQQsAAvdfczq4JWIug1ZkxkCROYi9enuhZZeCecxF9BTZKv6rIELYMJKuBJuTHZjAoBaGAG7rDdjNndmWlIkhJsh7VN6sGhWdSx/wsCFKAoDgBpFKXz6kjy7XRsQITATYlYFmrCXqgIAsvDcBV/GMsbKup12W89JTi6QWbsd1S23S16s9x/8i+5vwskFStBuR81CFmsiplgDURn4GKupCIgIZpYGN0UAJ5pdnwt5ADEE14TFP7vg2uMs74yy5tv+qNwHrxsmd4YDvjw23rD4/rVxD7D+CHE57AIxAmZTnZQLeCnx1QSPEJ9VbVEx+dGe3qgaiQ9P5qAHM2q+GrvTUJe0VqFzfv2vcndCaji8Vi71Pn7A8Nd+97qjr1tm55IbHtJaB8ucgtLcnZjA3XOe64Z8eCRKQGZw88Kx4ACIPvaeBgoVSgBwLcqcRaD8AOZIACfMBKHiqs5Dx02LoUziOwDX/Xa8/IJDRVVjqY/nj5HYNY1PPy2bXaob6zvXVHhRBC4Lm0gbCMUy2XMuiupUbT1nnxwSGZlK4x4G4WZBIsATxcrGIe+3CMDtSlalvQPD6QPkoN1u+OL3KIGaxfDl76lZcrPkZumWre9clWKNggWSAkDRZbA0Tpx0U0sjuQEHFEG+LRECHhgwx3ILjpP7IN7d/ryKtr4+JXWbwLotF/4UYddRXrCkcABgtiCkI03RQmI19wI6DPygSgozm7agq5ITQpxsoWXq0fOS5RKmlGw+k+sgN8OY1ITIzNU8EJXWv051yCqMySxbkTDESrgWLnIoQkQIDn5Wx4rpqhuY6LSp+qxZNakBABNFAQdParND4vS0bW6KLBdemHDqKxRLI5RE9ZQHQuRASD45XykhltySDp2bUdVwu7C+RyRenaIET0O+fk5VEy7e8rGf32hwzZaTLE88J3fjuvU8IpKNA5ja0AMgsCAA8uSZ4zmV3U9BuUB2u12caenlKsLtZTy6vnP57xZGHuGnAyp7Jfw7CrrfA6wfOxDhNLb7PGa3TRqyWzJrWAbNAFBsZGoOB65VNqtYAGFULflnAHCHwVLNPwhqiXdhEyL2mm7G4SQ2j46KiX8QXQHALo84OwLdxx8rvm7FvN2eT/yqIx0sKBvKg8gSIrn7gac1uVi4Tw6sRHm/dbMCYgqCmZSac9J+D0i8WCOSDp31XbHeszSCqZtqt+s/+R2yuFveXNo4gikgcLPkxVqWp8gM4Hm38TRSiP2n71Oo6nf/on7vr60vVHG2sc+bF9btMETXDKbcLMLJRflbhTjvqsUVEdyAKJ6dIUt54UVTcUKHRDNV3wwJhh4lVA8eY6go1m7KzVKW6/7T9/PNlZuFkwtuFhgiN0uMNbiRBKpWePYo31zZOFCsdHfjVUMxIjPGSJbNfTIkCQGJS8l18iKcnlKeKoOH4uBE7Dm6hK/Zmh9RAe7cCPhViOu4SPhTiilx+xKLDaayoE+6m3N3YZl+1az02U3vqBfzGRCmpKbuTRQ1z2oAYGZtlKJGqG5MtIjUpzzmTIRNkKLYkM3aIG0UQozmCLAZxnUlC+Nn3bCKUhQfeNZb343JHWrhZRVKme+krr7c7s0hm315s4/CZ4vmHGA3JEA9aarTtu7G1I15PyYmrEQCU+FwFea+EEZhJhJmAKAQgMhKe4oZSmBiN9Whd1MkQhHrO9fM7VIWawxRdxtZruns4fa3/wSWAUnW57I647rVoRMiqhqKVd5urNvxcg3mFGsUsaFDFh/2ebvxcZh8S0PkqkEJ7kY+MRCmXYpP+V2f6uZ4pwJ4GC9wR6zh9uDL2a3b++EuPPuueY17gPVHCEIstjmn8Y5Kp7mbW0Fah1iECADZ7PmwO401OXU5MeLiq413vt9w98th//YbKzIcx2hZkJt7gPVHCn/tl19xBsCUp7q7xStnHdSs59UHwc3A7EACdrdJ9NlndmnZ3BcVBlMUAgDt9zZ0rpnrBmhZpksburzfjs8+s36v/U53m7J7pqqxsbecSpMgAHjOZaLnxUoWa1meDJ9/pP2eJABR3rzQ3YaahTStNwtLw9QLKcIS3NT6vRM5sxNDBchMIbqq5dFTQsTpiDuYWRqBmSRgCCSR2wXGmiQAAFWNrM/ALW83VDW8WMn6vGyvqW5L+WPqNwtR1mcUYsF/FCIA5t1NEaQABApCoaIQSooAmcv7PHVLuR/6pxx8aum8i7C+BjO9HmN99cGfFLrCI7e6l3900Hk/WoVLR0eRyCi5XUYqyImJzB3nPAghGWhxaxYiJhotl8FVekKyGRMFxj71AMCEjYixz/VHKOJYkZkQxr0FokpYCNUdAfZjTqaBSM3bGCoJJTO7rmKX8geXN13W//2Xb7n7dhibKIsqLqpg7oEZIl73gxpGLnjRzIGZyu695N3c3Qp0LNAKAFgOfk0H7QZLCWNF1EwD0IHbpSxP0tVz3V7x8pSr2jQjM0pgZh9HACiNtDb0YEZ1CwAU4rQdULOhK0ItgEKhAgRkBoOinuJ28Hie7Llus1L4cg4Kj/7fIVF9Bab6ihO+Ey3xHmD9CQUhErK6v9oq+GLcn1dtOV6VlqcfKz7rNjdp/BYPVLNIcqyndR8/ZrzZYnl01mu6qspxAJtT60foCTSVebiArUl9lBjKZO8Obq4ZDrpZZqaD9ruyG6aqAUAUgVmtFFmQhesFPazc1FWxVBtDpKq1sdP91nPiZsHNov3l3wCA7rf9Zx+UFJqbumaMVTh5UP60DZ32e0+JqhqIXPO8mjoAlqdqQweIHCKtxN3BVPsOAIAonJxT3VCoitAiAIAZSnS3sD6jWKfLL2R1Gs4eUqwmpWn3vNtgtyMJGGswc83SLClUSFiyYpYGGzqYhe/dzPPoReMHJ5oPTBbaB5j6Ug3rfkD9UDHTsAD9VrX1WBXjVlwXkAhTUkQo/CoAQJxYWQCgZoU/fpxMPPwqIQpM5g5mBFIHHrIlVQBQ96zWiCyiEGJSa4MUVa2k5u59nqThR7UVYR3kph/HrOV3Xw85Mq7q6mrfjdnWTb2oQlYbVZsgAFQxFwGEpEYIJWs1vXYAM3PEKKwpTenqUqee2JZOLMhShEUoBDelEFGC7rf143c9p/6Lj6luw/rM3SkN5fWSRHNHYiqGhpqLTaFbRmJHtaErox5MMUTkArAQiHAS3jveb+ArKSg8zEwHzvudZBV+Dcg6Ovo95a6mq/y9/Jb7+B7jtUIMD4955fOlT6Y/NHP819dPR7O/O3v8jR5VuGWBuOHA98qif+R4s9zVHLf7eUS4LRo6ELkauAMTOIAbICCWlmmwlCyNVFUlwWMplSR/aQVCYm6XbuaaOV4gC4Dn3dZNvdN88wIAKFbxwVtFj1T7/aQy5WBj725ILMuT6uE7SKTdTvc3nsbyxJZ/9b9RrAsNtuytrdu5KSBSs+CUbh3NQuSqKYk3y8nz6Gbh9CGKeE5pU55GHR+8jSJQlFRTcs2WhlJ2DGcPre+oqsFh+6//RbfX9bu/yptLAIgXT8AUJVYXT0qJ0MYBWGiCkl48rEtSzU09JSCaOqfKGHGH29Z0QCIvi7bavGZMfKyZg3W4kPOM8O0324e74ScK3fDuW+DlTZ6duHF24CxXhAjNnanoNXjFzETFvJmJhEitZHugDryo4vPtvogsBKY6iLpFZprlqWqRJkqX8j6lpHbR1slMCNd1RIB9yrVwFC59TuWv1MI3Q3q+H947W50vmqLCU/j4iPDOullX4ZMXm6RFWRr6MW+H8cnpihFGtTaGAjoq4SBcmPUzgwmqENw0m3GInlPabpCZJHLdkJmHbJptHKyYOyGSBGlXeb+VdoWIl//v/zN8/uHpP/5n3W48p3D6wHMGABQhAEsDL9eUM7jLYlJStDTkm2sbe0sjgKOEiXUQIsVYKvgIPvMX1dmLI+EMqmby1UxYPPQJzuSrQ1L+AMHuJrheImYdA63vNiLuAdb/YuHuky+h/xi2M8ntveXpN31UqXIS4n3n4J9ufD3d5k7S8bj/fz4yNd0hILnpVDXggIiuVuhZkxRWiNNO1K3Q2N3M0mBjXyxaebEmFmDO22sbOsuJmyUgeE4AXtSkZH0m7QpF+s8/BkSqF9wsin3y5ImWRut3rmpp0N2GmyW3S5CQc7ZxAHeqW5ToaSjy8YiIVUMhUqxtHNwsnj3CGJFkAmqqRaFHVqfgrv0eWZCY6kYW6/7zj/LNVVifUdVAiNQsqFmCGSBYGomYQqRYIRIQe07lLbWk0x7dAVlQZFIonbODDj4t4gZIhY8F8zpx2JPj8fT/8jW9j+8jXsVbMMMsmCviB4Fo5lkDsyhKuRd0VeAUIoxZEYEJmUjYyJkQ1WzMkxs0Iao5AdbCB7IXIg5Zk1obQy3sAEPW8qxKNsscupS3w8hE6zoOWcesm34sdcxkViQkinpWFAZ3dUhZ6yBByBzGnFEBAMKE32B6LUSalcG070uZu6SdysssgIlCTFfPqVmE9enw7AsAqC4ebX7z39PlF+HscRlEslwX4IMhcru0bm9Dh4AYKqrbkr5FZs/ZcrKUbOzBASViqGaVXQAA5AA5gTscdBnm9/vlOi4c5q7jMXOc0zq+yF/z7fczmu4B1p9WPO232SwSF0GsQ7h7qb4DAM3qavQDT6jJ9J1mtfzmZC886ru5j/9V41amARBwFm6YNRPBJwWBQtQAL4rMbmqWJywFKO2SqxoQ83ZjaXQ3zLmwsgDRwT0lG/tJhFMVYyWxpqZ1Vd1vXRPVbakJArPnTFU91RcKrpoE3wmIgBhMPY2es6UB9kB1I8s1L1bW7wHAVXV/45rBvfQbInPe34AZxUrWZwBgabSxL5URXp2Gk3OqFzZ0VLfW71FCWD0C8Hx9Ke0ynD1CZl6dyvIEJidB0H7vmr1quGoAEUy13xXRCk+ju7lqqbAUNkmBXweVRcupTO2uUwshEoGjY5HnKXE88P/QJPByWuu46/A+vnKjcUvDmk6Z2gZn5Yxplit5rOK6TYAlxVXyXlE4MGc1da+YhaioYbnDqJP4cyUcZnwWhATJ3M2hYnR3NSPCWjgw9VmzWi1MhH3Sg5dOE+R8EdsYoB/6lM0nJ8RCihckJhKmKDzkPCRV9zpIE6O774bR3CuRKoi6g7uqOboDVCI6DhgCIwCA5YQ+9btw3ZAEN93tt0JUCv0cKgAYPvuQ21X99i/AnNsVt0vdbsrmijhA3eDYuzsFJglN3dHgAAAgAElEQVQTvwrATcHUtQwEJgmT9U25S92RqajDEOKk3/pKrunl4uCru5DXFtjxmwylbx73AOtPKJIpATKig3/R3TQcapZeM4AXi5sXY9dp/uXy/DUPdug0Nd9KDeHFsP+y361CPDDZb1K/GYezqjmdzQ3fMNwhWRZkQLhPX/1Rw9+AhfUGIHjCV+iqAEUYc2b5Qsm2OABQqJDFcirNg8VSBiMBkQ69Df1Us6OAIpaJAKhqkNlVbRyKMkIx5rM05OtL1wxEyCFvr8enn+SbK1dFouqdX4b1uSwfc1XpOFi/T9eXAAAGU92QOT56x9PoViBapliH0weWkw89L1YTwykNJbMl63PE2XOtbkOowMxdKVTh7GG6ft7//re6v4kP34kP37ahG599mq6et7/6W1mdQVll0zg+/RRYKASKtazPp803ESAWKknpALCx95wBoTgtgjnFosvApT+gMMOK59pRmWNeM/wrFESPL9Z3XSN+uvui0ux/+/rx+Dafmzh9ImlRodOZl2bqIrhQyFlTlgswiqjZfkxNkDqIMBXZUnUfsrZR6iDX+wERklogikzZfDemyHTS1Jt+SGZZ3YJHYUI0K7R0v86ju7dhor1vumFIuaRzllWohCPzph8c4O2TZQ0ZjKRqnm62VRABeLHrrvd9HeR80ZT8mUNxFoAgbO6qZu4YIoPnIiBsZqpFUuG6T4vxZvfBr8PJOcUq72/qh2/vP/1g9/6/1G+/BwCWxnlHlOL5QzfToXNTZJHFGgk5VmCm40DM2nc6dJZT2XgAAIZIIbopTCuIA05OnYCzz8EtsR2O3Q6m/7d1wAP7Co/OeQl4zRXG2wv/vcU9wPoTikB8Xi3K5e5zSm4vxu5pv0eEQHwSqk5zsRR8zYMRGgnfgJV1NBd/vN8Q4MEoetScTC/q9lvIQJRGsor4e5FFvY8fOF6ze5++P5JWPKYsHK1BeEtOn5gN7prdDYr0n4O7FiVoDIGoLhwjNwObutuLoU2hn3tO+eaqgDMgBitCoNnGCZ+5Jhu1/+g3Y93yYk2xuM2o7rcFToWzR7I8obrJ1y9yGhEJ61a31/nmRVGInjhPSIDE548K4klXz23s3VQWa3DX3bXlzFWN7ar/7MP+k9/q7kZWp8UeJL14ml48RQkUa08DVU08f+yqgOBm1u9ds409SaRYFdVpGwco1b/yikwBACVSrIhl4vWolp6A0hzgpqUagvMl8olo8hqmyMvX8z6+Rbw0Dl6X1LrNYs1zp83H1ecsL9idB8DEWixOglhMYH3qEKxEmKiAsaIOGpn2Yy6U9sBUKsZM2IQQmLN5FEaAUS0wLTHAJOtD6n7VDQ6+G/OqCoGpCdKlbG6BGQlJwpDzsq6IcNsPqzqaezfmOkgUdvekVhJyCMCITpMYhKtK3bh7Th24cdV0WU+beP2v/5yuni7e+0tZrGwcui8/SS+eoYSwPs+7TXF/8n4AJFd1NyotIAAkpRsGSYIOfSESlK0OEpFEh6JIJ2UacVOEoh43uUi5zu/uqyPilmJ1tz4IL81jh4Mvc69evubfeUDdA6w/rThc8FpCDbCSSpAMnABXoapZzH3QxEivFZd6FV3ZzBV45S9Nn29SXxH/fHF6gFO95rPYfjuE5NNu736m/5OPb5SqmJTXD73reGevD1jMc4oK9oS33CY7HWIEmlzMJhVBp1i5przbFhEdG3vtdkDEVTP57ZQmxJxsrCxUBb0Bsees3S5dPcs3V1BEpOaOpPqt98LJBdctVy1VVbp+gSKyOLE05M0lsnC7KoqF4Bl5zU1lIebNCzPzcci+AXAkChdvFdr7/rf/lK4vw8k5tyvd32i3092GqlpWZ7q7AQTOuU8jhaoYUUu7Avd088LB3Q1LEquohRWW++07o2DmaFhoKFSqgTy7EE5SZAer7cMFOHx5NPV/D2mr+7gbCLOrwaFGWLYEOLsKTefhYca78+DpVzhoKR0iAkySnkSIc9PCwX4HYFIiNbdKqK2KKxo2QcwdwLOaqgkhAKIV1QZ090KWz2qIqJOi1fRkA5MadGNCCNEVACIoenERxyaImifVUpE098A0JMtkjIA5ZxuIBYgQyVIP4BxrQ+rTqB//Jm+vZX0ORIbEVZ1ePEUWOTl3N5TA7dLSWHYRlsYpyV03FKITgZnnPI3c4qyVxtKbSXXjU9/irGVVphTm6VLgwZoI7wCs40QvwB10dViNjvHVVwCq7z3uAdafdiAck7GKuvr12PWa3X2Thkf18rRqXnrQVGokAoBe0yb1APC4Xh3utC6Pg+nV2D2slqtQ/+VJffzwdazhW0U2c/fqDQRI7+OHjz80W3wF92RaV8qG70gV63Z1LwjAJzGmAqocvHQLzlObAwky5N2NmyJxYSYhi7TLQpYCqqqLhbvb2MtiRbEan31heSSJQOQ52djrfuduyByKXLuZ7m9KGqx69G6Z/ZHZ0uiqebfRfo9EQMzNonr4Vrp+7qbh9MHiV3/rKWm/S5dfAhLFWvu9DT0AVI/eoVBh0Wofury93n/wP/PmMl9fUlU3P/93vFgjB6oaGzp59C6GAOZUNxgiAHK7RCIb+vTp+8VPLV68VVZXihUAWh51d2NjX9R9cE5uQYFchsg4Fz7m9x4nZdGpDHKcscbjVQLuLhr38Y3jrjLJRLs6GhlzynZmW8OkPgoHsrmaIQIh6Syzbn6rjAUAoXjUeHGVnIqMTQhCVDwN3UGIhqwICoDruhKim34UIo6Y1YSoz3lQLWINQoFx+iuVFC9nX9cxqS1imByV3Jsg2ezzzW5UfWu9jEKPFtVw+XS5WH3eOSIuYmCiq10PCKd1LC/h+XZ/tmhg6DxnBee6GaWqRCjE7stPbOibuk1uy1/9XViuu88/DqbOIZw+AERPiUJFsbY0UqgKDIoPniBz2m5s6KftFrPlEQDcVLu9Dh0QIRCglmI6mHLdWh7B3TUjMWARcEcAgCNlUT92GCwEhumqzQXBgyrvLRo7rrzPx18hYt0BZd8h7gHWjx7fecOpbuqGgGdVUx9pOvQ5fdJtKuJIXOp95v5i6DpNgXifk7k5wPNhL0QnoX7vtVyubxdzPuNN5N3v40eJ70imOb5H5yzK4XeWnvDjbXupZ8wbx5J/KgkhCpGqejK7EKEQLSU342YBANbt8s0VSkQRHXtEtJy034Gqg3PTuoNr9jyW+lrRmgJIc6bHMdZSL8D9/2/v7WMkO6r773NO3dvdM7Oz67V/i9ckAa+t8OKQRyAiO0hOWMlShBTkCCGRBBSJYF6kiD8QISIEosc/KSiPflJQQiTenmASCSm8CIUkikgih0AwhgDxCzysA9kFI1Bs8Dre3dmZ6e57q87zx6mqW/ele3p2e6Z7Zs9H6/HtunVvV99769a3Tp06VW5edOMhOFtubpj+Sn78WdnR44CYrR2lLB9deLr4nx8zs0QBxSy3Wxt2cwOJsqPX59n14wvnx+f/e3z+ieKZp8zqeu/Es7Mjx6i/wrYAk5FElPYjnj2zehTYAaJZWaOsh0evt8Mtu3VZhkHFI01Cc6FMKRMZyoz1Ze2kCQFm7MlCQ8E6FQNkIPpR1243LDVfzQFvsGrXmGDFwuCL6OfReq92f+WrZZJ91HcfLoEZKBwV80vYd2OosBYBVnt5Yd2wLBEgy4zx7lm5BHfYLspeZlb7+fblsrQuXzGylo6fTshiNebcGEQgBEIaliUxl45BVtEhRIcAnBGRMb1j15v+YOC2Lm4PL22PfvbG63srhgHAuVFRbhdlbqiXZcNinK2tU5aTMVSWw/M/YXauGLNzXBb962/M1tbZWeoNwDrnRmgycA6yDLOcbYHGkMnseMTFWNYSzVaPWHGWIpKV3dkWdrjtRttgLWU5kmFnZeEsP+BKxsfPAwB2YYFOSBaPkmHzxtoG7XHA9s2e/izMExVYe46sq1B9vuo72KNMfN7X84HU7dLZoS2f2N54arT9nNX1o/lg7KxjHtry6fF2jnQ0769m+aVieHE8zIieNTjSGW3ryhjbsmRHiDmquloecMd3ya6JjYy3wSfr6nBtpTxgEH8UzHtkMiTK1tZFfJSbG248YnZ2e1MW3KD+it3etBcv50evN4NVVxZuPATKiMiLsGJcbjxjh1tcltn6MSQDwK4o3HDLjYdu+7JM6raXL9rtTbalGawBoN2+LIs9j5767wsP/ZfduMDODX7qFrbWbm9yMbKbl+xom7Jecel/Rj8ZlBvPuNEICQfPPmVW1ysf/IIo7wERQoZZhmQw7/sZT2SKZ55CMrSymq2u09HrIZkY5UZDZ0suCz9P0EvDMABoHYClvAcgjQT5NRn92Ef0bKu/Lyp1hZVbSZspDYwKsgnsWFtChvrQlIRmqEwi3idbZFUyquvrDIOTyYZjaw1SLzeFddbxkX5uiEaFBYDcUJ4ZWdc5I9oel6Vz/cwYJGYunbOOMyNLLKHod+uYiBBA1nJGhO2iNEgZYd7Lc2MMEZKh/sql7WFpXem4cA7H28NL24Pj/2tkeWxtad2xlcH48kU72h5c/6zN0ThnKJ/+cXn5Ipqsd+wGBpalFLgsXFmawaofu0fELCOTsS2BgUyOhkyvz3luR0PM8mywyr2BD4TvLJeFG4/ceOTKUuYjU2/A7EAm2GYELGos1CZxT/TOVeHNFhzY/b0JrlfhXtUrSyq8JhqAp1WbK0MF1p4z90ib7bgJGZkjZH427/9sPb1nsv+rdzJ+PNZbOdZrjideDTKFzCAZJA0oejCpNyu1IZMkEhACsEtcgIIvURLKoZpw5T2xiJkR2dmSR9v+jM5RlmfrK+BsubVJvR5mebm5kR051rv+WWLlynoDs7LmRtvsnN3etJsbrhhl69fl152gvOdG23a07cZDtqVZWcuOHhcF44ox9QbY64O1drTN7Lgcb579lhsPJTRo78SzqTcYn/9v8TcvN57BrJcdOYZ57kbDcuMCIprBioRvcOWYnaX+CpIx/VURjJjlorSAQRYrRMRs9bgoJyfBrhg4XatRAtkjUt4XS57EBzKr6xDihMnVY2f9LEK/Eki4rsg+OP5kLZW0KWmLcsVNxDWhwFpRGHwyBne38Gz7nBhcsBBqswvjFDxZ5SasA40MLI7t1jGgrNJBTlY7QAR5bRJa5zIi0yNDhABH+vlWUT61scUANx07Ulr3zNb2/2wNe4ZyQyu9LCO6NByt9rJ+npVWDFi8XdheBrKOofxj4JzIMa/1esdW+4M8Y+YnLlzODa308szY4yuD64+skCvz69cvD0cbw/FKLzu20u8btESD/3XS2WK1nztm7g9MfwCA4laIvR6ZTKoA25Ido8mNyWQtBwnU7s11ZKAsspU8G6xS3pMoLVyWrhi70dAVIwCWOKJuNOQ+Z2tHxxeeggLM6hFgYGd9CD0A73cFfoFUP2heTRvEMGgIzRG+ZASwmpYLtbyQHlDlmPhxV6jAUq4c9KtWaVydpSX0qSftnG4tx2Q6YXWL/bAUc12BIYJf/zbmZW/cIiO2Hz+IQuRju5dFub3JtpTFyOzWBjsHiG64Rb2+WT0CIXxzNGXZcVhoFtFubbiypCxnYC7GgGgGq9RbwY1nfOzQG06K9sqPXp+tXwdkwpQllx09Tr2BjOJR3ufBCpclSODTwRr1BpjnSIaBwTHYQixMzA4cIxnMezLvz25voslMfyVbXWfpmou9CpDLgm0JTnzUwBUjWZGQxbPEZIjIziJ6x5Tq1V91zaU1Z0yaDYzd8eZd7v7Ufd+vaN81QawUUWQl1aR7ExjjAw9AiOyXgY5n8vat6NXOAIZQ/NPFoFlYK+FD5TtXexkAbBfFqLT9zEeC6GVmXNqitOsrfYN4yY42xwUhyqLRgzwTf3iJdEqIElbeOR4Xtp+bnqGxtbmlfpY55syYzdLare31QV/cxTJjyBhcWUMkOx4hWIqLRAEQ5k3HAWYkCl0pAPLXDAEp77HEl3dWliOMfmxsCz9PFklcCNxoyMUYgMnkEr7ECykkJgdhJYmGVT7cn+Cb5StHao/Cjs1qd91ylRq3mtXryiuFCizlqnDMGdYW21KWj+lKqrF3lqESgGTFYU4dg8JgSGOWYdATrti6DMxipxHn9GztKDhbXL5YXHgajQEG6vcxy9k5Lgrq9THvc1nY7U0J+Em9ARLZfIudRVtiniMAmywsMoP5sRvscIuLMfVXOO9h3mNXFhfOAxmzdpT6hTh4xYYB8x7ACkrcBKKqVSSDCEDs3dKDU5QIROlJsy1BhjCYJdQ7yPKCtvTRv5wDmV4OaLPc9Fcoy8F38UmaXPkvDDAFt6qotKBytUriudduRnPzCoXStVuLd3zowVu3ujImfvHespV0McA7aQWtjBhDlQJDGVzjAcA6B0B+RZ0sK52T6X6l49K53NCoKC9tj0rH/SwblWVhXUa0kmdja60PSAdHB30G3tgej10hwbcKa0vriHBt0MNRUVjXy8wgM4S4PS6kmIM8kzyOJZA1g8ghazHLJPSdV1qy3jM7/2D7KS/yIzNgB84xAjNT3qMsL7cuy4qc7JyEIHFFwc4yhOXMydBgRYKVYK8HZcnsEMgHhGOSwPhIVDdENbYRm89/GENPhwExuUmQJsHUlCtHBZZyJci8GAAwqEs5HwgmtCDtZIRkUZCOnNU+8uvnyKp5ied7HCsEP+aF6IqxeHOb/gAY2JaYZeJxZbcuU3+wcuNPr5z8GTceS+yocmuDty7nR693ZWE3L7nxiPqD/Nj1xcX/keWZs6PXr/zULZj3yo2LXIxcWRYXnhI7Vnb0+uzocWB24xFhD49cR1nuyoJdCc4xEhuLPqonIaBf2KcYW1tSlpuVI34hwrIABkACGcIjIpMDISBRlomzrRms+uBV7MAxWOtGQ1eMZaFDAMS8Z1aOUJYDoazY6BfKtRaNoVxio6DUJyQMLQWGEfjagEhdXSVuWJPEVbNyTqqr13gdxtSLPc6eTf5WHQaUvoXMLcTUe90HeZd1/RD8ahaEflqtj6GQyGbrmJB6hgxREVaAEYuWZUbHK3m+1ssvbA0BgBk2R8WglxHgxnA0yLOjg/7GcGTZDYvyWetrg162sT06stJnZstukGcygfGGI6vG0OZwPByXRwY9xzwsytLx5mh8bHXgHI/KMiMa9HLy6pCZweQ9dpZBNtg/jbIiI3ibNDuJ2QZoKPgGGB/vymTit24GKwBgx2NZatCNR2wtACAZM1iRpZ3z9etk+R3TG3Bm/figMQAgbw9ECvExEChewXTsL5h4o/9ivFs1pRUypHe+1mlpmrCusmKowFJ2jWPHDCbtYSvLhzeI1BIm9dKxnTFtc7oO7zhb7DVKVBufRUQYgITCCuvrGYjr0kg5rfWWHibxf6feoNh4xg63AIDyHjDb4TbbUlyjwFl5KUvn2I23uRib1SNm7SimIdRtyda60ssaV4wk6in1V+RYN9wCJkLCrIfGABKwAwns3hv4FZfDqB8gIhrMMuqvhOgJ/seK1YqtdTIyCIBI0iqzLRwiUY+M8RFHMaztCLkvbWOCCAK2VhptV7eO6rfj8N/UKqv1uU3rQa8psDRbfcP3VKLSgvodlLSMUJaOtswZESFuuaKfZav9/PL2uHRFbigzhgGYYX3Qcwyb4/FKnq308mFRFs6RQ0PUzzNmKJ27PByJ9OtnWWYoM0REw3G5PS4yIusYETIiGUYE8RcDzIxJOspMiM4W3pmSCMXS6ixbyyH4nB8iRAJCmVEbL4k3afuXAMlYuSvGEhAYJBCJMZj1AK3UGjDGzwkk75PoOzbR47P59KaTPIK66rh1qZyqmbHi5p4+8yqwlN3BDH5erKqrw8EOoyPTd4dpcZz4uUPrCL+iDgOgK0bec8JZWZEwW113ZTG+9Aw4C0hsS3al6a+gyYpL/yMZqNeXoM9oDJJha+32ZbYlIIFPz/o3PVeOEn0mUeD9IJ1f6ocRCbMcxD/XlmwtZjnJyoDk1Y8rSwDwflFIiODn+gEAylI2Puyh5PFHjUd+mSDnkAjQhBFDHzaMnaUsx+pSeJsIs/NzpkL/O0Ra4hmqWKtZr7UXWkOvjmrkD5CjqztEk1Zsn70OAIAkHEM1nhv1FXDjnvjMogUQwU8DJAIsnQMAWRYaAXq5QcRxUbDjI4O+Y94eF8AABDmR+LvnxhSldcwIaIh6mRnk+cZwdHk4so77eeaYCTAzJE9h6RwCZIbAD1CC+Nr79QbCghwsU/+C5QkBmSV8bhBbaMLEF2bnEJyP2wIg8w2lrnGM1Op1GyERE7GzfsQcENAgAJCF0MZwMviaBhANnxJ1VTkpVv+vpSXXHcK969BdExKuABVYym6Z5b2vLAvpreL6+76VsWmgCkYsTPSTb/d9LIbgN4R+HM0B+LalHlkIqxgEQBIf0JVAvT4g2vEQmLOVNcxzNxpxWeDauisLNxquPudne+vHAHD0zFPl1mUuxgAARKY3kOFFtiXbgmhAvT6Q4WJkh1uuHMssp+zIMZZutwxkSGvhLJclElHeh34Y2gAW/3rMsqw3CAN0MueLZKUdzDK/JDOHFU+c9cOLtrDDbY62Ky/acgBAQuqthPYGwRAlpikkBN9iOd8UiEEr7XV3NBv13nx309Dp2Nt531WIAUBiuA0jgjVXwrrGSqtH43/xGCIvp2WmYTgOIIhrDB7xjmWRQSidW+vnhLg5LlZ6mSEqrSPEfj/PiDZHYyI6ujr4yaXLo8L2MnPd6sAQ5saMS2udI0QKKx4Swri02+MSEVZ7OQP0MpMZI4+2A2DnpY4Lq0qbsIoAkkEwvmPkrLhYEeZ+oFBmC5pcvKMg/gOQUKIA7MoSnAurEDoJ5UBZzs6hV1fGKzZjqoddRBUZJ/XUOTTGhxMVm1moDhCHWn3lqMuvKg80rFyY7O1+ClIBd9WowFomeHlfdcGHEtTl6mBQGexny1wfDtxxPDA0RtDxHZWXlg87GixYAM6FEJpOYjSHQIIAAHbrMpclIHIhEZzJjYbb25syrxuAMe9lq0fYMZdjV4wgSh9CYHDDrRhoCo2hXh+zHJl9DAWvhEoAQGMwy6sp3PLSjbHUvZokynsgUyPLkq3FsqDeALMMs4yCuYvLQhoS38aEbSaTDVaYHVgHAHIIeGnFMZSDK0skDsGpAQGkBeK4HoiUp13pOifuTrNe7XjAtUr74a/t7XJHROAqbgOEBaB9Gx58D5PzQ+W/CBBsYO3OC7BILifLSGfGOjcurSgtWem5nxlC3BwVhNjPTD/PpNcjLlwZoQninAFK6xh4kGUc3NBLa53jfp4Z7y3mixSDOyRPSTS7UagSYaVFJEBgYHFhBGAXHMiqA5111opLO0gE0SwnkzGzK0ZickYyoV8RvU380KusjRN78j7qXnWL2l5TyaWe1BVpGrHqmTtyQHXPrpQlEljW2m9961s//OEPb7755p/7uZ+jazCu0hK/7hyr4WoxXFW9qL8twztsih2rcTC3tjvbIYTUoMX1CYbh6xAQCMP4F1KWSzQpKAGkwyquGCHmu+kNmJ3bHLrxiPIe5j3xVXfjIZcFmsw71zvrnKyX7P02KM/9UGNZ+tCgRBxe08ElVgrMEJbv9D11mfBIBGRQllvOkJ0DduxY9Bk4xyQp1o2GfoYUMOZh8TVbsi0AkbI+ZI5tKfqSiMLMQZsMPoW+NVKigsJ163DXrd/dWhszyRw1sea2ZdhBYR7tRWKH6thT/X+6BqsdAN6IBfUKk2ovqO5T1cgHmYXMUFjHzEQofomGiJmtc4bQAdjS9jOTG5NnxjnnmK3jzJC4cBXWWeaMvKUmmksNIbNIrqq/Y3w2BAxVtWY7rduwkQAAUWy3DpgZ5fRIWZhgaJ3MqHXWsi0luhuzY2uRDOQm6/VLZjvaZmcp7yGQjPIDSLUysTbIiGHlwO6vLARLVqqf0rqBHRc3tWvN2IrNqSIsi8D6/ve//+pXv/rhhx++7rrrLly4cPvtt3/yk5+8+eabF10uxb8nNI7oQphbvUi70Y3/1zLUjVjgF6SttS7xpRvDBPmur18EDQDCYCLEv5UzhwyWMYCEMyjLaMY3gxXxMZf3LDtrh9tAaFbWgJltacuC+oP8yDEAEId3RMTBapjEZzmuTSYw+7c8IJIBoupV7Rfc4HAI1SxYwd4ms+qp1/eqS4ZBnSwbYr0jl4wwFgUDo8myI8cAkW1Zbl6i3oB6fUADzrEdlTxEIsxy6vUljBYzSEwvAASJKEehQ5+Yr5LREAiNS0tdpdOjaq1IemwtEetZDhBzqRcdeilRUom5pArPUA0AIkj0K0YO89vC4wQIfg5DEsk91C+OQbPYR8YSF3ipMUTe9UrMV8zQM2ZcWsecGSLE4bhk5uNrKwDgHFtmQ2gyso4L60CiwIuFiUGW0PFWXQZEyA0xgHWOiCQuvPzEoK44eVaC4sPQKYrOUCE4lnfDipKNmV3prGVr3XjkfRzJUH8AgOXli+wc5b18/To0xpWFt2MhYa8vZ+OykApJcn5OFzaoXkzVk950zKomDDYrSNM8gK1TxfPNk2VpNX/nd37nwoULZ8+efeaZZ86cOXP+/Pnf+q3fWnShlDAyeNDev4eGOdcLrF4mna0uTExM02sB/JKNWksfNsMMIAzWI0RAkjDo4m8BEg7Hd06deKOLuQjJUG9gen00hvK+WVkzvT4z2/FI1osFDPE8JeyCdMRl3AHR++pmOfUH1OtT3scsR5OjyYLRACnLMcvRkD8QgHp9s7pmjhzN1tbNyprEkmZbuvHYjYZuPHLFyBUjWb/ZjUdcFgCYHTmWHTlm+qvSckrLIYOG/mOeY5b5UjknrVQoMQARGIOGatff+/k21VLHDWgrqmm39GCrK9jf9gK7PmJ3jlozHm0vmEhkDDc0SmjE4HchYgySpQwRxZGLEGWBZ0PYC3FHGdgQiq963GVIJBTHeFuhSKLoAQAMEYXuEfkCVeXmZvF9cZGw+iHe40rMrhhdEr3hyoHOpi8AACAASURBVJYAEjHO75J+BQBwWaAxpj+gsHKUTPLwoU9k+ohzgBiCbCXXthpJrKuhhrqqV6H6zcM054QHf571YSkE1vb29j//8z//3u/93q233goAL3zhC//wD//wgQceePrppxddtGsdDcWwQPaqXkxoHJJP7RZdNhsaK76Z0y4gejt++Ct/0ramOrdoGuf8K1i8lMj4wTKTmdU10x+IyYd6PUQqNy/b4RY4awZrNFjxa9eQD4YusRj8qJ8N0aIB/ZI1AFW2vC+qy0c7RKK8h3lf/K7YMcikJ0Sf31sFmJ11ZeGKsZ8zCAAgkg4o69FgxQxWqTegvAdk2DlXjJ1Y0RyTyeRU4sAb7WrhUoA3D0RbWtU7r1q7DnVbS2hPmGpmq93nA1i796heNGtC5+Vt1QackD3WjzQN6yeo5HJ15zB96YpZCxAMIaFEAUVDKGOIGMxLwCDRHMRjXdyt0NuVOHRzUJzfDRIgOsciwgDCEGYy6ZEbpj2vrChYW0EcK8Gx75bIhA+vriw7Bwx+oXcZPQS/bLPzTpA5mkwkFBKxnE16O3F156pXVu8NRFka9Wp1A+ItqfcfJzVik6tSS6hdIUsxRHjp0qU3velNd911V0zZ3NwEgLIsF1coRVkwe1gv5P0TPMK7xgrTj0kEa0wd2GWmup9cVTmr+M0qJ2Lop0J9KR2IvqvBFd0PChACATIXYyeT+0iCeXK2ts4y8GdL3/HN+34aoO+R+0FIeYNXvyuMYsh2VbaMor+Yf6GLYQm8nGLn2FoJBuGKMTjHbFnUm/g3U4ZZBkji0u6cxaxHeZ/yvriFkR8BsWxtkJy+x4/BquenYUJYNjvarmoWq1kGB1u3uXXju3IeJOZeL7DuyF6vD60c4YkPyWE4PHF4B/AOfv7ecQzj4IfbYib/pFUO3Ux1PcDg42NZZgxeU4bQEAFz6RwhIqGTvfLYhDFHebacNxRBZnz8KnaMCMHdyZeq+qledHGcAFJ/P6Cv5MzMjmU5HAlwJSFOmL2Xuug/iuYrdOOhBDRBY+LqhKHTxezDtYtlCyG5DnXDYCsx0Vj1PgY29tYOT+9340sSZQZXx1IIrBtvvPFDH/pQ/PijH/3o/e9//5133nnjjTem2f7xH//xc5/7XJry9NNP33rr2j6VUjl0OGeN2TnboriaevHTN51M3hMTXHMrOdRuUxqqK9VYlXNKPSE4YwH7jnXiC5V0MTl0k9n3g6MMI+8q67ULIJCRIFUiqtCxK8eyVJmEHhX/WUBANGF8kIEdEgKA974KFiA05BvBqjwA0ceMQiyftNiix5z1cYCcDUMefrFnr9v8AoU5AjpbhAsv+qwEYO/CVS3kTEgYWt9oQkA/qpjehPTDjuqqdgA2E5ommEmgtS6fnmWhXE29+Jmf+qkdzp483klnol49WtUl1oQkPFZyLFa+jFG7JzWhOgEn9isvyCAIbsdBPrEM8Mm8wpgig33sgmqDIN38cB1A8KPy8q72IFRD0cmsxvT3QSyrN4yJuhJbrHPgwtLv8XUgK5CGdXVQ+kLA7Kz4Bkio96A+EarOByQlSKxpqTZqyKam2apVO7r7Gu0d0+qGtXa3gmkpBFbKJz7xibe//e0rKysf//jHG7uOHz9+yy23pClbW1v7WDTl8HFgevFXVy9a3dB0Dze32vsmptcblpAi/9ViCIXN4OQOACFUgYd98ILQrHFIZS4ZnAUQow5Bhkgky3cAEuXGfwf7KFxI3kyFYCCqLvAGIkQIXl/JTxLPMPk6W7Lz7UcoQAHOMYelrInQ5H60kQzb0pVju30ZxxkQUdZDI20iMRtwhR1tk8kxyzDL/c9jx04sDBIEiGXNdESMVrfadK7a/7uT0iO69nYmdO8/QF4Bc20vGpasxs5aR6TaiKFHm1NHEOuGoZpWSEUYelsXA0gkUqymIYpNDBDABWEkalwiUBFRmDGCLPPwvEDzVisAIGw/GaEEPg+TWLYAJGJXOnKYkKor8ZK0si5hsE+DrDEa6nIplioJRIeG0Bh21pWlXwMhy5BNGC4HcToLY5mM3ugn0z4g3pmaoalmqYLOB3zCs7wLXbXbXCmLEVif//znf+VXfkW23/nOd773ve8FgHPnzt1zzz1f/epX3/rWt957771HjhxpHHXHHXfccccdacq9997L/MT+lFk5fCxbKJA51ovh5uXW6dPXQ81Mgj4hmV0e31zVyIh0qOOUp8QuFeIyhD57MqkwfBuSNDDIhpMhFG8gqvXcARCcmHREVAEAEAEwO2mD2FlLxgDmEEJbeTcR2R+LF/rrcT66bwDD8AwA+Ann7IAtyD5ZD4T9CrXsrE+Rc1H01gcAoLyHq2tkcpBBQGftcNsOt3jLUn+F8lzGB32rY21wsaJwF8JpkVJdE0YJk0/xriTtS9Kp38F21d1dn5BEtFx23TnWi9H2dj1Xdy+iq+OA7B/1cM/Ck4Q+hCj6KlFJqWAqin0Yb1QCxFDNQpXh5LaJ6BGzFyIjykxDjvVRHm0fpNSxH2YElFgMjpmSZ4cbj0xLiWDMg+E7uDJoQfgBQVc5Z0sftcRZCFND4qo7YgOWYCWyVIN0TijLZe4hjkfsnCsLWdCTTM4UIr+zA8B0tm9VyNq7uv47mrWj2kh3pxudHZTmdWphdl8vFiOw7rjjjkceeUS2T5w4AQAPP/zw6dOnX/aylz322GOnTp1aSKkUZbHsY71otSsTTVnNj1PWga63S4kdy5ttAEBEBVfaohpW4KS/z9VfFyJsYfh+6cT60TSmaBaC4NKb6Cf5CmbH0V6AwQcfYkliCZIQDDLwUY0gIgKAMYjBp15WYZPBjizDMPznQ8wXBbtSWisk4+VisFYhVPEVOQo+qKnMrlvWaBwnd6ix68Ps3fslY5HtRZcAQwgDby07Vn0pnXB8zbwV+yT+uQZ5WJteYB0aAyurUsjsF5YOe31QeCQkFwxrWHNh6rDzVIP5UeXVjF4+ULCYqZh9TDiv8vz4XnQW9D6FlPdY3C+Cq5YrxiiTZ7MMnAMJOwcy0c4fHH5HVSYMUjQtfyWYIOl9pD8u/ZWtC4mNDHtZCxYjsNbW1l70ohfFj86517zmNXfddddnPvOZye8XRTnk7G+96NBYtVahytX4GHVUh8N75S8b9FWVFPwhuNoVTDsAwC7ROgFOtvyb3EeRjiFz/FqzzOLXAn4xaa/DgpVNpn+L0gLw4imclyHaq7zOC+YwABlzJL/mWhWzip0roGQuC1eMKe+hNCeIlPfIZJBlqU+938Y4JyrsIvTLPIdBzHpvO3bDO3rn1ZVqmK/qTwrW/tdMPhDsR72oaaAdNpJD2vqrOlGsTTLwF7sSADGEVvLEe98s8NoKo/yKgqpmiiJk6UrIEx7NO+QfXWZmb1SqxgorKxtA9dhE1R+9vxrXhsXhS3ojcSM5Q3Iq3w2ivOedtMoSvFcYeh8AkoClcb1zjNZBCBM72pqq2mqqq3QnNj9MGk9snXyP6sNS+GA98MADZ8+evfvuuz/60Y+m6a973etWVlYWVSpFWSxXWy/a74wO01N9RzKIURNVMOtYYf3Nmfi8++8J3XtpW+qmMURTs2MxVMN57PUcc1iUAykMO8ZphuCFi/PfX50q8feqXHEdh/Ck3jWeZcTFD3xwCBgR38HiX5WJZ4nEZLejbTcexSCK1Bv4RlKWoAYEItMfoDEIyPJdwCiWMLkgcYTFX8+6hOrslHe0H+n9S64ptB+DCU3JwVFcc2wvWuIp7UC0P6adCr+/NqMQEguV3ws+DYJltZJZGBamCUbMxg2Ldk3RIEDBrhVqmgQ3SfJ59caMsko5A4cvCf2CYI2tFL//HSL+ZeQxGphFWvkBQXbe4hu+jCiLbwA/gBhWNZAAKEgG+xkAiGE4XkNEBCCZisvWxurAzrEfQsXmE9mQR52Gq3j++jH14xrVqGt7fiyFwPrP//xPAHjf+97XSH/lK1+pAku5Zpl/vfAv4M4djWYDWivq1D+mLrxVM5V4/KI3U0lnXAYwuNbT5dB3Zn+qMCTnJ10FXy7fJvlRg9CIWD8nXxbMCSYiOTrIvmojtGJpR9yrrjACYsswzCNjf4TGBH8pZufAWVeMoBhJqB7qD0x/kB85JuEbissXuSzZlWwNZlmc5Aj+zAb8woshgBA6JHE3SWYDQNKQ7OBZ0nVraw1K2xgx8biDxQLbi5YgayVi3bpbU2jS2UgGhAEgSDIMwiXVcuD7O/GhhyAf/H9pFUx7S7FIqeOSuFZhcqLKgy/6OiYPV+h4cM1kJf6UcdAQ/MwMv0w0IVon66kzlAxsegPKMjDRmZ1BwnkhgQGpj8zepR3DatPV72g/wO3nuq6uqkRsZ+i2Y+1YS66YpXDyffOb38xdnDx5ctFFU5SFsVf1Auvv41pq9amZBVs9xdTekg4WYPhfw/qCHsDKgzuZG0QS0pOMgRg0mhCJSIQOoKzW7HvJ4TzsHFjrY376wT4rsT3ZllwWXBYc5or7XrgLdjIZ+3B+GjmSQcokcqlvvkJ3PFs5kh05lq0dNStrmPdcMbbbm+XmhhuPAMAMVvvHT+THjpvBWvhVjFlOeU8CWIszPgP7bzEGE0deFAscxjDuWLsDLbNWuEP1DvqEpmgaB1BdwX63F82HvjlhoL6/o6mv3Qr0t7Pj1vnnOdbOtp0l9dDD5NhEM/mKxSEcfLPv1DoVenUVHzmItivgUF/CARirpczVAPR1xPnApybrUb9P/YGMmLO1drRtxyNnLZqMshwp49i9QZReR/hNQcPFf50XqVY12i+k9p2om7qaGdo1qyvzlbIUFixFUeZNh4YCAOgwlqRp1RvWv3nCSmtpJ9x/jD3pOFzY6ZIFmAwXxp0szlIYBh2YHTiobDnS05ZYDGFYJQ6ryVge+IbE/4w4nbBqVMRGhcDWj27ECeGh5ZD+t2+hRBlilsv60DIIyM650VDcs7x7e4hoZcfDYuMiO4sI2ZFj1BuYfh9oter3y6pqJrxmMR0iwtBlhzAG6n94vZ+eKNeqUai3Pe32f3qXvOO5OJhSa0/AaHTC5KGv7a7Zp+SRThZyrmxUwYIab2ZtxFCyV8PpEI+vD/lV1IfpqxRsKIvU9hNDmFbWqWDHknHp4PcUzhh8Ijn8Nl/yJJYwAyASYuXG7ifJOi79SZBMP8+McRLbvSiqZzeaqaLZu1oSJ3n/+F3pjoZ+6vjYqiD1mYN1bdwtrLrl2BWiAktRrik6VFWrl5t8rvmRpAMb6TGhTWm4ZAH7tkhkmW84Qre65msFfsgAvMs5eHkShvmky8uuOooIxE04irD47ewgdMP9kESQL4gUPGbqM64RCcPsQj+c6RAIjcEsh14PHLOzXBbBfdj4aedHka3lYmxHQ1cWiCSL5KAx4ncF/peyb1oI62OCUuxqJKFDXU1sPGDX6mpPeunXAPV71qwu0NJYtfrR8NtqHB66LK1o8g24oaPiuWubmKZi9xHVyGD3AxBH/5OfAATB+Zx9lDhOXBsRq/OKVdiWDpiQyGQMyOT8OogQ3g9RQ9Yvln/Sm5eioaUaKfWkbjvW5KRaN2Zqzt2jAktRrk1a73lodtRbm52JzfakZsqSdqGaIwf1tqaWvxmwIHhNeYmCCGgwLrkDAGIWM6lcYQYXtBtDKuzYm7vCGCUlL1UfbUFS2FpmB5a5LCSd+gPKczQrmGX1BWgBACBn7vUxy9iGiZDsuBQ3eQIkrFYbFBmatHv+t7DvxNf0UXtD1dV+0KGfdn9g4yQYbF0AwYRV1xSxexJpVJTOu5UIqGgCjXafRHvFRyV1gsTaUWmJqpqMwdZUVToIg4PgOzzBX95rLDnAikFrjH4tQqzGxJm5/tsSx7BgfQu9sK6f3v3cdnc/0q1FPO8qsBTlEILQeIlPyhXhWgLXPyQDDpVU8h1WqA16cN2UhfG9Ho1IwWkd/XuZQ7bwFTJIEQYZ5dQcLFgQXLuCVuEqvgMDAiJVgyIxUAKAHwlpXpLqCvgZVwCY5UTGB+wBBGZXju1oyLZ0xcgbzKTFMMasrlOeo8lMfyUxyoEvmHcFdt7PpQpUGFoOgw2VlHizJf81tFSrFZkmrXbfKVflBeDb97RzUZuMkIwSQqwucV3CkMXv4nh/OK1YXuH4M7T0by2he8ywOg8mj0pyeDpXIrrHJwNvDVEXdGAaowSrI/xQYHTMkhOEFaBl4F52+Om0YSi/8SuQEIBitycYldu/rlkX2j+7tmNi96NZybp7MknivKqACixFOYxg/XWb+DxMPiDJUuuAY5oeJhimOdOP9YAOTXtV1CDcPGXYXyViGC4EedFTYgtL2qMYktGPX7gwwBAHDZM2D4LtKnUy9xYs30hwWbpyDMwwRnFIp7yHvQEgyoq2zGE6Oju2pWOHVKBMWQ9uyowASPW+OTC70FwlvXk/+NMwOsDk9/10ddVqMSd8aFD7omtTYeGUGtLc59VUYx5tQ5N1HJk4aNV3Ny5528yb5uEkqaPTUD1KyV1tuceLvOOmkmt8bfyNST8IKfYcYocquHUBAoDJkMivglATWKGwMU5rPKzj50773CG5JqurZm9jUu9jD1CBpSjXAI0XC09qSpLXde3N3dRY0FxqMD2wWtoWYpe+4ScBIY4DgHekFz93nwkB2PvXY3xto+9aszjOR3+s+NXsdVhch8aPN4CPQJSqvXiwX4KD2fqZiZT3fG5nvYQCpCyjrJetrSIZ6d+zLW0xLi9fYmvZWszY+7/HMUQOkUVjjK549WsGhXjtaz3p6sPEjvjUMcEZpNWce+sHnFQJdW83tFK9Z5GmNp2uap/lpqVDbmFP/eTTiprsDnUAW7uatqtw2m7pkf4AiMqn6hskFUj6JwhIFD3cfTZrmRnJYtZDEEdJ3/GpFbYqettw3ihMVwGbT26ngWryT9zpG2Y5bkZUYCnKYWVyr7ga8utUWjU5VW8Hqhci1oYLZWfsjyNANRgIGN+wdef36gtlKMNApYSkpUK/N0RYCBMWkZEwhlqIbvXVGn/Jj/Zdb8Ka8IoZohALhSSUWehV8MNy7IqxG4/K7csSQkLiL1CW9Y4ed87KPCkZ7uBqVCU0UWGtRmj7b03oiLdby53UVeMkEz9M+topmZVIS1C1FZZP79BY0LBcQdPAO+Xad40Q1k1SLUmQiCneQUynqVWJ4lg+iN7yFY0hTNoQu6/v8oB/8pmdsw6g8MGukCQOnrfVNr+2cTlnefxaP2UmcxfUrkj3hZj/w68CS1GuEdqvj8S5ChpiC9M8cbOR7oUWpznTQIrR/l+FGE3mGIbdMhaY9IO9qyzGdFlhw0CQQcyM7GpWsaYBrP1bW2OLkrMuVEQJMTOUpbNW8lCWUW7ASy5m59x4xKNtlrXVjEGTm8EK+EYortuD3nogR8UyeEf7+h3B5L+GlsLWh52tVl2iasd2SPF0yqaOxIahC9Iq0rZjQa1ySFrLFFVtTRbJHQICG5tpCqbPFtYyVV+YnAA4PTAaqDjRVXJUCLwe+jmy9jkRADhbQhxDlO9FrP/cLs3YyRRBNUVUxt0dimqCJG2f/6pRgaUo1yw16VRZlyblSWxY9Rexb1i4smY14lXXnGb9Wbj6MvTv37AjDChElyn/pmZOZgJSdA7xai+1D0U5EwMFyfudU6EDQdVVfXUGRGPIZICIfZLSeBd1JDRGnOVdr89l4crSFWN2DnhsgcMK0ORdqkJ3n2UxH7FgNZqJDr00u9Uq+TBdWk06SpkMThgBxEYF6XA0rI5v7+uSWdWesDWD+OgYFmvICymd/+yHpUM61zJO/KKaEStaezlUavFjjG7v7FxZoDz/gGIJ9osYxu5TJfK6rlvtDQPxq9tZOnd1/JSdn/S9rQsqsBRFadqlupoMrART56Aht1PSBippUzobpLijalz8immciqTq8KTt4KpUEoHaNwDhDwdd5U9RrTAYfwnG/rqEgAcAcbcCRI4DlE7WPTSm16csp7zH/YE487It2Vm/gjVC6K/HKxBGDmtXO/zias9VqqsOsPMQpZNO01XXo1/b1fZ2T/Z36q/JMqvaP7GEclQ0BIduUQy6mzxlU4w58rRD6pve8W3Jgli+AjJDkhaqPbKsDOrFFkIwQldHpf5c0aZVnYYhFmSCZWlyPyTs3ylHTVTuS1VQgaUoSiRt6KOZJ3XIiv+Pe6vEqufNwaRVHYLBBFZFBK2pOQQAksDvlUssEviuM1de7YiVHcEPOCZFJATvyxVf6bImbpBjlR9J/Hl+8EPOTVkWgldhZWMLgo/ZATs7GvrcxiARmQyyLDiQta8ltluULkUFuxBVtc1WjqkGLaVOrcfAjcQZjFgTNZYXQ7VuQeOL4/1pDhBOVwDJUV7ItJ6Uyu09ydr47F0cO8w+Xbqv8sGq9cjEDoyEgBkCVsGxGj+6FYahaQic9kPbP6uVa1rFSTPUL1LnN81PfKnAUpRDyqS3xCT7Uffxk2xanS1QldicadjordfevF2JEA73B6JMXAp2quR1XZsbGEYYsWp1/CBg6GqHGDzVAQC1s4UlaV21Zk61F0B8sLCAqMrCICDEKA0QyjyBakflkQYzdMHbJqtmlraEmwmVYTsxQXTMkNl/mDSUWOVqbDWFeudR9WekeuYazw42kmrPaLreVP2bW18Wu0a1WYExxTsXersvc7PWN8434Ssn/N5OadV9zPL0MVRgKcqhBKe8qepaZ8fzAEDwoupwhO/0gveJMmJWs2ZVI4CJXoix1xN7kRzEYRHD0JZIYFJut1bRdlQ5Y9Ve4W2F6J3Q03c3gvTAHTjnRtu+fx4mUqHJRHKZvCfddBdWnkY0yYhNuPhJRzoZAoG2ltq5/93cvGqr1STD2OxnuGZpqa0uO9euNVb7SybvSnsX2Hx8Ok7UEFyV+Wqnr4pHJKa9cGg1ou+FF4TxQRCfylB5W6Om0OxxTS5Bu1PRytDqZUw5zWT25JlXgaUo1yATbONRBkw6pBoHrKw/SZaOcUP/IcZ0iNaa9vBBNXSYfivWhhpjORIjVJLuJ4wnUqYxbleJIG8e8wtChz59HIXMMjNYCeYr9K2HlUCjjksrbu+mNxD7nrd7VRIzOWf83naYhsR8FS9MraRTEmu6aqfmYTk69AeKoAxq/w9aqV1LZK7HJAHlH8ZOu+vsBWoaajrExXSfu5rbVmosm6xfZGpIauL103WTkPWUnMkbkatR905F1egTVIbqjkJPLForM0LzxN09h+aA6p7VCRVYiqJE0tfvVKUF4M1TtbYiaJr4woqCw2eOr9pUf8QZhTXfFYDo2oJp/nhQzRoW5gcCIBCG16w/0A9XtDrSGN/+DX9bsWIVY5+Rgsc6IhAiGwiRrNmNQaIBhWVwEkNacuZm6xK/rt0kJB8mtJW7sFfNKL+uYZpSKfncoaJ2OE+X3ar75BMds6acv/0hrQDyWKRaqan0wyE4eW8H9Q5P5bQOKOt++pMm3QipeOGR56q7NYVWHZjlgPYRy/agq8BSFKVNXWlBZ1MTu4N+X0sgQYdNKz1tsoQNAGFrZVlv9UGQBWqSt3hwG0/FHULqXMUMDM63J37eeMev4Nrq0RDlFAIyWz9/sJSY7IRkgHxwdpQfHBoYP1DYMCFwWAc3Krm0sFNE0s4mq66jJmdVZmQGUTXZiNVKnaqxAKYOGk405ky0vEycN5fqsKr3Igs0T/yCKDPDTMIYFqXqQGElFKVSS6WD6I1VHdT5G6+UqeqqXUFwwv7WoXNHBZaiHE52fGfM9s5rW1Paxq3U8A518dQ4nGuHBF/4oIfCBKUoDsKIg+ibql8c7VHtmd4hMdE6cn4G5lrzIgVAgw0jlh9UZCQiL5lCU1E5tgMAMwandkz0U4ygiHEdnpjMdWnV2VQ279tMvjJXYalSFXYltA1W4Zluxsnq1FgCw84GpMYhrRP4R7x1mviYdT4+E+YPRpIiJybZ6qt8v8LVj8LKetWwGNcqF7QvycxMkp3t11S3uuo4fMK1nQsqsBTlMII7v7qrd94UK9Wk46YZt9KXdyMPpm/u9BAfkCF9/7IYpBAAfSRDF0RV9D7hpgmras8qZxHEuCYg1L09IMTZCrF5fDxScahx1lkfR94nyhn8dCr0Rqzmr0+kKDPEZqdmYNtZEu2drkpOrOLqyphq52rtnJh7urlshpszLUvXs9EwX7XmD3aVLF2VsPa0J6ORlarkuMfHLW4Ojof/NdJ3pi2haruwe9eks+wTKrAU5RonmUPH6WtyhgPDYZOP8TqmPTTXPKR9eOwJBxMWUC0UaXil1o/kKNPCSjsA7Oqr6KQv4zjh3IfvYQC/SDOSwSwxm7XLh96910c3lS+o+7ZPJF7pekNYbyfmKa1UV82Z3eimnfO270nd2tvY0zBc1RZUnyBCqkc/2R3Dl3R9cXo4BlHGlUmryo3hJRCsePHUtR/ZOD22kyYwY19xhvxXYeu9AlRgKYoSaE9la9DskCbZu4/xL/DOEYyaPSvtXQfv+cqw5dgP81V94yi/2ieWxiAYjvzwYvDNrUrlxwLDTw+2K78ACDhrgR07htguRcNVZf9yPiU4ubd/zxVKqMYvmo3O71CumIYwmm5yqvJ0+VZN01gzpzfS0tC7XXlSa6pYqzh2o3BieIdEOCXfFP8mlZlrPbJG7yxZy7D7NySdpa5icP2ndGXxv2NyhpkqQT3TxO7HlVQoFViKosxM6kHEbbtUxwHeyNSRlVsfsZ4T/RvdyVcmgUbDmRHqKZVySoKUOsfgQOYx+mil0UdeysYAIqc4Dm9IMHdEQqpFZ09+PwLJ6cIgY5Kl9RO7RjE4Sswpbelumgg1TS0PXXpqFn025XwdiZNdryBYd+OnWrQ3CBMB5TS1c+xgwZL64KuRPxUCpCEs5CTVSqPdJu5Y1h2F52R1NWnHkqACS1GUK6IZRnqK3pq8wAVUg3RNb1r/4oYQlt0fwokqqk7jhVg43tuhghR01o//OZuWH8StSrIa8Dax4MkebVrkl1mDDAQxtQAAGH5JREFUplJkV9nUyDQuQd2s0Di2y+aniurAMU0xde+7Go3VhpsmpSDaa1KqqgcNATY9QGn6FRViEmbu2NU+NnzXFf7q2Z/uHXJ217Sr+cIZUYGlKMo8aPemI9PfxOnspHCA3wPJ/4PNySstCuly7vSjjzbKwC46pyARIoLXXRhLxc75Q9IpUeLG7s1d9Rjx6Y9MlGAz/FXy46tWJhayOe40+do0vkhZCJMFQuee6Xpit2pjihzoCjQ65STR9BxT2w5YrQOjm1c1Spg+6tzsONT6GGGLW/tahfPZdvGkd1mFoePzAlGBpSjKHjNFewFA7d1df2ViLRHTiFsNZzDvDgUyW5DqU/nYWWB2zgHYaullCEKKCIDRUVjJ0IF3BOPg7j6p3K5aR4caoeXj2z8dYkxHM1sXyf9viZoHZY+YXWN1Pw3+IWFmblauGTRKa0Rw0lxC/x2tg6vwVh2e7Olvi1Vhxh+8y2d/d3arRSgvFViKoiyYZiQqwUdClGFBrqxEVdCpRqidaE9y1Twn74CehT0ubTIwPdYY9M0ThxnmrvLKmlrw+v66IS6dctWxVI5yOEHoWIWvmWGnM0zE66r22jm1w6rxQT/VJFlNAWAHa1dipmoZoCcVPBFelcmsIcKmHD4Xlqt/ogJLUZSlJI0ElUbyTHIkgwshvqf0sGtEJ3RxYK9MUtVwYfTTCk5Y3iglMxAnMHlYUFFgRxFVG0Db1Xmr6R6V8anTzyqm1KWV39E1L6OjOK2fMel3pSuNJuepTXSZl7qavco1JGdbk+4hKrAU5VDS1hnLxhQ/pPZQmneqnShl4pzwpo9I2EgsYWEso75wG5n0exHC6TjMjIpz79PTHjAOXIEPOZNtQTscFar3pGGwuqN7lwVr8rBg3c7U6UAZJVZNazWCU1Rm5iTvPhixloiDLbAef/zxxx////73vR9ZdEGUA8kXv/jozTe/YNGlmD+PP/74ubNn//j//J9FF6TBFbQm05yWdjiq+apvv9knvet3/K7Ky6qeskDmqZy+/OCDt9x66xxPuCRMrhe12zd9blzTnW5y5r1+Jia4Z0EioSYfm1iHu/Z3lZ0npu98Laqdc7kq7XHQmTJP6BDNaNPCK6gXB1tgvfjFLwYAxJv2+ou+853vHDt27OTJk3v9RfPl8ccfB4Cbb755weXYJU8++eTFixef//zn7/UX3XzzSB6hQ4b8qP7Kyl5/kdaL/WTf6sUtt96q9eJq0HqxnyxzvWj7rykdvOENb7jzzjvf8IY3LLogu+Pee++Nfw8Q99133wMPPHDfffctuiDKDmi92E+0XhwUtF7sJ8tcL3RWi6IoiqIoypxRgaUoiqIoijJnVGApiqIoiqLMGRVYiqIoiqIoc8YcOI+2RfGCF7zgppv2fLri3Ln55psP3KwQALjpppte8IJDGEDh8KH1Yj/RenFQ0HqxnyxtvdBZhIqiKIqiKHNGhwgVRVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzOotwVqy13/zmN7/+9a+Px+MTJ07ghHUjl4pz58597WtfW19fP3LkyKLLMisH8TpfyxzE+6X1QtlrDuL90noxf1iZge9973sveclLAOC6664DgNtvv/373//+ogs1jeFwePfddwPAYDAAgPe85z2LLtFMHLjrfI1z4O6X1gtlHzhw90vrxR6hAmsmXvGKV5w6ders2bPMfObMmVtuueXOO+9cdKGm8a53vWt9ff3BBx+01t53332I+NnPfnbRhdqZA3edr3EO3P3SeqHsAwfufmm92CNUYO3M1tYWEX3gAx+IKR/72McA4Pz58wss1RTKsrzpppve8Y53xJSXv/zld9999wKLNAsH7jpf4xy4+6X1QtkHDtz90nqxd6iT+85cunTpTW9601133RVTNjc3AaAsy8UVaho/+MEPnnjiibTAd91114MPPrjAIs3CgbvO1zgH7n5pvVD2gQN3v7Re7CGLVngHjx/+8IfPe97zls0UmfLlL38ZAB566KGY8pGPfAQRi6JYYKl2y/JfZyVl+e+X1gtl/1n++6X1Yu9QC9bu+MQnPnH77beXZfnxj3980WWZyIULFwBgfX09pqyvrzPzM888s7hC7Y4DcZ2VyIG4X1ovlH3mQNwvrRd7hwqsDj7/+c9ngXe/+92SeO7cudOnT7/+9a9/7Wtf++ijjz73uc9dbCGncMMNNwDAxsZGTLl48SIiylSLJecAXedrDa0XC+QAXedrDa0XC2TJr3O26AIsI3fccccjjzwi2ydOnACAhx9++PTp0y972csee+yxU6dOLbR0O3Py5EkAePLJJ2PKk08+eeLEiTzPF1eomThY1/laQ+vFojhY1/laQ+vFolj+64zMvOgyLDvOuec///k///M//5nPfGbp4ph1wcy33nrrq171qj/5kz+RlF/6pV86efLkpz/96cUWbDoH7jpf4xy4+6X1QtkHDtz90nqxd6gFa2ceeOCBs2fP3n333R/96EfT9Ne97nUrKyuLKtUUEPHNb37zH/3RH73qVa/6xV/8xY997GNf/vKX77///kWXawcO3HW+xjlw90vrhbIPHLj7pfViD1mgg/1B4cMf/nDnpXviiScWXbSJWGvf8pa3EFGe5/1+Pw0WsrQcxOt8LXMQ75fWC2WvOYj3S+vFHqFDhIeZS5cunTt37rbbbuv3+4sui6IsC1ovFKWN1ou5owJLURRFURRlzmiYBkVRFEVRlDmjAktRFEVRFGXOqMBSFEVRFEWZMyqwFEVRFEVR5owKLEVRFEVRlDmjAktRFEVRFGXOqMBSFEVRFEWZMyqwFEVRFEVR5owKLEVRFEVRlDmjAktRFEVRFGXOqMBSFEVRFEWZMyqwDiHf/va3/+qv/mo8HsvHjY2Nv/zLv/ze97632FIpymLReqEobbRe7B262PMh5Pz58y960Yvuueee9773vQDwlre85Utf+tJ//Md/rKysLLpoirIwtF4oShutF3uHCqzDyd/93d+9+tWv/spXvnLhwoVf/dVfffDBB1/60pcuulCKsmC0XihKG60Xe4QKrEPL61//+q9//eubm5tvfOMb3/Oe9yy6OIqyFGi9UJQ2Wi/2AhVYh5aLFy+eOnXqxIkTZ86cMcYsujiKshRovVCUNlov9gJ1cj+0/Ou//uvm5ubZs2f//d//fdFlUZRlQeuForTRerEXqAXrcPKTn/zkRS960R/8wR889NBDX/3qVx999FH1WFQUrReK0kbrxR6hAutw8mu/9mtPP/30v/3bv128ePG22277zd/8zfe9732LLpSiLBitF4rSRuvFXsHKoeMv/uIvVlZWvvvd78rHv/mbvyGiBx54YLGlUpTFovVCUdpovdg71IKlKIqiKIoyZ9TJXVEURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOaMCS1EURVEUZc6owFIURVEURZkzKrAURVEURVHmjAosRVEURVGUOWPuvffeRZdhJs6dO/e1r31tfX39yJEjV5/t8LHjDx+Px0899dTlBOdcv9/f53IukO9+97s//OEPT548OSXPNfv8XA2zXDRr7Te/+c2vf/3r4/H4xIkTiCjpc38sZ7+DU3LuxWOwVFdJ2TuW80Yvbb3Y1ckPXgXhpWc4HN59990AMBgMAOA973nP1WQ7fMz4wz/5yU82bv0999yzz0VdLHfffffv/u7vTtp7zT4/V8OMF+173/veS17yEgC47rrrAOD222///ve/L7vm+FjOfgen5NyLx2CprpKydyznjV7aerHbkx/ECnIABNa73vWu9fX1Bx980Fp73333IeJnP/vZK852+Jjxh7/3ve/9mZ/5mb9PePTRR/e/tPvP5ubml7/85be+9a0AMEVgXbPPz9Uw40V7xStecerUqbNnzzLzmTNnbrnlljvvvFN2zfGxnP0OTsm5F4/BUl0lZe9Yzhu9tPVityU8iBVk2QVWWZY33XTTO97xjpjy8pe//O67776ybIeP2X/4b//2b7/yla/cx6ItC3/91399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" + }, + "metadata": {}, + "execution_count": 16 + } + ], + "cell_type": "code", + "source": [ + "fig = Figure(resolution = (800, 380))\n", + "\n", + "axis_kwargs = (xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "axb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n", + "axu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n", + "axv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n", + "\n", + "hb = heatmap!(axb, x, y, Array(vars.b);\n", + " colormap = :deep, colorrange = (0, 1))\n", + "\n", + "Colorbar(fig[2, 1], hb, vertical = false)\n", + "\n", + "hu = heatmap!(axu, x, y, Array(vars.u);\n", + " colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n", + "\n", + "Colorbar(fig[2, 2], hu, vertical = false)\n", + "\n", + "hv = heatmap!(axv, x, y, Array(vars.v);\n", + " colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n", + "\n", + "Colorbar(fig[2, 3], hv, vertical = false)\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 16 + }, + { + "cell_type": "markdown", + "source": [ + "## Save" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can save the output at the end of the simulation by calling\n", + "```julia\n", + "saveoutput(out)\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/surfaceqg_decaying.jl b/v0.15.2/literated/surfaceqg_decaying.jl new file mode 100644 index 00000000..7fa58157 --- /dev/null +++ b/v0.15.2/literated/surfaceqg_decaying.jl @@ -0,0 +1,164 @@ +using GeophysicalFlows, CairoMakie, Printf, Random + +using Statistics: mean +using Random: seed! + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n = 256 # 2D resolution = n² +stepper = "FilteredETDRK4" # timestepper + dt = 0.03 # timestep + tf = 60 # length of time for simulation + nsteps = Int(tf / dt) # total number of time-steps + nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs) +nothing # hide + + L = 2π # domain size + ν = 1e-19 # hyper-viscosity coefficient +nν = 4 # hyper-viscosity order +nothing # hide + +prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid +x, y = grid.x, grid.y +Lx, Ly = grid.Lx, grid.Ly + +X, Y = gridpoints(grid) +b₀ = @. exp(-(X^2 + 4Y^2)) + +SurfaceQG.set_b!(prob, b₀) +nothing # hide + +fig = Figure(resolution = (500, 500)) + +ax = Axis(fig[1, 1], + xlabel = "x", + ylabel = "y", + aspect = 1, + title = "buoyancy bₛ", + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +hm = heatmap!(ax, x, y, Array(vars.b); + colormap = :deep, colorrange = (0, 1)) + +Colorbar(fig[1, 2], hm) + +fig + +B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps) +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps) +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps) +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep. +nothing # hidenothing # hide + +base_filename = string("SurfaceQG_decaying_n_", n) + +datapath = "./" +plotpath = "./" + +dataname = joinpath(datapath, base_filename) +plotname = joinpath(plotpath, base_filename) +nothing # hide + +if !isdir(plotpath); mkdir(plotpath); end +if !isdir(datapath); mkdir(datapath); end +nothing # hide + +get_sol(prob) = prob.sol # extracts the Fourier-transformed solution +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx) + +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u)) +nothing # hide + +b = Observable(Array(vars.b)) + +ke = Observable([Point2f(KE.t[1], KE.data[1])]) +b² = Observable([Point2f(B.t[1], B.data[1])]) + +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t)) + +fig = Figure(resolution = (900, 600)) + +axb = Axis(fig[1:2, 1]; + xlabel = "x", + ylabel = "y", + title = title_b, + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +axE = Axis(fig[1, 2]; + xlabel = "t", + limits = ((0, tf), (0, 2e-2))) + +heatmap!(axb, x, y, b; + colormap = :deep, colorrange = (0, 1)) + +hE = lines!(axE, ke; linewidth = 3) +hb² = lines!(axE, b²; linewidth = 3) + +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"]) + +fig + +startwalltime = time() + +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j + if j % (500 / nsubs) == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", + clock.step, clock.t, cfl, (time()-startwalltime)/60) + + log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e", + B.data[B.i], Dᵇ.data[Dᵇ.i]) + + println(log1) + + println(log2) + end + + b[] = vars.b + + ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i])) + b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i])) + + title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t) + + stepforward!(prob, diags, nsubs) + SurfaceQG.updatevars!(prob) +end +nothing # hide + +fig = Figure(resolution = (800, 380)) + +axis_kwargs = (xlabel = "x", + ylabel = "y", + aspect = 1, + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...) +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...) +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...) + +hb = heatmap!(axb, x, y, Array(vars.b); + colormap = :deep, colorrange = (0, 1)) + +Colorbar(fig[2, 1], hb, vertical = false) + +hu = heatmap!(axu, x, y, Array(vars.u); + colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u)))) + +Colorbar(fig[2, 2], hu, vertical = false) + +hv = heatmap!(axv, x, y, Array(vars.v); + colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v)))) + +Colorbar(fig[2, 3], hv, vertical = false) + +fig + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/surfaceqg_decaying/index.html b/v0.15.2/literated/surfaceqg_decaying/index.html new file mode 100644 index 00000000..fef57627 --- /dev/null +++ b/v0.15.2/literated/surfaceqg_decaying/index.html @@ -0,0 +1,132 @@ + +Decaying Surface QG turbulence · GeophysicalFlows.jl

    Decaying Surface QG turbulence

    This example can be run online via . Also, it can be viewed as a Jupyter notebook via .

    A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 256                       # 2D resolution = n²
    +stepper = "FilteredETDRK4"          # timestepper
    +     dt = 0.03                      # timestep
    +     tf = 60                        # length of time for simulation
    + nsteps = Int(tf / dt)              # total number of time-steps
    + nsubs  = round(Int, nsteps/100)    # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

     L = 2π        # domain size
    + ν = 1e-19     # hyper-viscosity coefficient
    +nν = 4         # hyper-viscosity order

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    We initialize the buoyancy equation with an elliptical vortex.

    X, Y = gridpoints(grid)
    +b₀ = @. exp(-(X^2 + 4Y^2))
    +
    +SurfaceQG.set_b!(prob, b₀)

    Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (500, 500))
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "buoyancy bₛ",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +hm = heatmap!(ax, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +fig

    Diagnostics

    Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

    B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
    +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
    +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
    +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

    base_filename = string("SurfaceQG_decaying_n_", n)
    "SurfaceQG_decaying_n_256"

    We choose folder for outputing .jld2 files and snapshots (.png files).

    datapath = "./"
    +plotpath = "./"
    +
    +dataname = joinpath(datapath, base_filename)
    +plotname = joinpath(plotpath, base_filename)

    Do some basic file management,

    if !isdir(plotpath); mkdir(plotpath); end
    +if !isdir(datapath); mkdir(datapath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.

    b = Observable(Array(vars.b))
    +
    +ke = Observable([Point2f(KE.t[1], KE.data[1])])
    +b² = Observable([Point2f(B.t[1], B.data[1])])
    +
    +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t))
    +
    +fig = Figure(resolution = (900, 600))
    +
    +axb = Axis(fig[1:2, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_b,
    +           aspect = 1,
    +           limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 2];
    +           xlabel = "t",
    +           limits = ((0, tf), (0, 2e-2)))
    +
    +heatmap!(axb, x, y, b;
    +         colormap = :deep, colorrange = (0, 1))
    +
    +hE  = lines!(axE, ke; linewidth = 3)
    +hb² = lines!(axE, b²; linewidth = 3)
    +
    +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
    +
    +fig

    Time-stepping the Problem forward and create animation by updating the plot.

    startwalltime = time()
    +
    +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
    +  if j % (500 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, (time()-startwalltime)/60)
    +
    +    log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e",
    +              B.data[B.i], Dᵇ.data[Dᵇ.i])
    +
    +    println(log1)
    +
    +    println(log2)
    +  end
    +
    +  b[] = vars.b
    +
    +  ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))
    +  b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))
    +
    +  title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SurfaceQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
    +step: 0500, t: 15.0, cfl: 0.588, walltime: 0.10 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 3.97e-11
    +step: 1000, t: 30.0, cfl: 0.571, walltime: 0.20 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.08e-09
    +step: 1500, t: 45.0, cfl: 0.575, walltime: 0.30 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 8.29e-09
    +step: 2000, t: 60.0, cfl: 0.577, walltime: 0.40 min
    +buoyancy variance: 1.82e-02, buoyancy variance dissipation: 9.89e-09

    Let's see how all flow fields look like at the end of the simulation.

    fig = Figure(resolution = (800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +
    +hb = heatmap!(axb, x, y, Array(vars.b);
    +             colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[2, 1], hb, vertical = false)
    +
    +hu = heatmap!(axu, x, y, Array(vars.u);
    +             colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
    +
    +Colorbar(fig[2, 2], hu, vertical = false)
    +
    +hv = heatmap!(axv, x, y, Array(vars.v);
    +             colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
    +
    +Colorbar(fig[2, 3], hv, vertical = false)
    +
    +fig

    Save

    We can save the output at the end of the simulation by calling

    saveoutput(out)

    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/twodnavierstokes_decaying.ipynb b/v0.15.2/literated/twodnavierstokes_decaying.ipynb new file mode 100644 index 00000000..b2211538 --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_decaying.ipynb @@ -0,0 +1,511 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 2D decaying turbulence\n", + "\n", + "\n", + "A simulation of decaying two-dimensional turbulence.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, Printf, Random, CairoMakie\n", + "\n", + "using Random: seed!\n", + "using GeophysicalFlows: peakedisotropicspectrum" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical, domain, and simulation parameters\n", + "\n", + "First, we pick some numerical and physical parameters for our model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "n, L = 128, 2π # grid resolution and domain length\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "Then we pick the time-stepper parameters" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " dt = 1e-2 # timestep\n", + "nsteps = 4000 # total number of steps\n", + " nsubs = 20 # number of steps between each plot\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments.\n", + "We use `stepper = \"FilteredRK4\"`. Filtered timesteppers apply a wavenumber-filter\n", + "at every time-step that removes enstrophy at high wavenumbers and, thereby,\n", + "stabilize the problem, despite that we use the default viscosity coefficient `ν=0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "Next we define some shortcuts for convenience." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\n", + "x, y = grid.x, grid.y\n", + "Lx, Ly = grid.Lx, grid.Ly\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition tries to reproduce the initial condition used by McWilliams (_JFM_, 1984)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "seed!(1234)\n", + "k₀, E₀ = 6, 0.5\n", + "ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\n", + "TwoDNavierStokes.set_ζ!(prob, ζ₀)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Let's plot the initial vorticity field. Note that when plotting, we decorate the variable\n", + "to be plotted with `Array()` to make sure it is brought back on the CPU when `vars` live on\n", + "the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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lpbmdm50C9LpdHV19bZt21599dWZR9ra2goLC7nG+qrjqUqzFj/BIrqJiYmJp556qr29XT0SiUQ0TUulUrmbFN26gYGBoaEhuUPb29s7OjpyOCUlwS2yAAAD00lEQVQyBE9VmrX4CRbRFxscHGxvby8vLz906FCu50K3oqOjY9OmTSdOnGhpaZl55M0339y5c2cymbRa+V2fuYOnKs0e/ASL6Au8/fbba9euTaVSv/nNb3I9F7pFwWBQ0zTZpc7j8WQymUAgkLtJkcF4qtKswgUWkfbxxx9bs5577jn1eG9vb1tb2/bt2x955JHTp0/X1NTkcJL0ZczEccLhsHokFAqZTKaioqLcTYoMw1OVZiF+Nk6krVu37tSpUzPjsrKymcHJkyfb2to2bNhw4cKFurq63M2ODOD1ejVNGx4eVo8MDw+XlZXZbLbcTYqMwVOVZidmsIhuYnp6uqGhYfny5e+++67JZMr1dOjLymQy9fX1W7du/clPfjLzyObNm71e7zvvvJPbidGXxFOVZi1+gkV0E4cPH+7p6XnooYd27dolH9+2bZvT6czVrOiWmUymHTt2vPzyy1u3bl2/fv3u3buPHDmyb9++XM+LviyeqjRrcYFFdBPd3d2apr322mv/7/EHHniAV+2vqB//+Mf9/f133XWXxWIxm80///nP77777lxPir4snqo0a/EWIRHdRiYmJnp7e5uamux2e67nQkRzGRdYRERERAZjmQYiIiIig3GBRURERGQwLrCIiIiIDMYFFhEREZHBuMAiIiIiMhgXWEREREQG4wKLiIiIyGBcYBEREREZjAssIiIiIoNxgUVERERkMC6wiIiIiAzGBRYRzX3nzp176623ksnkzD/D4fCePXv6+vpyOysimsPY7JmI5j6fz9fc3PzEE0+88sormqbt3Lnz0KFDnZ2dTqcz11MjormJCywiui28//773/3udz/99NNgMHj//fd3dHS0trbmelJENGdxgUVEt4vt27cfP348Eok8+eSTzz//fK6nQ0RzGRdYRHS7CIVCdXV1ZWVl58+ft1gsuZ4OEc1lDLkT0e1i//79kUikp6fn2LFjuZ4LEc1x/ASLiG4Lo6Ojzc3Nzz777IkTJ44ePXr69Gkm3Inob4cLLCK6LWzZssXv9x88eDAUCjU1NT388MOvvfZaridFRHMWbxES0dy3a9euvXv37t6922w2FxcX/+IXv/jpT3965MiRXM+LiOYsfoJFREREZDB+gkVERERkMC6wiIiIiAzGBRYRERGRwbjAIiIiIjIYF1hEREREBuMCi4iIiMhgXGARERERGYwLLCIiIiKDcYFFREREZDAusIiIiIgMxgUWERERkcG4wCIiIiIyGBdYRERERAbjAouIiIjIYFxgERERERmMCywiIiIig3GBRURERGSw/wNgyuPXJB9fjAAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "fig = Figure()\n", + "ax = Axis(fig[1, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = \"initial vorticity\",\n", + " aspect = 1,\n", + " limits = ((-L/2, L/2), (-L/2, L/2)))\n", + "\n", + "heatmap!(ax, x, y, Array(vars.ζ');\n", + " colormap = :balance, colorrange = (-40, 40))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics -- `energy` and `enstrophy` functions are imported at the top." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\n", + "Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\n", + "diags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "## Output" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We choose folder for outputing `.jld2` files and snapshots (`.png` files)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "filepath = \".\"\n", + "plotpath = \"./plots_decayingTwoDNavierStokes\"\n", + "plotname = \"snapshots\"\n", + "filename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "Do some basic file management" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if isfile(filename); rm(filename); end\n", + "if !isdir(plotpath); mkdir(plotpath); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "And then create Output" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n", + "get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n", + "\n", + "out = Output(prob, filename, (:sol, get_sol), (:u, get_u))\n", + "saveproblem(out)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We initialize a plot with the vorticity field and the time-series of\n", + "energy and enstrophy diagnostics." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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CCGEEKLA9CV9GMJFLpPJHD58eO/evclk0u12K4pS7IhmVm9v7549e5xOZ6kfsPrhXWqPeKaV7hA6efLk6dOn1V7205VERucfxiWRQiwW279//6FDh9CObJquJFKY7vDhw/39/Q0NDdMvllwWgpyYGX19fcuWLQPUg9iuuuqq/v7+Ygc1U+Lx+IYNGwD1gNtvfOMbxY7oo3BJPeKZVupDaMOGDf/6r/86/UqpZHSeYVwqKezevbupqUmv16sp3HbbbYlEQn2rVFKYbnR01O12b9y4MX+lFLMQuVxOJlgz5eabb25paenp6cnlct3d3a2trevWrSt2UDPl61//utPp3LlzZyaTeeaZZxRFefnll4sd1Iy7pB7xTCvRIRSJRLq6uh588EHgnAlWqWR0nmFcEilks9mOjo7rr7/e5/PlcrnXX3/daDQ+/vjj6rslkcJ02Wz2xhtvBKZPsEouC6GSCdaMiEajOp3uhz/8Yf7Ks88+C0xOThYxqhmSTqfr6uq++tWv5q9cd911GzZsKGJIH4FL6hHPtNIdQr/85S+rqqqqqqp0Ot30CVapZHSeYVwqKQwMDACvvfZa/kpnZ+cnPvGJXOk8hekee+yx9vb2xYsX5ydYpZiFUMki9xkRDAYfeOCB9evX569EIhEgnU4XL6iZMjg4ODY2Nj3Z9evX79y5s4ghfQQuqUc800p3CN11112Tk5OTk5MtLS3Tr5dKRucZxqWSgtPpfOmll1avXq2+zGazExMTra2tlM5TyNu3b9+jjz76i1/8wm635y+WXBYiT84inBEej+fJJ5/MvxweHv7BD36wbt06j8dTxKhmyPj4ODA9tdraWq/Xm06nDYZZO8AuqUc802bfECqVjM4zjNW/wi/+FCorKz/96U8Du3btevXVV7dt22axWL70pS9ROk9BFQ6H77777kceeWTlypXTr5dWFmI6qWDNuBdeeOGqq65Kp9M///nPix3LjPD7/YDT6cxfcTqduVzO5/MVL6iP1Kx/xDNt9g2hUszonGFccikMDQ3t2LHjxIkTer1ercOVVgoPPvhgQ0PDQw89dM710spCTCcTrMLYtm2bQfPwww+rF3t7ezs7O++999677777nXfemTt3bnGDnCHqpuhQKJS/EggEFEVRd/TMbpfII55ps28IlVZGf3UYl1YKwB133LF9+/ahoSGz2ayev15CKbz00ku/+93vfvazn+l05/6lXEJZiHNIgbEwVq1apbZgAdxuN3Dw4MHOzs41a9YcO3bsnPUZs4za+0etY6vGx8fdbrfRaCxeUB+FS+cRz7TZN4RKKKO/NYxLJYWDBw/u3bt306ZN6ku73X7PPfd88YtfjMfjpZIC0NXV5fP5mpub1ZeZTGbPnj0vvPDCb37zm6VLl1IiWYhzSAWrMOx2+2KNx+PJZrN33HHH+vXr//jHP876v3qbmppaWlq2bt2av7J169Zrr722iCF9BC6pRzzTZt8QKpWMzjOMSyWFwcHBzZs3j46O5q+Mjo7a7XaLxVIqKQCf//zn//CHP7yqURtPvPrqq6tXry6hLMQ5pII1I3bs2NHT07Nhw4af/vSn069v3LjRarUWK6oZoijKpk2bvvOd79x+++2rV69+9tlnu7q6pv9xMCtdUo94ps2+IVQqGZ1/GJdECp2dnTU1Nffff/8TTzzh8Xi2bdu2ZcuWjRs3UjpPAejo6Ojo6Mi//Na3vlVXV3fzzTerL0slC3GuYvaImL2eeuqpv/ppj42NFTu0GZHJZDZv3qzT6YxGo9lsnt5WZ7a61B7xTCv1IdTW1nZOo9GSyOj8w7gkUsjlctu2bcsvf1QU5b777guHw+pbpZLCOVatWjW90WiJZiGUXC5XkImaEMFgsLe3d+HChWazudixiJI0+4bQLMioJFJIp9N9fX2hUGjevHllZWXnvFsSKXyg2ZHFJUUmWEIIIYQQBSaL3IUQQgghCkwmWEIIIYQQBSYTLCGEEEKIApMJlhBCCCFEgckESwghhBCiwGSCJYQQQghRYDLBEkIIIYQoMJlgCSGEEEIUmEywhBBCCCEKTCZYQggh/pvvf//73/ve94odhRClzVDsAIQQQlxc9u3bFw6Hix2FEKVNKliiAI4ePfr8888nk0n1ZSgUeu655/r6+ooblRDiAvz+97/v6+sbGhp67rnn8r+phRB/L5lgiQLweDxf+9rXHn30UfXlV7/61ccff7yurq64UQkhLsAbb7wxNDQ0Ojr6q1/9KpVKFTscIUqVksvlih2DmA1eeeWVT33qU2+//bbf77/11lt37ty5YsWKYgclhLgQ99xzTzgcfvnll4sdiBAlTNZgicLYsGHDxo0bP/vZz0YikUceeURmV0IIIS5l8l+EomC2bNkyNjZmNpu//vWvFzsWIYQQophkgiUK5o033ohEIj09Pbt37y52LEIIIUQxyQRLFMbZs2c3bdr02GOPbdy48d57743FYsWOSAghhCgamWCJwnjggQfmz5//pS99acuWLaFQ6OGHHy52REKIC6TX60dHRycmJmQXlBAXTCZYogB++tOfvv76688++6xOp3O5XD/60Y+2bNnS1dVV7LiEEBfi9ttvP3r0aE1NTSAQKHYsQpQqadMghBDiXIlEIhqNulyuYgciRKmSCZYQQgghRIHJfxEKIYQQQhSYTLCEEEIIIQpMJlhCCCGEEAUmEywhhBBCiAKTCZYQQgghRIHJBEsIIYQQosBkgiWEEEIIUWAywRJCCCGEKDCZYAkhhBBCFJhMsIQQQgghCkwmWEIIIYQQBSYTLCGEEEKIApMJlhBCCCFEgckESwghhBCiwGSCJYQQQghRYDLBEkIIIYQosP8Ht5f5oZl/+04AAAAASUVORK5CYII=" + }, + "metadata": {}, + "execution_count": 13 + } + ], + "cell_type": "code", + "source": [ + "ζ = Observable(Array(vars.ζ))\n", + "title_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n", + "\n", + "energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\n", + "enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n", + "\n", + "fig = Figure(resolution = (800, 360))\n", + "\n", + "axζ = Axis(fig[1, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = title_ζ,\n", + " aspect = 1,\n", + " limits = ((-L/2, L/2), (-L/2, L/2)))\n", + "\n", + "ax2 = Axis(fig[1, 2],\n", + " xlabel = \"t\",\n", + " limits = ((-0.5, 40.5), (0, 1.05)))\n", + "\n", + "heatmap!(axζ, x, y, ζ;\n", + " colormap = :balance, colorrange = (-40, 40))\n", + "\n", + "hE = lines!(ax2, energy; linewidth = 3)\n", + "hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\n", + "Legend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We time-step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0, cfl: 0.47, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.05 min\n", + "step: 1000, t: 10, cfl: 0.38, ΔE: 0.9687, ΔZ: 0.1880, walltime: 0.15 min\n", + "step: 2000, t: 20, cfl: 0.34, ΔE: 0.9655, ΔZ: 0.1084, walltime: 0.20 min\n", + "step: 3000, t: 30, cfl: 0.51, ΔE: 0.9645, ΔZ: 0.0831, walltime: 0.26 min\n", + "step: 4000, t: 40, cfl: 0.46, ΔE: 0.9642, ΔZ: 0.0734, walltime: 0.31 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "record(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n", + " if j % (1000 / nsubs) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + " end\n", + "\n", + " ζ[] = vars.ζ\n", + "\n", + " energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n", + " enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n", + "\n", + " title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " TwoDNavierStokes.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "![](twodturb.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Radial energy spectrum" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "After the simulation is done we plot the instantaneous radial energy spectrum to illustrate\n", + "how `FourierFlows.radialspectrum` can be used," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\n", + "Eh = rfft(E) # Fourier transform of energy density\n", + "\n", + "# compute radial specturm of `Eh`\n", + "kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 15 + }, + { + "cell_type": "markdown", + "source": [ + "and we plot it." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "FigureAxisPlot()", + "image/png": "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" + }, + "metadata": {}, + "execution_count": 16 + } + ], + "cell_type": "code", + "source": [ + "lines(kr, vec(abs.(Ehr));\n", + " linewidth = 2,\n", + " axis = (xlabel = L\"k_r\",\n", + " ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n", + " xscale = log10,\n", + " yscale = log10,\n", + " title = \"Radial energy spectrum\",\n", + " limits = ((0.3, 1e2), (1e0, 1e5))))" + ], + "metadata": {}, + "execution_count": 16 + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/twodnavierstokes_decaying.jl b/v0.15.2/literated/twodnavierstokes_decaying.jl new file mode 100644 index 00000000..14ec3e12 --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_decaying.jl @@ -0,0 +1,135 @@ +using GeophysicalFlows, Printf, Random, CairoMakie + +using Random: seed! +using GeophysicalFlows: peakedisotropicspectrum + +dev = CPU() # Device (CPU/GPU) +nothing # hide + +n, L = 128, 2π # grid resolution and domain length +nothing # hide + + dt = 1e-2 # timestep +nsteps = 4000 # total number of steps + nsubs = 20 # number of steps between each plot +nothing # hide + +prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4") +nothing # hide + +sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid +x, y = grid.x, grid.y +Lx, Ly = grid.Lx, grid.Ly +nothing # hide + +seed!(1234) +k₀, E₀ = 6, 0.5 +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter) +TwoDNavierStokes.set_ζ!(prob, ζ₀) +nothing # hide + +fig = Figure() +ax = Axis(fig[1, 1]; + xlabel = "x", + ylabel = "y", + title = "initial vorticity", + aspect = 1, + limits = ((-L/2, L/2), (-L/2, L/2))) + +heatmap!(ax, x, y, Array(vars.ζ'); + colormap = :balance, colorrange = (-40, 40)) + +fig + +E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will be updated every timestep. +nothing # hide + +filepath = "." +plotpath = "./plots_decayingTwoDNavierStokes" +plotname = "snapshots" +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2") +nothing # hide + +if isfile(filename); rm(filename); end +if !isdir(plotpath); mkdir(plotpath); end +nothing # hide + +get_sol(prob) = prob.sol # extracts the Fourier-transformed solution +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx) + +out = Output(prob, filename, (:sol, get_sol), (:u, get_u)) +saveproblem(out) +nothing # hide + +ζ = Observable(Array(vars.ζ)) +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t)) + +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])]) +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])]) + +fig = Figure(resolution = (800, 360)) + +axζ = Axis(fig[1, 1]; + xlabel = "x", + ylabel = "y", + title = title_ζ, + aspect = 1, + limits = ((-L/2, L/2), (-L/2, L/2))) + +ax2 = Axis(fig[1, 2], + xlabel = "t", + limits = ((-0.5, 40.5), (0, 1.05))) + +heatmap!(axζ, x, y, ζ; + colormap = :balance, colorrange = (-40, 40)) + +hE = lines!(ax2, energy; linewidth = 3) +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red) +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"]) + +fig + +startwalltime = time() + +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j + if j % (1000 / nsubs) == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60) + + println(log) + end + + ζ[] = vars.ζ + + energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1])) + enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1])) + + title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t) + + stepforward!(prob, diags, nsubs) + TwoDNavierStokes.updatevars!(prob) +end +nothing # hide + +E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density +Eh = rfft(E) # Fourier transform of energy density + +# compute radial specturm of `Eh` +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1) +nothing # hide + +lines(kr, vec(abs.(Ehr)); + linewidth = 2, + axis = (xlabel = L"k_r", + ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta", + xscale = log10, + yscale = log10, + title = "Radial energy spectrum", + limits = ((0.3, 1e2), (1e0, 1e5)))) + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/twodnavierstokes_decaying/index.html b/v0.15.2/literated/twodnavierstokes_decaying/index.html new file mode 100644 index 00000000..1d8126d2 --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_decaying/index.html @@ -0,0 +1,96 @@ + +2D decaying turbulence · GeophysicalFlows.jl

    2D decaying turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of decaying two-dimensional turbulence.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using Random: seed!
    +using GeophysicalFlows: peakedisotropicspectrum

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length

    Then we pick the time-stepper parameters

        dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

    Next we define some shortcuts for convenience.

    sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
    +TwoDNavierStokes.set_ζ!(prob, ζ₀)

    Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "initial vorticity",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ');
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
    +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingTwoDNavierStokes"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    +saveproblem(out)

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t))
    +
    +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])
    +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "t",
    +           limits = ((-0.5, 40.5), (0, 1.05)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
    +
    +fig

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min",
    +        clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))
    +  enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))
    +
    +  title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.47, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.00 min
    +step: 1000, t: 10, cfl: 0.38, ΔE: 0.9687, ΔZ: 0.1880, walltime: 0.06 min
    +step: 2000, t: 20, cfl: 0.34, ΔE: 0.9655, ΔZ: 0.1084, walltime: 0.11 min
    +step: 3000, t: 30, cfl: 0.51, ΔE: 0.9645, ΔZ: 0.0831, walltime: 0.16 min
    +step: 4000, t: 40, cfl: 0.46, ΔE: 0.9642, ΔZ: 0.0734, walltime: 0.21 min

    Radial energy spectrum

    After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

    E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
    +Eh = rfft(E)                         # Fourier transform of energy density
    +
    +# compute radial specturm of `Eh`
    +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)

    and we plot it.

    lines(kr, vec(abs.(Ehr));
    +      linewidth = 2,
    +      axis = (xlabel = L"k_r",
    +              ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta",
    +              xscale = log10,
    +              yscale = log10,
    +              title = "Radial energy spectrum",
    +              limits = ((0.3, 1e2), (1e0, 1e5))))

    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/twodnavierstokes_stochasticforcing.ipynb b/v0.15.2/literated/twodnavierstokes_stochasticforcing.ipynb new file mode 100644 index 00000000..4b140bd6 --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_stochasticforcing.ipynb @@ -0,0 +1,462 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 2D forced-dissipative turbulence\n", + "\n", + "\n", + "A simulation of forced-dissipative two-dimensional turbulence. We solve the\n", + "two-dimensional vorticity equation with stochastic excitation and dissipation in\n", + "the form of linear drag and hyperviscosity.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CUDA, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n", + "\n", + "parsevalsum = FourierFlows.parsevalsum\n", + "record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical, domain, and simulation parameters\n", + "\n", + "First, we pick some numerical and physical parameters for our model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n, L = 256, 2π # grid resolution and domain length\n", + " ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n", + " μ, nμ = 1e-1, 0 # linear drag coefficient\n", + " dt = 0.005 # timestep\n", + "nsteps = 4000 # total number of steps\n", + " nsubs = 20 # number of steps between each plot\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Forcing" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We force the vorticity equation with stochastic excitation that is delta-correlated in time\n", + "and while spatially homogeneously and isotropically correlated. The forcing has a spectrum\n", + "with power in a ring in wavenumber space of radius $k_f$ (`forcing_wavenumber`) and width\n", + "$δ_f$ (`forcing_bandwidth`), and it injects energy per unit area and per unit time\n", + "equal to $\\varepsilon$. That is, the forcing covariance spectrum is proportional to\n", + "$\\exp{[-(|\\bm{k}| - k_f)^2 / (2 δ_f^2)]}$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\n", + "forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\n", + "ε = 0.1 # energy input rate by the forcing\n", + "\n", + "grid = TwoDGrid(dev; nx=n, Lx=L)\n", + "\n", + "K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n", + "\n", + "forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n", + "@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n", + "\n", + "ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n", + "@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "We reset of the random number generator for reproducibility" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "Next we construct function `calcF!` that computes a forcing realization every timestep.\n", + "First we make sure that if `dev=GPU()`, then `CUDA.rand()` function is called for random\n", + "numbers uniformly distributed between 0 and 1." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "random_uniform = dev==CPU() ? rand : CUDA.rand\n", + "\n", + "function calcF!(Fh, sol, t, clock, vars, params, grid)\n", + " T = eltype(grid)\n", + " @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n", + "\n", + " return nothing\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments. The\n", + "`stepper` keyword defines the time-stepper to be used." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n", + " calcF=calcF!, stochastic=true)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Define some shortcuts for convenience." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "\n", + "x, y = grid.x, grid.y\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "First let's see how a forcing realization looks like. Function `calcF!()` computes\n", + "the forcing in Fourier space and saves it into variable `vars.Fh`, so we first need to\n", + "go back to physical space." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Note that when plotting, we decorate the variable to be plotted with `Array()` to make sure\n", + "it is brought back on the CPU when the variable lives on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOy9aZBdV3nv/dvzmcee1d2SWoMlWbIlLMsyyBjwNeG+kARDSEjsF0wooN5g3gxvqhJIAlXJrSJJhYIPTrgMRWHGF3KxgyEEjAFf2yALT7Jkta2pJXWrW919uvvM0x7vh3X26ZYsy7JpIrh3/T6cah3tvc7aa6/TvdZ//5/nUYIgQCKRSCQSiUSyeqhXugMSiUQikUgk/7shF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIXiFBEHz2s599z3ve86EPfWh1W7766qt7enruu+++1W12tXjve9/7zne+84knnuCX0NVf8WuXSCSXiVxgSSSSV8jXv/71D3zgA1/84he//vWvr27Li4uLi4uL7XZ7dZtdLb71rW994xvfOHv2LKvR1Y985CN79+791Kc+Jf75K37tEonkMtGvdAckEsmvK08//TSwb9++73//+6vb8uc///lWq7V3797VbfaXwS/e1WPHjh04cKDbwq/RtUskkksgF1gSieRCGo3GZz/72UceeWRpaWlwcPBtb3vb7/zO71xwzNe+9rUDBw4A5XL505/+9J//+Z+L95977rnPfe5z4+PjqVTquuuu+9CHPhSLxYA77rgD+OhHP/r4449/73vf++pXvyqO379//5e//OVjx44NDg6+4x3v+K3f+i3gO9/5Tr1eX79+/fDwcPfcv/7rv/7BD37w4IMPRiKRO++8881vfnO3Mz/+8Y/vueeeer1+5513ep73r//6rzfeeOMHP/jBC/p80T7cd999999///T09Pbt29///vdv2bLl8gfhgq4+9NBDn//85y844K677tq7d++Ltfa1r33t2LFjwFNPPfWlL33pXe961wXX/pJDeolhkUgkV5JAIpFIVuB53i233HLBL4pPfOITFxx2ww03vPA3yTe/+U3Lsla+PzY2Njc3FwSB+Ocf/dEfAfl8Xhz/mc98RlXPMyp87GMfC4IgnU4D9913nzhM/NeuXbtWHvnAAw+I//3Sl77UbUTTNNGx3/u933vhpb2wD3/2Z38m3hQtxOPxBx988CUHYWX3Vv78uc997oW/Y7/+9a9forWVw3jttde+8NpfckhfbFgkEsmVRS6wJBLJeTz++ONipfLAAw/Mzs6K5ch11113wWHtdvuuu+4CbrvttmazGQRBuVzu7e0Fbr/99qmpqQMHDoyNjQHvfe97g3A1EIlE3v72t3/yk58MgmBhYUEsJj72sY/NzMx84hOfEJ9bKBQuusC66qqrvvWtb/37v//74OAgcOeddwZBUK1WxYe++93vHh8f/9SnPqUoyqUXWN0+HDx4UFEURVHuv//+UqkkFK9t27Z5nnfpQXixBdbS0tLhw4cPHz586NAhsXLK5XITExOXaK3dbt92223AXXfd1W63L2jwcob0osMikUiuOPIRoUQiOY/169fv378/Go1u3rz5yJEjS0tLwMLCwgWHmaapaRqgqmokEgEOHDhQKBRisdinP/3pZDI5PDz8t3/7t3fcccd3v/vd7ll//Md//Pd///fi5/3795fL5Xw+/zd/8zeapv3pn/7pzMxMrVYrFAoX7diHP/zht73tbcBb3/rWT3/608Jj/uijjxYKhUQi8c///M/xeHzr1q0/+clPvv3tb1/iArt9+PjHPx4EwY4dOwYHB48fP/7mN7/5X/7lX8bHx5999tnLHIQLyGaz2WwW+MhHPnLgwAHTNO+9997169enUqkXa800TSGeaZpmmuYFDV7OkF50WCQSyRVHLrAkEsl55PP5+++//+677z548KDv+0IQuhxOnjwJrFu3LplMind27NgBzM3N1Wo18c4b3/jG7vGnTp0CRkdHxUJNUZR/+qd/ukT7GzZsED/kcjkgCILuh46NjcXjcfG/119//aUXWN0+iHMPHz58/fXXrzzgxIkT11xzzSsbBOCee+75+Mc/DnzmM5+5+eab+SUP6UWHRSKRXHHkAksikZzH97///T/8wz80TfMjH/nIrbfe+uSTT3aNSpemp6cHWFxc7L4jfo5Go8KUDawUaYTYUyqVfpHeJhIJoFwud98R+tAl6PYhlUoBt9xyS9ehL9ix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" + }, + "metadata": {}, + "execution_count": 9 + } + ], + "cell_type": "code", + "source": [ + "calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n", + "\n", + "fig = Figure()\n", + "\n", + "ax = Axis(fig[1, 1],\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " title = \"a forcing realization\",\n", + " limits = ((-L/2, L/2), (-L/2, L/2)))\n", + "\n", + "heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n", + " colormap = :balance, colorrange = (-200, 200))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition is a fluid at rest." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics; the diagnostics are aimed to probe the energy budget." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\n", + "Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\n", + "diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "## Visualizing the simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We initialize a plot with the vorticity field and the time-series of\n", + "energy and enstrophy diagnostics. To plot energy and enstrophy on the\n", + "same axes we scale enstrophy with $k_f^2$." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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+wIAoO5hBgsAAEBmzGABAADIjIAFAAAgMwIWAACAzAhYAGACa9asWblypam7AFBbLE3dAAA8jS5cuJCbm2vqLgDUFmawAEA2ERERV69e1T68efPmvn37ypcdOXLkzp07P/300/bt24uLi43YIAAjIWABgGzeeeedr7/+WvswMjJyzpw55ctOnTr1008/3b9/Pzw8vKSkxIgNAjASThECgLGtXr06LS0tNzf34MGDpu4FQK1gBgsAAEBmBCwAAACZEbAAAABkRsACADlFRkZqfz5x4oQJOwFgQgQsAJDT6dOn//3vf2dkZHz++ee63yjUY2Fhcf/+/YcPH2o0GmO2B8A4FPy/DQBy6dSpU4sWLf773/8+evTIycnJz8/v0qVLqamp5SsPHjw4bty4/Pz8jIwMJycn47cKoFZxmQYAkJOfn9/hw4fv3Lnj4eHRoEGDyspGjhz566+/5ufnk66AeomABQAys7S0bNu27WPLrK2tra2tjdAPAONjDRYAAIDMCFgAIJuAgIB27dqZugsApscidwAAAJkxgwUAACAzAhYAAIDMCFgAAAAyI2ABAADIjIAFAAAgMwIWAACAzAhYAAAAMiNgAQAAyIyABQAAIDMCFgAAgMwIWAAAADIjYAEAAMiMgAUAACCz/wOPlq2CmXRS1QAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 12 + } + ], + "cell_type": "code", + "source": [ + "ζ = Observable(Array(vars.ζ))\n", + "title_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n", + "\n", + "energy = Observable(Point2f[(μ * E.t[1], E.data[1])])\n", + "enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n", + "\n", + "fig = Figure(resolution = (800, 360))\n", + "\n", + "axζ = Axis(fig[1, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = title_ζ,\n", + " aspect = 1,\n", + " limits = ((-L/2, L/2), (-L/2, L/2)))\n", + "\n", + "ax2 = Axis(fig[1, 2],\n", + " xlabel = \"μ t\",\n", + " limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n", + "\n", + "heatmap!(axζ, x, y, ζ;\n", + " colormap = :balance, colorrange = (-40, 40))\n", + "\n", + "hE = lines!(ax2, energy; linewidth = 3)\n", + "hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\n", + "Legend(fig[1, 3], [hE, hZ], [\"energy E(t)\" \"enstrophy Z(t) / k_f²\"])\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min\n", + "step: 1000, t: 5, cfl: 0.45, E: 0.2882, Z: 35.0456, walltime: 0.22 min\n", + "step: 2000, t: 10, cfl: 0.48, E: 0.4036, Z: 37.3022, walltime: 0.42 min\n", + "step: 3000, t: 15, cfl: 0.50, E: 0.4495, Z: 37.5154, walltime: 0.62 min\n", + "step: 4000, t: 20, cfl: 0.53, E: 0.4702, Z: 37.7583, walltime: 0.81 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "\n", + "record(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n", + " if j % (1000/nsubs) == 0\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n", + " clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n", + " println(log)\n", + " end\n", + "\n", + " ζ[] = vars.ζ\n", + "\n", + " energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n", + " enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n", + "\n", + " title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n", + "\n", + " stepforward!(prob, diags, nsubs)\n", + " TwoDNavierStokes.updatevars!(prob)\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "![](twodturb_forced.mp4)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/twodnavierstokes_stochasticforcing.jl b/v0.15.2/literated/twodnavierstokes_stochasticforcing.jl new file mode 100644 index 00000000..0e2bc9eb --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_stochasticforcing.jl @@ -0,0 +1,130 @@ +using GeophysicalFlows, CUDA, Random, Printf, CairoMakie + +parsevalsum = FourierFlows.parsevalsum +record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record +nothing # hide + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n, L = 256, 2π # grid resolution and domain length + ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order + μ, nμ = 1e-1, 0 # linear drag coefficient + dt = 0.005 # timestep +nsteps = 4000 # total number of steps + nsubs = 20 # number of steps between each plot +nothing # hide + +forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space +forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f` +ε = 0.1 # energy input rate by the forcing + +grid = TwoDGrid(dev; nx=n, Lx=L) + +K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber + +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2)) +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average + +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly) +@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε +nothing # hide + +if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end +nothing # hide + +random_uniform = dev==CPU() ? rand : CUDA.rand + +function calcF!(Fh, sol, t, clock, vars, params, grid) + T = eltype(grid) + @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt) + + return nothing +end +nothing # hide + +prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4", + calcF=calcF!, stochastic=true) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid + +x, y = grid.x, grid.y +nothing # hide + +calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid) + +fig = Figure() + +ax = Axis(fig[1, 1], + xlabel = "x", + ylabel = "y", + aspect = 1, + title = "a forcing realization", + limits = ((-L/2, L/2), (-L/2, L/2))) + +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx)); + colormap = :balance, colorrange = (-200, 200)) + +fig + +TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny))) + +E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep. +nothing # hide + +ζ = Observable(Array(vars.ζ)) +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)) + +energy = Observable(Point2f[(μ * E.t[1], E.data[1])]) +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)]) + +fig = Figure(resolution = (800, 360)) + +axζ = Axis(fig[1, 1]; + xlabel = "x", + ylabel = "y", + title = title_ζ, + aspect = 1, + limits = ((-L/2, L/2), (-L/2, L/2))) + +ax2 = Axis(fig[1, 2], + xlabel = "μ t", + limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55))) + +heatmap!(axζ, x, y, ζ; + colormap = :balance, colorrange = (-40, 40)) + +hE = lines!(ax2, energy; linewidth = 3) +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red) +Legend(fig[1, 3], [hE, hZ], ["energy E(t)" "enstrophy Z(t) / k_f²"]) + +fig + +startwalltime = time() + +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j + if j % (1000/nsubs) == 0 + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min", + clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60) + println(log) + end + + ζ[] = vars.ζ + + energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i])) + enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2)) + + title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t) + + stepforward!(prob, diags, nsubs) + TwoDNavierStokes.updatevars!(prob) +end +nothing # hide + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/twodnavierstokes_stochasticforcing/index.html b/v0.15.2/literated/twodnavierstokes_stochasticforcing/index.html new file mode 100644 index 00000000..5c8994e2 --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_stochasticforcing/index.html @@ -0,0 +1,99 @@ + +2D forced-dissipative turbulence · GeophysicalFlows.jl

    2D forced-dissipative turbulence

    This example can be viewed as a Jupyter notebook via .

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π             # grid resolution and domain length
    + ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0             # linear drag coefficient
    +    dt = 0.005               # timestep
    +nsteps = 4000                # total number of steps
    + nsubs = 20                  # number of steps between each plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x, y = grid.x, grid.y

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy budget.

    E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
    +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
    +
    +energy = Observable(Point2f[(μ * E.t[1], E.data[1])])
    +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "μ t",
    +           limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["energy E(t)" "enstrophy Z(t) / k_f²"])
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
    +  if j % (1000/nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))
    +
    +  title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
    +step: 1000, t: 5, cfl: 0.45, E: 0.2882, Z: 35.0456, walltime: 0.20 min
    +step: 2000, t: 10, cfl: 0.48, E: 0.4036, Z: 37.3022, walltime: 0.40 min
    +step: 3000, t: 15, cfl: 0.50, E: 0.4495, Z: 37.5154, walltime: 0.60 min
    +step: 4000, t: 20, cfl: 0.53, E: 0.4702, Z: 37.7583, walltime: 0.79 min


    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets.ipynb b/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets.ipynb new file mode 100644 index 00000000..ab1c158c --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets.ipynb @@ -0,0 +1,533 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 2D forced-dissipative turbulence budgets\n", + "\n", + "\n", + "A simulation of forced-dissipative two-dimensional turbulence. We solve the\n", + "two-dimensional vorticity equation with stochastic excitation and dissipation in\n", + "the form of linear drag and hyperviscosity. As a demonstration, we compute how\n", + "each of the forcing and dissipation terms contribute to the energy and the\n", + "enstrophy budgets.\n", + "\n", + "## Install dependencies\n", + "\n", + "First let's make sure we have all required packages installed." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "using Pkg\n", + "pkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Let's begin\n", + "Let's load `GeophysicalFlows.jl` and some other packages we need." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n", + "\n", + "parsevalsum = FourierFlows.parsevalsum\n", + "record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## Choosing a device: CPU or GPU" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dev = CPU() # Device (CPU/GPU)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "## Numerical, domain, and simulation parameters\n", + "\n", + "First, we pick some numerical and physical parameters for our model." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + " n, L = 256, 2π # grid resolution and domain length\n", + " ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n", + " μ, nμ = 1e-1, 0 # linear drag coefficient\n", + "dt, tf = 0.005, 0.2 / μ # timestep and final time\n", + " nt = round(Int, tf / dt) # total timesteps\n", + " ns = 4 # how many intermediate times we want to plot\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "## Forcing" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We force the vorticity equation with stochastic excitation that is delta-correlated in time\n", + "and while spatially homogeneously and isotropically correlated. The forcing has a spectrum\n", + "with power in a ring in wavenumber space of radius $k_f$ (`forcing_wavenumber`) and width\n", + "$δ_f$ (`forcing_bandwidth`), and it injects energy per unit area and per unit time\n", + "equal to $\\varepsilon$. That is, the forcing covariance spectrum is proportional to\n", + "$\\exp{[-(|\\bm{k}| - k_f)^2 / (2 δ_f^2)]}$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\n", + "forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\n", + "ε = 0.1 # energy input rate by the forcing\n", + "\n", + "grid = TwoDGrid(dev; nx=n, Lx=L)\n", + "\n", + "K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n", + "\n", + "forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n", + "@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n", + "\n", + "ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n", + "@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "We reset of the random number generator for reproducibility" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "Next we construct function `calcF!` that computes a forcing realization every timestep.\n", + "First we make sure that if `dev=GPU()`, then `CUDA.rand()` function is called for random\n", + "numbers uniformly distributed between 0 and 1." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "random_uniform = dev==CPU() ? rand : CUDA.rand\n", + "\n", + "function calcF!(Fh, sol, t, clock, vars, params, grid)\n", + " T = eltype(grid)\n", + " @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n", + "\n", + " return nothing\n", + "end\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "## Problem setup\n", + "We initialize a `Problem` by providing a set of keyword arguments. The\n", + "`stepper` keyword defines the time-stepper to be used." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n", + " calcF=calcF!, stochastic=true)\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "Define some shortcuts for convenience." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "\n", + "x, y = grid.x, grid.y\n", + "Lx, Ly = grid.Lx, grid.Ly\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "First let's see how a forcing realization looks like. Function `calcF!()` computes\n", + "the forcing in Fourier space and saves it into variable `vars.Fh`, so we first need to\n", + "go back to physical space.\n", + "\n", + "Note that when plotting, we decorate the variable to be plotted with `Array()` to make sure\n", + "it is brought back on the CPU when the variable lives on the GPU." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOy9aZBdV3nv/dvzmcee1d2SWoMlWbIlLMsyyBjwNeG+kARDSEjsF0wooN5g3gxvqhJIAlXJrSJJhYIPTrgMRWHGF3KxgyEEjAFf2yALT7Jkta2pJXWrW919uvvM0x7vh3X26ZYsy7JpIrh3/T6cah3tvc7aa6/TvdZ//5/nUYIgQCKRSCQSiUSyeqhXugMSiUQikUgk/7shF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIJBKJRLLKyAWWRCKRSCQSySojF1gSiUQikUgkq4xcYEkkEolEIpGsMnKBJZFIXiFBEHz2s599z3ve86EPfWh1W7766qt7enruu+++1W12tXjve9/7zne+84knnuCX0NVf8WuXSCSXiVxgSSSSV8jXv/71D3zgA1/84he//vWvr27Li4uLi4uL7XZ7dZtdLb71rW994xvfOHv2LKvR1Y985CN79+791Kc+Jf75K37tEonkMtGvdAckEsmvK08//TSwb9++73//+6vb8uc///lWq7V3797VbfaXwS/e1WPHjh04cKDbwq/RtUskkksgF1gSieRCGo3GZz/72UceeWRpaWlwcPBtb3vb7/zO71xwzNe+9rUDBw4A5XL505/+9J//+Z+L95977rnPfe5z4+PjqVTquuuu+9CHPhSLxYA77rgD+OhHP/r4449/73vf++pXvyqO379//5e//OVjx44NDg6+4x3v+K3f+i3gO9/5Tr1eX79+/fDwcPfcv/7rv/7BD37w4IMPRiKRO++8881vfnO3Mz/+8Y/vueeeer1+5513ep73r//6rzfeeOMHP/jBC/p80T7cd999999///T09Pbt29///vdv2bLl8gfhgq4+9NBDn//85y844K677tq7d++Ltfa1r33t2LFjwFNPPfWlL33pXe961wXX/pJDeolhkUgkV5JAIpFIVuB53i233HLBL4pPfOITFxx2ww03vPA3yTe/+U3Lsla+PzY2Njc3FwSB+Ocf/dEfAfl8Xhz/mc98RlXPMyp87GMfC4IgnU4D9913nzhM/NeuXbtWHvnAAw+I//3Sl77UbUTTNNGx3/u933vhpb2wD3/2Z38m3hQtxOPxBx988CUHYWX3Vv78uc997oW/Y7/+9a9forWVw3jttde+8NpfckhfbFgkEsmVRS6wJBLJeTz++ONipfLAAw/Mzs6K5ch11113wWHtdvuuu+4CbrvttmazGQRBuVzu7e0Fbr/99qmpqQMHDoyNjQHvfe97g3A1EIlE3v72t3/yk58MgmBhYUEsJj72sY/NzMx84hOfEJ9bKBQuusC66qqrvvWtb/37v//74OAgcOeddwZBUK1WxYe++93vHh8f/9SnPqUoyqUXWN0+HDx4UFEURVHuv//+UqkkFK9t27Z5nnfpQXixBdbS0tLhw4cPHz586NAhsXLK5XITExOXaK3dbt92223AXXfd1W63L2jwcob0osMikUiuOPIRoUQiOY/169fv378/Go1u3rz5yJEjS0tLwMLCwgWHmaapaRqgqmokEgEOHDhQKBRisdinP/3pZDI5PDz8t3/7t3fcccd3v/vd7ll//Md//Pd///fi5/3795fL5Xw+/zd/8zeapv3pn/7pzMxMrVYrFAoX7diHP/zht73tbcBb3/rWT3/608Jj/uijjxYKhUQi8c///M/xeHzr1q0/+clPvv3tb1/iArt9+PjHPx4EwY4dOwYHB48fP/7mN7/5X/7lX8bHx5999tnLHIQLyGaz2WwW+MhHPnLgwAHTNO+9997169enUqkXa800TSGeaZpmmuYFDV7OkF50WCQSyRVHLrAkEsl55PP5+++//+677z548KDv+0IQuhxOnjwJrFu3LplMind27NgBzM3N1Wo18c4b3/jG7vGnTp0CRkdHxUJNUZR/+qd/ukT7GzZsED/kcjkgCILuh46NjcXjcfG/119//aUXWN0+iHMPHz58/fXXrzzgxIkT11xzzSsbBOCee+75+Mc/DnzmM5+5+eab+SUP6UWHRSKRXHHkAksikZzH97///T/8wz80TfMjH/nIrbfe+uSTT3aNSpemp6cHWFxc7L4jfo5Go8KUDawUaYTYUyqVfpHeJhIJoFwud98R+tAl6PYhlUoBt9xyS9ehL9ix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" + }, + "metadata": {}, + "execution_count": 9 + } + ], + "cell_type": "code", + "source": [ + "calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n", + "\n", + "fig = Figure()\n", + "\n", + "ax = Axis(fig[1, 1],\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " aspect = 1,\n", + " title = \"a forcing realization\",\n", + " limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n", + "\n", + "heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n", + " colormap = :balance, colorrange = (-200, 200))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "## Setting initial conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Our initial condition is a fluid at rest." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "## Diagnostics" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\n", + "Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\n", + "Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\n", + "Wᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\n", + "Z = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\n", + "Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\n", + "Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\n", + "Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\n", + "diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\n", + "nothing # hide" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "## Time-stepping the `Problem` forward" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We step the `Problem` forward in time." + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 0100, t: 0.5, cfl: 0.165, walltime: 0.03 min\n", + "step: 0200, t: 1.0, cfl: 0.259, walltime: 0.06 min\n", + "step: 0300, t: 1.5, cfl: 0.280, walltime: 0.08 min\n", + "step: 0400, t: 2.0, cfl: 0.337, walltime: 0.10 min\n" + ] + } + ], + "cell_type": "code", + "source": [ + "startwalltime = time()\n", + "for i = 1:ns\n", + " stepforward!(prob, diags, round(Int, nt/ns))\n", + "\n", + " TwoDNavierStokes.updatevars!(prob)\n", + "\n", + " cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n", + "\n", + " log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n", + " cfl, (time()-startwalltime)/60)\n", + "\n", + " println(log)\n", + "end" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "## Plot\n", + "Now let's see the final snapshot of the vorticity." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAIAAAAP3aGbAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOy9e8xtV1U3/BtjzLkuez+385zSFlosAn7UvnKxSpoWBEwgBgwaLUTJEVAJEQIR4n8mEBLBAGIQK3iJoEBEiIrwhvCBMSL0JYBoLC/2RT4sL4VeOG3POc9lP3uvy5xzjO+PudZ+nl44rbWVnJ79S3O693rWmnuuteYcc1x+Y0wyM6ywwgornAvg73cHVlhhhRUeKFYCa4UVVjhnsBJYK6ywwjmDlcBaYYUVzhmsBNYKK6xwzmAlsFZYYYVzBiuBtcIKK5wzWAmsFVZY4ZzBSmCtsMIK5wxWAmuFFVY4Z7ASWCussMI5g5XAWmGFFc4ZrATWCiuscM5gJbBWWGGFcwYrgbXCCiucM1gJrBVWWOGcwUpgrbDCCucMVgJrhRVWOGfgvt8dWOHhwlve8pa2bb/XX5/61Ke++MUvvuGGG66//vorr7zymmuuEZGjJ7zqVa/a3d193eted/XVV9/j2hDCq1/96iuuuOI3fuM3Hpau/zfi5ptv/uxnP/vNb37z6U9/+nOe85yNjY37PO3rX//6pz/96ZMnTz7hCU/4+Z//+ePHj5+9hb/5m7/56Ec/+q53veuiiy76b7qT8wS2wiMUL3nJSwBceumll90d29vbAP7yL//yS1/6EjNfe+2129vbr3rVq+5xeZ5pH/7wh+/d8jve8Q4An/rUp/5b7uM/h9/8zd+86qqrfu/3fu+BnPy5z32uruvlXHjSk55011133fu09773vd775Wnb29uf+9znzt7CzTff7Jx7+ctf/tDd2QpmZiuB9YjFZz7zGQB/+7d/e4/jL33pS7e3t9u2/eAHP/iiF73IzF796ldfffXV9zjtewmsnZ2d9fX1pz3taQ9fz/8ruPbaawG87nWvu98zU0r5Hl/1qld98pOffMYzngHgxIkT9zjtrrvuWltbA/Brv/ZrH/nIR6655hoAl112maqevYWXvexlRPSv//qvD/1NnsdYCaxHLFT1iU984k//9E8fPbi3tzeZTH791399eeSGG2648MILr7vuurZtT5w4ceLEiW9/+9t2d4H1lre85cSJEx//+MfN7O1vfzuA97znPfnyj3/84/mqW2+91cyuv/76/PWrX/3q9+rYb//2b584ceKoEvTGN77xxIkT95at98Du7m5u/Pbbb89HPvGJT5w4ceK3fuu38tcPfehDT37ykwH8xE/8xAc+8IGzt3b99dcDWFtbizGa2T/+4z8COHbsWAjh6Gmf/vSnAdR13TSNmX3lK1/JytRNN9109hY+97nPAXjpS1969m6s8J/CSmA9kvHWt75VRG677bblkT/+4z8GsJQm73rXu44dO/be977XzGazWZ6KN9xwg91dYD372c8G8OY3v9nMLr/8ciI6depUbmFvb+/SSy8F8IpXvEJVf/RHfxTAc5/73LP0KluUx48fz/N8f38/G1xf/vKXz3473/3ud3MP//3f/315gwCe8Yxn5K9XXXXV0jp76lOfevbWrrvuOgBXXXVV/rq/v58v/MY3vnH0tM9//vOveMUr8r2b2e7ubj7tq1/96tlbUNVLLrmkKIr5fH72nqzwwLGKEj6S8cu//MtE9IEPfGB55H3ve99VV12V1ZDPfOYzr3/965/5zGfecsstWZDdL2677bavf/3rV1xxxdLrvLGx8Sd/8icA3v/+97/pTW+64YYbptPpn/7pn56lkZe85CXMfPr06S984QsA/uEf/iGE8IQnPOHpT3/6g77TjOuvv/7nfu7nALz2ta/98pe/nFL67H3h5MmTAHZ2dgBkcw/A+vp6DjssRVLGM57xjPe+971veMMb8tf3vOc9AB7zmMdcfvnlZ2+BiK6++uq+7z//+c//F+9rhSVWAuuRjIsvvviFL3zhn/3Zn+WvN9544z//8z+/8pWvzF/n8/nLX/7y7e3tm2+++fbbb38gDX7ta18DcPnllx89+IIXvOClL31pSunNb34zgLe+9a2Pe9zjztLIJZdc8pznPAfAJz7xCQCf+tSnAOQQwX8RRVEwMwARKYqiaZqfvC9kK69pGgBHvelEBGA+n99n42b2tre97Q1veENRFB/84Ae99/fbwg//8A9jfGgrPCRY0Roe4XjlK1/5ghe84Prrr3/Ws571vve9b21t7Rd+4Rfyn174whe+8IUvXJ55cHBwv62dOnUKwNbW1j2Ov/Od7/zIRz4SQrj88stf85rX3G87v/RLv/SZz3zmE5/4xO/8zu88hALrHqiq6sMf/vC9j2fLcXNzE0eES9d1MUYA0+n03pecOXPmZS972Sc/+cmLL774ox/9aHa9328Lx44dw/jQVnhIsNKw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" + }, + "metadata": {}, + "execution_count": 13 + } + ], + "cell_type": "code", + "source": [ + "fig = Figure(resolution = (400, 400))\n", + "\n", + "ax = Axis(fig[1, 1];\n", + " xlabel = \"x\",\n", + " ylabel = \"y\",\n", + " title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n", + " aspect = 1,\n", + " limits = ((-L/2, L/2), (-L/2, L/2)))\n", + "\n", + "heatmap!(ax, x, y, Array(vars.ζ);\n", + " colormap = :viridis, colorrange = (-25, 25))\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms\n", + "involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether\n", + "the energy and enstrophy budgets are accurately computed, e.g., $\\mathrm{d}E/\\mathrm{d}t = W^\\varepsilon -\n", + "R^\\varepsilon - D^\\varepsilon$." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "Figure()", + "image/png": "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dsOGDSUlJXrT1/yxG48ML7/8slQqBQCxWLxy5corV66QYhxJhHtqOXjwYLLT7opX1gtWe/fu9fX1XbNmzVNPPbVs2TKTKaMeA9tgGTMtxm9ajJ+lUisuLgaAJ554gvv1KhQKAKioqAAAzef93ApGNiExKywsjNuqpKTE39/fxcWFWxIREXHq1CkAmDVr1pIlS2QyWUlJya+//rpp0ybd7Hl7ew8fPvynn36Kj4+/dOlSenr6F198cfjwYVdX17t3706YMKGgoICmac0mFFFRUXK5/Pbt2/7+/lqZIZYsWTJy5MhTp07l5+fHxcWZPEWenp4xMTEnTpwYO3ZsWVkZacqQmJgokUgOHDggk8kYhnn00UcBQCgUfvjhhyYTRMiO/LTY9G+EJ5OhQ2/AiYiIePPNN995552srKy4uLi0tLR58+a5u7vrpq/5Y7927ZreyED65UVHR3PLyePI69evDxgwQCsPpGxHdEu8sl6wyszMzMzMNJkg6nmwgNV1JBIJAHz22WckwHFCQkJAI8bx3wQAhEIht1AsFstkMs3VmpubyYupU6cuWrRo//79BQUFERERWvVMnLS0tOzs7JSUlICAgNDQ0JSUlCNHjri6ugYGBg4aNKioqEitVsvlcmdnZ7I+2R3JpFZmiGXLlr311lsjR45csGDBuXPndFfQlZKSkp2dffDgQS8vr8GDB5Pjio+P//HHH4VC4ZAhQ7hmqgghQ0yGDkOVNGvWrFmyZMn+/fsPHz68atWqDz74oLCwULeMpflbdnZ21hsZSGe6lpYWbk3N5Uby0C3xCoMVsjh8RNh1oqKiAKC1tXVYu7q6uv379zs6Olpkk/79+1dXV3PV7yzLcv2BPTw8UlJSvv32223bthkZ0eDxxx//7bfftm3blpCQAADJycknT548ePAg6WEUGRkJAMeOHePWP3LkiI+Pj94bXGL8+PEMw2zcuLGoqOj99983dnbaJSUllZeXb9q0aezYsdxNbWpqam5u7vHjx0mVO0LIODOiDQDk5eW99tprHu7yQvoAACAASURBVB4ezz777NatW48fP15WVkaeghlhKDKQ4oXm8tzcXG59I7olXmGwQhaHBayuExISMn369MzMzNOnT8tkstzc3JkzZxofd65Dm4wfPz4yMvK55567evVqXV3d8uXLS0tLuXvEmTNn7tix49atW0899ZSh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+/Zdu3bZnjIM07Zt28GDB0+ZMkW8eUVjIoRcuHDh5s2bMTExvXr1YllPs/yvv/563759tZc//vjjkydP9modEWppGi3aQFMKOPWLNuXl5S+++KLTlxYtWtS/f3+v1hG1WNiC5UuZmZn2YajhpKWl7dixw/aUEHL8+PFp06aNHTvWdjNKi8Vy5syZP//802AwNFxNsrOzBw0a1L9//2effbZPnz4JCQk5OTkervvnn3/++OOPDVc3hFqwRos2UFfA0Wq1OVXy8/Mbrhq3E21qO3HixLZt29RqtfcqiFo4bMG6U8hksq1bt9ovWbFixeLFi5OTk4cOHarVahMSEkaPHh0UFNS5c+fp06c3UDVefPHFioqKzMzMLl26pKenjxs37plnnjl27JiHqwcFBTm8C4RQE+Qm4LAsu3fvXgBITU0tLS1NSUlpoDrUO9q0bt3aofInT57ctWvX5MmTH3jggQaqLWp5MMFqbMePH9+/fz/DMA8//LBt4Y4dOwYPHqxSqbZs2fLGG2+0bt0aAJKTk/fu3atSqaKioqZMmdKtWzdb+TNnzvz8888AMHHiRIVCkZGR8eijj95qTR555JHFixfn5uYOHTrUarUGBgaOGzeua9eu0dHR3nijTphMpl9//fXTTz8Vb0AbHx+/ZMmSGTNmqFQq8bayu3fvjo2Ntd079sqVKxcuXJg0aVID1Qehls1ptAFnAaehow3YBZynnnoqISEhLS1t3759P/30022+R1e8GG1KSkomTZrUpUuXL7/8soFqi1okvETYqN5///1hw4bt27cvNTV1zJgx33//vbh8/vz5q1evvvfee7dv326xWADg888/Hzp06O7du0tLS9evX9+nT5/U1FSx8MaNGxMSEn777bfU1NQHHnhg8eLFS5curUdlsrKyAGDw4MEAIJFIoqKikpKSkpOTvfNWndFqtc8///zIkSNtS8TLkTzPi0/ffPPNPXv22F49ePDg/PnzG64+CLVgrqIN1Ao4jRBtoGbAuXLlynPPPbdjx46GO53zVrQhhEyZMkWj0ezatSswMLCBaotaJGzBcqfiUl5J8tX6rRvau0PbhO72S7Kzs5csWbJgwYL//ve/AHDx4sVBgwYFBASIr27cuPHo0aNi9AGA1atXT5o0afv27QCg0+liY2N3797dr1+/8vLy+fPnL1y48N133wWAU6dO3XvvvbaTMDcEQfjhhx9sj7Ozs1evXp2YmCie3qWkpMhkslWrVgEAIaSBOqJGRESsW7fO9jQvL++TTz657777IiIiPNyCXq9/7rnnHBa++uqrd911l7cqiZCvXP3yMAi0fut2m/k3hmVsT91HG6gZcLwebcBtwMnKypo6deqWLVvE4NNAbj/aiN54443Dhw9v27YtPj7e23VELRwmWI1n7969EonEdofU3r17T5kyJSkpSXw6depUW3YFAEeOHAkODhYfE0JkMplOpwOA/fv3GwyGf//73+JLQ4YMGTFiRHl5eZ175zhuypQptqeEkKioqBdeeEF8OnLkyH379o0bN06pVHbr1u29995zWL1NmzYqlcph4eHDh0eMGOHJe69t69atCxYs8PPz+/bbbz1fi1JaUVHhsNB2SooQErmPNlAz4Hg92oDbgJOUlBQZGfnOO+8AQGRkpJgCOvBuwKlftAGAn376aeXKlfPmzcNxyqgeMMFyJ7RXh9BeHby1tezs7JiYGPtG5l69etlCXufOne0LBwcHr127Njk5+dq1a+np6bblWVlZ7du3DwoKsi3p0aPHyZMn69y7QqEwm822p3l5eVOmTHn00UdzcnIYhpHJZJ988omb1S9fviwIgsNCsa+YvUOHDj344IPi40WLFq1YsaL2prKysmbOnHnq1KmXXnpp+fLlt9TqHhQU1HCdNhDyre4z/+atTbmPNlAz4Hg92oDbgDNv3rx58+a5X91bAed2os21a9eee+65oUOHrly50vO1ELLBBKvxBAcH6/V6+yVGo9H2WCaT2R7zPJ+QkGA0GmfNmjV79uy77rrrscceE19SKpX2awGAyWSqR2U6dOjwyiuvTJ48ubCwsH379nWWl0qlteMdwzAOS+655x5b743w8PDa2/nrr79GjBiRkJCQnp4eGxtbj5ojhOrkPtqAXcBphGgDPgo4txNtjEbjxIkTlUrl9u3bpVL8oUT1gd+bxhMfH5+fn5+enm67ln/48GGnJVNSUs6fP3/y5MkhQ4aISwoKCsQHPXv2VKlUto1QSlNSUhQKRT3qExoaCgAajcaTeNe9e3dPWuwDAgJ69+7taiOCIEyePHnkyJE7d+6sHStFBw8eXLx4sfj4t99+q7NiCKHamlq0gUYPOLcZbRITE9PT0w8ePNiuXbs6a4uQU5hgNZ7x48dHR0c//fTTmzZt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oLy8fMOGDXfdddfOnTu3b98eFRV1xx13pKamKgf56KOPBg8enJycrPxz165dFovFbDafPXvWbDa///7706ZN43keAHJycjZs2HDq1KmkpKQZM2a0atXKUfJdu3Zt3bqVEHLrrbe6PbW4uLjU1NRdu3Yp/8zPzz/XpG4RAAAgAElEQVR06NBbb701d+7cH3/8cfTo0QDw888/U0qHDRtmtVpDQkLGjx/fvn37xMRElVevf//+y5cvnzVr1i+//NK3b1//DoIQuh4NkR+tUEZGxpYtW1waooa0QlDPhigiImLgwIFHjx796quvvvjiC5VXz7khGjhwoB9HQN7IqEX461//+te//rXRPm79+vWCIPTv33/06NEsyw4bNsxut8uy/Pnnn2u12i5dukyePDk2NrZdu3ZZWVnKW9q2bTtp0qRu3brNmDEjIiIiLi7u7rvv7tu379SpU7VabVpamiRJsiyfO3cOAB588EGj0Thx4sS2bdvq9fpvv/1WOYggCB999JGjGDNnzhw3btwTTzwRHx9vNBrHjRtXXl4uy/KePXuio6NTU1OnTJmSkJAQHx9/5coV5S0vv/wyISQ9PX38+PGhoaHDhg2Lioqqe4Jz587V6XQ2m02W5Y8//lgQhIqKio4dOy5YsEDZYcSIEb169ZJlubCw8Pbbb3/88cc//vhjT5dr3rx5RqPRZaPZbKaUvvbaayoP4tDIdY2Qei2jIfKjFZJl2aUhangrJNenIZJl+cSJE+np6ZmZmZ4ul8+GyOcRHLAVUgN7sG4U/7cja8uJq/69d9HIlHFpRsc/S0tL582bN2/evNdeew0Atm/fnpGR8dVXX2VkZDz88MMTJ05ct24dpbSgoGDAgAFPPfWUo0f61KlTBw4cEARBeUtxcfHevXsppW+//fbDDz+cnZ2dkJCg7Llz585jx45FRUWZzeZbb731kUceOXbsGMMwbov36quv5ubmlpeXK3ddkiTNmTNn8ODBGzZsYFnWZDLdfPPNU6dO3blz57lz55555pmFCxe++uqrAPD777/37dtXr9fXPebIkSPffvvtX3/9tU+fPt99992QIUO0Wu0tt9yiDBG12+2//PLLnDlzAGDfvn0cx/39738HAFEUPRWyLkEQYmNjz54925CDIBRETl0rn7PhqH/v7RgTsurO7s5brl9DpOxWr1YIajdEAWmFoD4N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sz9Xr17tcDi+9a1vJesHQZAzg1OUQpClIHrqqafuv//+hA1+8YtfzJw5k35OKIIApVDfghYsZBATiURuv/32F154oXdf/+ijj2pqatI2q6mp+eijj+jnvXv3fvzxx2m/8tJLL02YMCFFP3/4wx+efPLJLMeLIMiA4xSlEPRKEJnYunXrsmXLvF4v25JQBAFKob4FLVjIIMbtdr/11lt9vKRXcXHxe++9l6JBIBBobm6eNm1aijZffPFFMBjM9dAQBOlr+lgKlZaWmuTP9u3bP/roo9mzZ1977bV0SyYiCFAKnX5QwUJ6w/Llyy+99NJoNPq3v/2tra3t+uuvv+mmm+iut95668orr5wyZQr9c8uWLaIoVlRUAMAHH3zwla98pb29fdWqVW63+6677jrnnHM++OCDrVu3Dhs27L777isvL2eHaGlp+eCDD44dOzZ58uR77rmHrkW/fPnyyy67zOPx/PWvf33kkUdKS0tdLtewYcPoVw4fPrxy5crW1taZM2d+//vfdzqddPu2bdtWr17t8XjGjRs3Z86cc889N+0JbtmyZc2aNTab7cYbb8z24qxevfqGG25I0c/q1avr6uqi0egbb7xx11135eXlZXsIBEHg9AuihFIILIKIl0LQt4Koo6Pju9/97jnnnLN06VK2kRdByTpBKdQXEOSMYMGCBQsWLOizw40bN+6BBx4499xzf/jDH06fPh0AXnnlFbrL5XK99dZbrOW///u/33TTTfTzxIkT77zzzunTp99zzz0jRow466yzvve97331q1+dM2dOfn7+tGnTNE2jLbdt2zZy5Mjzzjtv9uzZ48ePHzduXGtrKz3u/PnzXS7X+PHjW1pa6Jbnn3+eELJs2TKXy3X55Zd/85vfdDgcV199taIohJBXX30VAC688MI77rjj7LPPdrvd+/bto0cpKytjw+Z56qmnbDbbzJkzb7755pKSkquvvrqsrIzu+u///m/2ORmzZ8/esWNHin4efPDBcePGjRkz5qabbgoGg9le/D7+rREkc84kQZRMChGLIGJSiPSVIKIoivKNb3yjqKjoyJEj/HYmglJ0glKoD0AF6wwh7e0ePPS7rk9n0f+6N/xrVruijX839TZu3LiysjImbqZPn15RUUE/p5ZrF110UTQaJYSsW7cOAG644QZVVQkhL7/8MgCcPHmSEKKq6vTp02+9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+v793/9948aN8hiOHj169OhR+ZPZ2dloNFosFhccf6lUKhaLjNWZ27UyYZomXtepHsgyo8hxok9EwQEAx7bqP5dtAQBx7FqOgPucst/LtgHALJWKjhXe6Ng2ANiWWcfwan8ILcta4hxsOFgNNFANbGmlihklK3m92JHQv3zLWZW20qWVqDiFmJ6eBoBEIiE+SSQSjuNMTU21tbUtdrd/+Zd/ec973hOJRD7/+c8DQD6fb2pquvHGG//qr/6KMXbo0KE9e/bcdtttAYbs61//+v333y9/0tXVtX79+kD6YaXxq6r6m+dgTU1N6frK6ha3dGSz2UKhQE78UqRUyAPAzPRUxKyz9FRufg4A8tn52h/CU+VgFQt5AJiemiwrsSjm8wAwk5k2zEX3np+amiKEqOrCX8zlctjZr240HKwGGqgGtbYGNRW/zuhy9SI8+dhzWltfc3lya6Xhscceu+KKK/DvO++889prrwWA2dlZsUMmkyGENDU1yd9Kp9PVdzt48OBtt932xBNPvOMd77j77rvR2hqG8dxzz4mvDAwM3HnnnW9961unpqaam5vF5/v27du3b598urvvvhvg/2/v7oOjqu89jv9287B5IAkkNyQ8iNl4jaBUAmJqACE1tKhjU5hOkSkjU0pNw62XCZSxrejIH6K2MoahI08XpCCjKJThQahttxKqpMamPKQMAd0QRIhxSAwkmxCS7O79Y3XdrsnmZPPNnj2b9+uvZPeX5XvOd/Plk90956jMzMw+N8fpdGZmZkZewDKbzVo231ja2to6Ojo8z6VBNSKlVSk1OjMzPdgLwozsbFZKpaelaulCbGxsbGzsABNG0JKTriulRo8a1eP4TUluVUqNysgIYle43e60tLTY2L5/cODbTsACAhngW4T5t47wXIzCiBbn3aJ3CVp9+9vfPnXqlOfr9PT0jo4O9dU7gB4NDQ3p6el+f7Z6/pvpbdnJkycLCgry8/Nramqs1kAnVPTc29jY6BuwAFkDP01DSlzMPWNTBunc67JWz7lj9Zw7ervXKFfxImABgaQmxKbE9ftVaK/18yYKFoPeJCYmTpz49a52u91Wq9Vmsz300EOeW2w228yZM/1+aty4cb0tc7lc8+fPLyws/OMf/+j37o/NZnvssccOHTo0depUzy3V1dVxcXHZ2dmDtHWAUuqxe8Z+57//KyUu+P+1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ru7mzZtPP/20d3h5/lqtrKzs7u6+du3asmXLPv300ytXrjidzhBuOoBwwSBCEAhYCHebN2++66678vPzExMTv/e9782ZM2fdunVKqVmzZq1YseLZZ5/NzMwcM2ZMWVnZxo0b/U7rFxsbe/DgQYfDkZubm5qaumvXro0bN3rvfemll+x2e3Z2dnJycl1dXWlpqef2KVOmlJSUlJaWDhs2bOTIkTExMWVlZXv27Fm5cmUoNxxA+GAQob9Mbrdb7xoQ7jwHv3gPgdFFU1PThQsXbr31Vu/J/by319XVWSyW22+/PS4urrcfr62tdTqdOTk5fre3tLR89NFH2dnZqampfndduXKloaFhwoQJCQkJnpWJiYlRUVF9lhoOuwuIPOHwm8UggnZ8yB3GkJaW5vfx0sC3++ntghXJyclTp07t8a4xY8aMGTPGd6W2SgFELAYRtOMtQgAAAGEELAAAAGEELAAAAGEELAAAAGEELAAAAGEELAAAAGEELAAAAGEELAAAAGEELAAAAGGcyR2alJeXc8kFjcrLywsKCvSuAohADCLtGES6i+LJCsjKysoqKCjIysrSuxAAQxeDSHdc7BkAAEAYn8ECAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQRsACAAAQ9v/1iwOQFALN2AAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "execution_count": 14 + } + ], + "cell_type": "code", + "source": [ + "sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n", + "\n", + "TwoDNavierStokes.updatevars!(prob)\n", + "\n", + "E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n", + "\n", + "clocktime = round(μ * clock.t, digits=2)\n", + "\n", + "dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\n", + "dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n", + "\n", + "dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\n", + "dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n", + "\n", + "residual_E = dEdt_computed - dEdt_numerical\n", + "residual_Z = dZdt_computed - dZdt_numerical\n", + "\n", + "εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n", + "\n", + "t = E.t[2:E.i]\n", + "\n", + "fig = Figure(resolution = (800, 1100))\n", + "\n", + "axis_kwargs = (xlabel = \"μ t\", )\n", + "\n", + "ax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\n", + "ax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\n", + "ax3E = Axis(fig[5, 1]; axis_kwargs...)\n", + "\n", + "ax1Z = Axis(fig[1, 2]; axis_kwargs...)\n", + "ax2Z = Axis(fig[3, 2]; axis_kwargs...)\n", + "ax3Z = Axis(fig[5, 2]; axis_kwargs...)\n", + "\n", + "hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\n", + "hε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\n", + "hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\n", + "hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n", + "\n", + "Legend(fig[2, 1],\n", + " [hWᵋ, hε, hDᵋ, hRᵋ],\n", + " [\"energy work, Wᵋ\" \"ensemble mean energy work, \" \"dissipation, Dᵋ\" \"drag, Rᵋ = - 2μE\"])\n", + "\n", + "hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\n", + "hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n", + "\n", + "Legend(fig[4, 1],\n", + " [hc, hn],\n", + " [\"computed Wᵋ-Dᵋ\" \"numerical dE/dt\"])\n", + "\n", + "hr = lines!(ax3E, t, residual_E)\n", + "\n", + "Legend(fig[6, 1],\n", + " [hr],\n", + " [\"residual\"])\n", + "\n", + "hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\n", + "hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\n", + "hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\n", + "hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n", + "\n", + "Legend(fig[2, 2],\n", + " [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n", + " [\"enstrophy work, Wᶻ\" \"ensemble mean enstophy work, \" \"dissipation, Dᶻ\" \"drag, Rᶻ = - 2μZ\"])\n", + "\n", + "hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\n", + "hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n", + "\n", + "Legend(fig[4, 2],\n", + " [hcᶻ, hnᶻ],\n", + " [\"computed Wᶻ-Dᶻ\" \"numerical dZ/dt\"])\n", + "\n", + "hrᶻ = lines!(ax3Z, t, residual_Z)\n", + "\n", + "Legend(fig[6, 2],\n", + " [hr],\n", + " [\"residual\"])\n", + "\n", + "fig" + ], + "metadata": {}, + "execution_count": 14 + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.6.7" + }, + "kernelspec": { + "name": "julia-1.6", + "display_name": "Julia 1.6.7", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets.jl b/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets.jl new file mode 100644 index 00000000..dae370ef --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets.jl @@ -0,0 +1,193 @@ +using GeophysicalFlows, CUDA, Random, Printf, CairoMakie + +parsevalsum = FourierFlows.parsevalsum +record = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record +nothing # hide + +dev = CPU() # Device (CPU/GPU) +nothing # hide + + n, L = 256, 2π # grid resolution and domain length + ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order + μ, nμ = 1e-1, 0 # linear drag coefficient +dt, tf = 0.005, 0.2 / μ # timestep and final time + nt = round(Int, tf / dt) # total timesteps + ns = 4 # how many intermediate times we want to plot +nothing # hide + +forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space +forcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f` +ε = 0.1 # energy input rate by the forcing + +grid = TwoDGrid(dev; nx=n, Lx=L) + +K = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber + +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2)) +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average + +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly) +@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε +nothing # hide + +if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end +nothing # hide + +random_uniform = dev==CPU() ? rand : CUDA.rand + +function calcF!(Fh, sol, t, clock, vars, params, grid) + T = eltype(grid) + @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt) + + return nothing +end +nothing # hide + +prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4", + calcF=calcF!, stochastic=true) +nothing # hide + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid + +x, y = grid.x, grid.y +Lx, Ly = grid.Lx, grid.Ly +nothing # hide + +calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid) + +fig = Figure() + +ax = Axis(fig[1, 1], + xlabel = "x", + ylabel = "y", + aspect = 1, + title = "a forcing realization", + limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2))) + +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx)); + colormap = :balance, colorrange = (-200, 200)) + +fig + +TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny))) + +E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep. +nothing # hide + +startwalltime = time() +for i = 1:ns + stepforward!(prob, diags, round(Int, nt/ns)) + + TwoDNavierStokes.updatevars!(prob) + + cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy]) + + log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t, + cfl, (time()-startwalltime)/60) + + println(log) +end + +fig = Figure(resolution = (400, 400)) + +ax = Axis(fig[1, 1]; + xlabel = "x", + ylabel = "y", + title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")", + aspect = 1, + limits = ((-L/2, L/2), (-L/2, L/2))) + +heatmap!(ax, x, y, Array(vars.ζ); + colormap = :viridis, colorrange = (-25, 25)) + +fig + +sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid + +TwoDNavierStokes.updatevars!(prob) + +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags + +clocktime = round(μ * clock.t, digits=2) + +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency + +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1] +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1] + +residual_E = dEdt_computed - dEdt_numerical +residual_Z = dZdt_computed - dZdt_numerical + +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly) + +t = E.t[2:E.i] + +fig = Figure(resolution = (800, 1100)) + +axis_kwargs = (xlabel = "μ t", ) + +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...) +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...) +ax3E = Axis(fig[5, 1]; axis_kwargs...) + +ax1Z = Axis(fig[1, 2]; axis_kwargs...) +ax2Z = Axis(fig[3, 2]; axis_kwargs...) +ax3Z = Axis(fig[5, 2]; axis_kwargs...) + +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid) +hε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash) +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid) +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid) + +Legend(fig[2, 1], + [hWᵋ, hε, hDᵋ, hRᵋ], + ["energy work, Wᵋ" "ensemble mean energy work, " "dissipation, Dᵋ" "drag, Rᵋ = - 2μE"]) + +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid) +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash) + +Legend(fig[4, 1], + [hc, hn], + ["computed Wᵋ-Dᵋ" "numerical dE/dt"]) + +hr = lines!(ax3E, t, residual_E) + +Legend(fig[6, 1], + [hr], + ["residual"]) + +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid) +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash) +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid) +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid) + +Legend(fig[2, 2], + [hWᶻ, hεᶻ, hDᶻ, hRᶻ], + ["enstrophy work, Wᶻ" "ensemble mean enstophy work, " "dissipation, Dᶻ" "drag, Rᶻ = - 2μZ"]) + +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid) +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash) + +Legend(fig[4, 2], + [hcᶻ, hnᶻ], + ["computed Wᶻ-Dᶻ" "numerical dZ/dt"]) + +hrᶻ = lines!(ax3Z, t, residual_Z) + +Legend(fig[6, 2], + [hr], + ["residual"]) + +fig + +# This file was generated using Literate.jl, https://github.com/fredrikekre/Literate.jl + diff --git a/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets/index.html new file mode 100644 index 00000000..7b0416ab --- /dev/null +++ b/v0.15.2/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -0,0 +1,160 @@ + +2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

    2D forced-dissipative turbulence budgets

    This example can viewed as a Jupyter notebook via .

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π              # grid resolution and domain length
    + ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0              # linear drag coefficient
    +dt, tf = 0.005, 0.2 / μ       # timestep and final time
    +    nt = round(Int, tf / dt)  # total timesteps
    +    ns = 4                    # how many intermediate times we want to plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

    E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
    +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
    +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
    +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy,                            prob, nsteps=nt) # enstrophy
    +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity,  prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work,                       prob, nsteps=nt) # enstrophy work input by forcing
    +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +for i = 1:ns
    +  stepforward!(prob, diags, round(Int, nt/ns))
    +
    +  TwoDNavierStokes.updatevars!(prob)
    +
    +  cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +  log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t,
    +        cfl, (time()-startwalltime)/60)
    +
    +  println(log)
    +end
    step: 0100, t: 0.5, cfl: 0.165, walltime: 0.02 min
    +step: 0200, t: 1.0, cfl: 0.259, walltime: 0.04 min
    +step: 0300, t: 1.5, cfl: 0.280, walltime: 0.06 min
    +step: 0400, t: 2.0, cfl: 0.337, walltime: 0.08 min

    Plot

    Now let's see the final snapshot of the vorticity.

    fig = Figure(resolution = (400, 400))
    +
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ);
    +         colormap = :viridis, colorrange = (-25, 25))
    +
    +fig

    And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +TwoDNavierStokes.updatevars!(prob)
    +
    +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags
    +
    +clocktime = round(μ * clock.t, digits=2)
    +
    +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency
    +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency
    +
    +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]
    +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]
    +
    +residual_E = dEdt_computed - dEdt_numerical
    +residual_Z = dZdt_computed - dZdt_numerical
    +
    +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)
    +
    +t = E.t[2:E.i]
    +
    +fig = Figure(resolution = (800, 1100))
    +
    +axis_kwargs = (xlabel = "μ t", )
    +
    +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...)
    +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...)
    +ax3E = Axis(fig[5, 1]; axis_kwargs...)
    +
    +ax1Z = Axis(fig[1, 2]; axis_kwargs...)
    +ax2Z = Axis(fig[3, 2]; axis_kwargs...)
    +ax3Z = Axis(fig[5, 2]; axis_kwargs...)
    +
    +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i];   linestyle = :solid)
    +hε  = lines!(ax1E, t, ε .+ 0t;     linestyle = :dash)
    +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)
    +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 1],
    +       [hWᵋ, hε, hDᵋ, hRᵋ],
    +       ["energy work, Wᵋ" "ensemble mean energy work, <Wᵋ>" "dissipation, Dᵋ" "drag, Rᵋ = - 2μE"])
    +
    +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
    +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 1],
    +       [hc, hn],
    +       ["computed Wᵋ-Dᵋ" "numerical dE/dt"])
    +
    +hr = lines!(ax3E, t, residual_E)
    +
    +Legend(fig[6, 1],
    +       [hr],
    +       ["residual"])
    +
    +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i];  linestyle = :solid)
    +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t;    linestyle = :dash)
    +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)
    +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 2],
    +       [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
    +       ["enstrophy work, Wᶻ" "ensemble mean enstophy work, <Wᶻ>" "dissipation, Dᶻ" "drag, Rᶻ = - 2μZ"])
    +
    +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
    +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 2],
    +       [hcᶻ, hnᶻ],
    +       ["computed Wᶻ-Dᶻ" "numerical dZ/dt"])
    +
    +hrᶻ = lines!(ax3Z, t, residual_Z)
    +
    +Legend(fig[6, 2],
    +       [hr],
    +       ["residual"])
    +
    +fig

    This page was generated using Literate.jl.

    diff --git a/v0.15.2/literated/twodturb.mp4 b/v0.15.2/literated/twodturb.mp4 new file mode 100644 index 00000000..3093721a Binary files /dev/null and b/v0.15.2/literated/twodturb.mp4 differ diff --git a/v0.15.2/literated/twodturb_forced.mp4 b/v0.15.2/literated/twodturb_forced.mp4 new file mode 100644 index 00000000..7c6a8067 Binary files /dev/null and b/v0.15.2/literated/twodturb_forced.mp4 differ diff --git a/v0.15.2/modules/barotropicqgql/index.html b/v0.15.2/modules/barotropicqgql/index.html new file mode 100644 index 00000000..9c2de9cc --- /dev/null +++ b/v0.15.2/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

    BarotropicQGQL

    Basic Equations

    This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

    \[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

    where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g.,

    As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

    \[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

    The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

    \[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

    Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

    The linear operator is constructed in Equation

    GeophysicalFlows.BarotropicQGQL.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    Nonlinear term is computed via calcN! function.

    source

    and the nonlinear terms are computed via

    GeophysicalFlows.BarotropicQGQL.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    The kinetic energy of the fluid is obtained via:

    while the enstrophy via:

    Other diagnostic include: dissipation, drag, and work.

    Examples

    • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
    diff --git a/v0.15.2/modules/multilayerqg/index.html b/v0.15.2/modules/multilayerqg/index.html new file mode 100644 index 00000000..9afcc00a --- /dev/null +++ b/v0.15.2/modules/multilayerqg/index.html @@ -0,0 +1,27 @@ + +MultiLayerQG · GeophysicalFlows.jl

    MultiLayerQG

    Basic Equations

    This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

    The QGPV in each layer is

    \[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

    where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

    \[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

    with

    \[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = g \frac{\rho_{j+1} - \rho_j}{\rho_{j+1}} .\]

    In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

    \[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

    where

    \[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ + F_{3/2, 2} & -(F_{3/2, 2}+F_{5/2, 2}) & F_{5/2, 2} & & \vdots\\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

    Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

    \[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

    with

    \[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

    Implementation

    Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

    One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

    The equations of motion are time-stepped forward in Fourier space:

    \[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

    In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

    The linear operator is constructed in Equation

    GeophysicalFlows.MultiLayerQG.EquationFunction
    Equation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcN!.

    source
    GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
    hyperviscosity(params, grid)

    Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

    \[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

    source

    The nonlinear terms are computed via

    GeophysicalFlows.MultiLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Linearized MultiLayerQG dynamics

    The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

    Helper functions

    GeophysicalFlows.MultiLayerQG.set_ψ!Function
    set_ψ!(params, vars, grid, sol, ψ)
    +set_ψ!(prob, ψ)

    Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

    source

    Diagnostics

    The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

    GeophysicalFlows.MultiLayerQG.energiesFunction
    energies(vars, params, grid, sol)
    +energies(prob)

    Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

    The kinetic energy at the $j$-th fluid layer is

    \[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

    while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

    \[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

    source

    The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

    GeophysicalFlows.MultiLayerQG.fluxesFunction
    fluxes(vars, params, grid, sol)
    +fluxes(prob)

    Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

    The lateral eddy fluxes within the $j$-th fluid layer are

    \[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

    while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

    \[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

    source

    Examples

    diff --git a/v0.15.2/modules/singlelayerqg/index.html b/v0.15.2/modules/singlelayerqg/index.html new file mode 100644 index 00000000..54489b64 --- /dev/null +++ b/v0.15.2/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

    SingleLayerQG

    Basic Equations

    This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

    \[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

    where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

    The dynamical variable is $q$. Thus, the equation solved by the module is:

    \[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

    The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SingleLayerQG.EquationFunction
    Equation(params::BarotropicQGParams, grid)

    Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    The nonlinear term is computed via calcN! function.

    source
    Equation(params::EquivalentBarotropicQGParams, grid)

    Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

    The nonlinear term is computed via calcN! function.

    source

    The nonlinear terms are computed via

    GeophysicalFlows.SingleLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    The kinetic energy of the fluid is computed via:

    GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    source

    while the potential energy, for an equivalent barotropic fluid, is computed via:

    GeophysicalFlows.SingleLayerQG.potential_energyFunction
    potential_energy(prob)

    Return the problem's (prob) domain-averaged potential energy of the fluid,

    \[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

    source

    The total energy is:

    GeophysicalFlows.SingleLayerQG.energyFunction
    energy(prob)

    Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

    source

    Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

    Examples

    diff --git a/v0.15.2/modules/surfaceqg/index.html b/v0.15.2/modules/surfaceqg/index.html new file mode 100644 index 00000000..58144518 --- /dev/null +++ b/v0.15.2/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

    SurfaceQG

    Basic Equations

    This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

    \[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

    The SQG model evolves the surface buoyancy,

    \[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

    Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

    \[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

    with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

    These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

    \[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

    where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

    Implementation

    The buoyancy equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

    The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SurfaceQG.EquationFunction
    Equation(params, grid)

    Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

    \[L = - ν |𝐤|^{2 n_ν} .\]

    Plain old viscocity corresponds to $n_ν=1$.

    The nonlinear term is computed via function calcN!().

    source

    while the nonlinear terms via

    GeophysicalFlows.SurfaceQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    Some useful diagnostics are kinetic energy and buoyancy variance.

    GeophysicalFlows.SurfaceQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    In SQG, this is identical to half the domain-averaged surface buoyancy variance.

    source
    GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
    buoyancy_variance(prob)

    Return the buoyancy variance,

    \[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

    In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

    source

    Other diagnostic include: buoyancy_dissipation and buoyancy_work.

    Examples

    • examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.

      Capet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.

    diff --git a/v0.15.2/modules/twodnavierstokes/index.html b/v0.15.2/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..ddcc6e47 --- /dev/null +++ b/v0.15.2/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

    TwoDNavierStokes

    Basic Equations

    This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

    \[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

    where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.TwoDNavierStokes.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

    \[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

    Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

    The nonlinear term is computed via the function calcN!.

    source

    The nonlinear terms are computed via calcN!,

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    Some useful diagnostics are:

    GeophysicalFlows.TwoDNavierStokes.energyFunction
    energy(prob)

    Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

    where $ψ$ is the streamfunction.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
    enstrophy(prob)

    Return the problem's (prob) domain-averaged enstrophy,

    \[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

    Examples

    diff --git a/v0.15.2/search/index.html b/v0.15.2/search/index.html new file mode 100644 index 00000000..6229fe5b --- /dev/null +++ b/v0.15.2/search/index.html @@ -0,0 +1,2 @@ + +Search · GeophysicalFlows.jl diff --git a/v0.15.2/search_index.js b/v0.15.2/search_index.js new file mode 100644 index 00000000..18c2ca1f --- /dev/null +++ b/v0.15.2/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = g fracrho_j+1 - rho_jrho_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.\nCapet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia>]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1Last version compatible with Julia v1.0.5 (the current long-term-release): GeophysicalFlows.jl v0.5.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that oftentimes this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing # hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\" \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#multilayerqg_2layer_example","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀, g = 1, 1 # Coriolis parameter and gravitational constant\nH = [0.2, 0.8] # the rest depths of each layer\nρ = [4.0, 5.0] # the density of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,\n dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This example can viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\" \"ensemble mean energy work, \" \"dissipation, Dᵋ\" \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\" \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\" \"ensemble mean enstophy work, \" \"dissipation, Dᶻ\" \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\" \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\nnothing # hide\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Aphys1D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Any: array with density of each fluid layer\nH::Any: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Any: array with density of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 20 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 8) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Farrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. J. Atmos. Sci., 60, 2101-2118.\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. J. Atmos. Sci., 69 (5), 1633-1656.\nConstantinou, N. C., Farrell, B. F., and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. J. Atmos. Sci., 71 (5), 1818-1842.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. J. Fluid Mech., 146, 21-43.\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n g = 1.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n ρ = Array{Float64}(1:nlayers),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\ng: Gravitational acceleration constant.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nρ: Density of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) * (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) * (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"j = Observable(1)\n\nq = @lift irfft(qh[$j], nx)\nψ = @lift irfft(- Array(grid.invKrsq) .* qh[$j], nx)\nq̄ = @lift real(ifft(qh[$j][1, :] / ny))\nū = @lift vec(mean(u[$j], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$j])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ū, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 18) do i\n j[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"# we delete the .jld2 file before deploying the docs (takes too much space) #hide\nrm(output.path) #hide","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This example can be run online via (Image: ). Also, it can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.\nnothing # hidenothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.\nDrivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.\nPalóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"https://github.com/FourierFlows/GeophysicalFlowsDocumentation/blob/main/examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decaying_topography","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This example can be viewed as a Jupyter notebook via (Image: ).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend\nnothing # hide","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/v0.15.2/siteinfo.js b/v0.15.2/siteinfo.js new file mode 100644 index 00000000..ea8a89be --- /dev/null +++ b/v0.15.2/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.15.2"; diff --git a/v0.15.2/stochastic_forcing/index.html b/v0.15.2/stochastic_forcing/index.html new file mode 100644 index 00000000..175ba12a --- /dev/null +++ b/v0.15.2/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that oftentimes this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/v0.15.2/visualize/index.html b/v0.15.2/visualize/index.html new file mode 100644 index 00000000..54ce5234 --- /dev/null +++ b/v0.15.2/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/v0.15.3/.documenter-siteinfo.json b/v0.15.3/.documenter-siteinfo.json new file mode 100644 index 00000000..ba6dc84e --- /dev/null +++ b/v0.15.3/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-10-27T16:00:09","documenter_version":"1.1.2"}} \ No newline at end of file diff --git a/v0.15.3/aliasing/index.html b/v0.15.3/aliasing/index.html new file mode 100644 index 00000000..7013e314 --- /dev/null +++ b/v0.15.3/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

    Aliasing

    In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

    De-aliasing scheme

    FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

    julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
    +
    +julia> OneDimensionalGrid
    +         ├─────────── Device: CPU
    +         ├──────── FloatType: Float64
    +         ├────────── size Lx: 6.283185307179586
    +         ├──── resolution nx: 64
    +         ├── grid spacing dx: 0.09817477042468103
    +         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
    +         └─ aliased fraction: 0.5

    or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

    julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
    +Problem
    +  ├─────────── grid: grid (on CPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper
    +  
    +julia> prob.grid.aliased_fraction
    +0.5

    Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

    All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

    To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

    diff --git a/v0.15.3/assets/README/index.html b/v0.15.3/assets/README/index.html new file mode 100644 index 00000000..ddfb6b72 --- /dev/null +++ b/v0.15.3/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/v0.15.3/assets/documenter.js b/v0.15.3/assets/documenter.js new file mode 100644 index 00000000..f5311607 --- /dev/null +++ b/v0.15.3/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
    Type something to get started!
    + `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
    `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
    ${count} result(s)
    `; + + search_result_container = ` +
    + ${modal_filters} + ${search_divider} + ${result_count} +
    + ${search_results} +
    +
    + `; + } else { + search_result_container = ` +
    + ${modal_filters} + ${search_divider} +
    0 result(s)
    +
    +
    No result found!
    + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
    + Filters: + ${str} +
    + `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
    `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
    +
    ${result.title}
    +
    ${result.category}
    +
    +

    + ${display_result} +

    +
    + ${display_link} +
    +
    + ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
    Type something to get started!
    +`; + +let search_modal_footer = ` +
    + + Ctrl + + / to search + + esc to close +
    +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
    Type something to get started!
    + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v0.15.3/assets/energy_budgets_Ito.svg b/v0.15.3/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..de8d0090 --- /dev/null +++ b/v0.15.3/assets/energy_budgets_Ito.svg @@ -0,0 +1,1397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.3/assets/energy_budgets_Stratonovich.svg b/v0.15.3/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..7ed887ab --- /dev/null +++ b/v0.15.3/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.3/assets/energy_comparison.svg b/v0.15.3/assets/energy_comparison.svg new file mode 100644 index 00000000..398b7df7 --- /dev/null +++ b/v0.15.3/assets/energy_comparison.svg @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.3/assets/themes/documenter-dark.css b/v0.15.3/assets/themes/documenter-dark.css new file mode 100644 index 00000000..ec054ecc --- /dev/null +++ b/v0.15.3/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v0.15.3/assets/themes/documenter-light.css b/v0.15.3/assets/themes/documenter-light.css new file mode 100644 index 00000000..1262ec50 --- /dev/null +++ b/v0.15.3/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v0.15.3/assets/themeswap.js b/v0.15.3/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v0.15.3/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v0.15.3/assets/warner.js b/v0.15.3/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v0.15.3/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v0.15.3/contributing/index.html b/v0.15.3/contributing/index.html new file mode 100644 index 00000000..2df9cfc4 --- /dev/null +++ b/v0.15.3/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

    Contributors' Guide

    This is a short guide for potential GeophysicalFlows.jl contributors.

    Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

    We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

    What can I do?

    • Tackle an existing issue.

    • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

    • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

    • Improve documentation, docstrings, or comments if you found something is hard to use.

    • Implement a new feature (e.g., a new diagnostic into a module).

    • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

    If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

    Ground Rules

    • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
    • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
    • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
    • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

    Reporting a bug

    The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

    • Head over to the issues page.
    • Search to see if your issue already exists or has even been solved previously.
    • If you indeed have a new issue or request, click the "New Issue" button.
    • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

    Setting up your development environment

    • Install Julia on your system.
    • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
    • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
    • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
      git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
    • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
    • Connect your repository to the upstream (main project).
      git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
    • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
    • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

    Your development environment is now ready!

    Pull Requests

    Changes and contributions should be made via GitHub pull requests against the main branch.

    When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

    When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

    Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

    Documentation

    All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

    We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

    You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

    julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    +julia --project=docs/ docs/make.jl

    and then open docs/build/index.html in your favorite browser.

    Credits

    This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

    diff --git a/v0.15.3/gpu/index.html b/v0.15.3/gpu/index.html new file mode 100644 index 00000000..2487ed28 --- /dev/null +++ b/v0.15.3/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

    GPU

    GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

    All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

    julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
    +Problem
    +  ├─────────── grid: grid (on GPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper

    Selecting GPU device

    FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

    diff --git a/v0.15.3/index.html b/v0.15.3/index.html new file mode 100644 index 00000000..ef8c2222 --- /dev/null +++ b/v0.15.3/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

    GeophysicalFlows.jl Documentation

    Overview

    GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

    Examples

    Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

    Fourier transforms normalization

    Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

    \[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

    The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

    \[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

    where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

    Read more in the FourierFlows.jl Documentation; see Grids section.

    Unicode

    Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

    Read more about Unicode symbols in the Julia Documentation.

    Developers

    The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

    Citing

    If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

    Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

    The bibtex entry for the paper is:

    @article{GeophysicalFlowsJOSS,
    +  doi = {10.21105/joss.03053},
    +  url = {https://doi.org/10.21105/joss.03053},
    +  year = {2021},
    +  publisher = {The Open Journal},
    +  volume = {6},
    +  number = {60},
    +  pages = {3053},
    +  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
    +  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
    +  journal = {Journal of Open Source Software}
    +}

    Papers using GeophysicalFlows.jl

    1. Siegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.

    2. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

    3. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.

    4. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.

    5. Drivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.

    6. Palóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

    7. Karrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

    diff --git a/v0.15.3/installation_instructions/index.html b/v0.15.3/installation_instructions/index.html new file mode 100644 index 00000000..3658cec7 --- /dev/null +++ b/v0.15.3/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

    Installation instructions

    You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

    julia> ]
    +(v1.6) pkg> add GeophysicalFlows
    +(v1.6) pkg> instantiate

    We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

    (v1.6) pkg> update GeophysicalFlows

    Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

    Use Julia 1.6 or newer

    The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

    Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

    diff --git a/v0.15.3/lib/functions/index.html b/v0.15.3/lib/functions/index.html new file mode 100644 index 00000000..b7c749cc --- /dev/null +++ b/v0.15.3/lib/functions/index.html @@ -0,0 +1,89 @@ + +Functions · GeophysicalFlows.jl

    Functions

    GeophysicalFlows

    GeophysicalFlows.GeophysicalFlowsModule

    Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.

    source

    Exported functions

    GeophysicalFlows.lambdipoleFunction
    lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

    Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

    source
    GeophysicalFlows.peakedisotropicspectrumFunction
    peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

    Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

    source

    TwoDNavierStokes

    Exported functions

    GeophysicalFlows.TwoDNavierStokes.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                  μ = 0,
    +                 nμ = 0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a two-dimensional Navier-Stokes problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Large-scale (hypo)-viscosity coefficient.
    • : (Hypo)-viscosity order, $≤ 0$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.TwoDNavierStokes.energy_workFunction
    energy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

    \[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

    where $ψ$ is the stream flow.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
    enstrophy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

    \[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

    where $ζ$ is the relative vorticity.

    source
    GeophysicalFlows.TwoDNavierStokes.palinstrophyFunction
    palinstrophy(prob)

    Return the problem's (prob) domain-averaged palinstrophy,

    \[\int \frac1{2} |{\bf ∇} ζ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Private functions

    GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

    source
    GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
    energy_dissipation(prob, ξ, νξ)

    Return the domain-averaged energy dissipation rate done by the viscous term,

    \[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
    enstrophy_dissipation(prob, ξ, νξ)

    Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

    \[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source

    SingleLayerQG

    Exported functions

    GeophysicalFlows.SingleLayerQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    + deformation_radius = Inf,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a single-layer quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    GeophysicalFlows.SingleLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

    source

    MultiLayerQG

    Exported functions

    GeophysicalFlows.MultiLayerQG.ProblemFunction
    Problem(nlayers :: Int,
    +                    dev = CPU();
    +                     nx = 128,
    +                     ny = nx,
    +                     Lx = 2π,
    +                     Ly = Lx,
    +                     f₀ = 1.0,
    +                      β = 0.0,
    +                      g = 1.0,
    +                      U = zeros(nlayers),
    +                      H = 1/nlayers * ones(nlayers),
    +                      ρ = Array{Float64}(1:nlayers),
    +                    eta = nothing,
    +topographic_pv_gradient = (0, 0),
    +                      μ = 0,
    +                      ν = 0,
    +                     nν = 1,
    +                     dt = 0.01,
    +                stepper = "RK4",
    +                 calcFq = nothingfunction,
    +             stochastic = false,
    +                 linear = false,
    +       aliased_fraction = 1/3,
    +                      T = Float64)

    Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

    Arguments

    • nlayers: (required) Number of fluid layers.
    • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • f₀: Constant planetary vorticity.
    • β: Planetary vorticity $y$-gradient.
    • g: Gravitational acceleration constant.
    • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
    • H: Rest height of each fluid layer.
    • ρ: Density of each fluid layer.
    • eta: Periodic component of the topographic potential vorticity.
    • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
    • μ: Linear bottom drag coefficient.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
    • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64 (default); floating point type used for problem data.
    source
    GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
    streamfunctionfrompv!(ψh, qh, params, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

    source
    streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

    source
    streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    \[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source
    GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
    pvfromstreamfunction!(qh, ψh, params, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

    source
    pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

    source
    pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) (ψ̂₂ - ψ̂₁) ,\]

    \[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) (ψ̂₁ - ψ̂₂) .\]

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source

    Private functions

    GeophysicalFlows.MultiLayerQG.LinearEquationFunction
    LinearEquation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcNlinear!.

    source
    GeophysicalFlows.MultiLayerQG.calcS!Function
    calcS!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
    calcS⁻¹!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcNlinear!Function
    calcNlinear!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term of the linearized equations:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, vars, params, grid)

    Compute the advection term and stores it in N:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
    calcN_linearadvection!(N, sol, vars, params, grid)

    Compute the advection term of the linearized equations and stores it in N:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source

    SurfaceQG

    Exported functions

    GeophysicalFlows.SurfaceQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 Lx = 2π,
    +                 ny = nx,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a surface quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
    buoyancy_dissipation(prob)

    Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

    \[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

    where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

    source
    GeophysicalFlows.SurfaceQG.buoyancy_workFunction
    buoyancy_work(prob)
    +buoyancy_work(sol, vars, grid)

    Return the domain-averaged rate of work of buoyancy variance by the forcing,

    \[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

    source

    Private functions

    GeophysicalFlows.SurfaceQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

    source

    BarotropicQGQL

    Exported functions

    GeophysicalFlows.BarotropicQGQL.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    diff --git a/v0.15.3/lib/types/index.html b/v0.15.3/lib/types/index.html new file mode 100644 index 00000000..897fc5ff --- /dev/null +++ b/v0.15.3/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

    Private types

    TwoDNavierStokes

    GeophysicalFlows.TwoDNavierStokes.ParamsType
    struct Params{T} <: AbstractParams

    The parameters for a two-dimensional Navier-Stokes problem:

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • μ::Any: large-scale (hypo)-viscosity coefficient

    • nμ::Int64: (hypo)-viscosity order, $≤ 0$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.TwoDNavierStokes.VarsType
    struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

    The variables for two-dimensional Navier-Stokes problem:

    • ζ: relative vorticity

    • u: x-component of velocity

    • v: y-component of velocity

    • ζh: Fourier transform of relative vorticity

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SingleLayerQG

    GeophysicalFlows.SingleLayerQG.ParamsType
    struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

    The parameters for the SingleLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • deformation_radius::Any: Rossby radius of deformation

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SingleLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

    The variables for SingleLayer QG:

    • q: relative vorticity (+ vortex stretching)

    • ψ: streamfunction

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • qh: Fourier transform of relative vorticity (+ vortex stretching)

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    MultiLayerQG

    GeophysicalFlows.MultiLayerQG.ParamsType
    struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams

    The parameters for the MultiLayerQG problem.

    • nlayers::Int64: number of fluid layers

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Tuple: array with density of each fluid layer

    • H::Tuple: array with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Tuple: array with the reduced gravity constants for each fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to eta in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • S::Any: array containing coeffients for getting PV from streamfunction

    • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
    struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a single-layer MultiLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • U::Any: array with imposed constant zonal flow $U(y)$

    • eta::Any: array containing the periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
    struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a two-layer MultiLayerQG problem.

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Tuple: array with density of each fluid layer

    • H::Tuple: tuple with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: the reduced gravity constants for the fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: AbstractVars

    The variables for multi-layer QG problem.

    • q: relative vorticity + vortex stretching

    • ψ: streamfunction

    • u: x-component of velocity

    • v: y-component of velocity

    • qh: Fourier transform of relative vorticity + vortex stretching

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fqh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SurfaceQG

    GeophysicalFlows.SurfaceQG.ParamsType
    Params{T}(ν, nν, calcF!)

    A struct containing the parameters for Surface QG dynamics. Included are:

    • ν::Any: buoyancy (hyper)-viscosity coefficient

    • nν::Int64: buoyancy (hyper)-viscosity order

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SurfaceQG.VarsType
    Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

    The variables for surface QG problem:

    • b: buoyancy

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • bh: Fourier transform of buoyancy

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    BarotropicQGQL

    GeophysicalFlows.BarotropicQGQL.ParamsType
    Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

    A struct containing the parameters for a barotropic QL QG problem. Included are:

    • β::Any: planetary vorticity $y$-gradient

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.BarotropicQGQL.VarsType
    Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

    The variables for barotropic QL QG:

    • u: $x$-component of small-scale velocity

    • v: $y$-component of small-scale velocity

    • U: $x$-component of large-scale velocity

    • uzeta: small-scale $u′ζ′$

    • vzeta: small-scale $v′ζ′$

    • zeta: small-scale relative vorticity

    • Zeta: large-scale relative vorticity

    • psi: small-scale streamfunction

    • Psi: large-scale streamfunction

    • Nz: small-scale nonlinear term

    • NZ: large-scale nonlinear term

    • uh: Fourier transform of $x$-component of small-scale velocity

    • vh: Fourier transform of $y$-component of small-scale velocity

    • Uh: Fourier transform of $x$-component of large-scale velocity

    • zetah: Fourier transform of small-scale relative vorticity

    • Zetah: Fourier transform of large-scale relative vorticity

    • psih: Fourier transform of small-scale relative vorticity

    • Psih: Fourier transform of large-scale relative vorticity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source
    diff --git a/v0.15.3/literated/barotropicqgql_betaforced-24.png b/v0.15.3/literated/barotropicqgql_betaforced-24.png new file mode 100644 index 00000000..b48791f7 Binary files /dev/null and b/v0.15.3/literated/barotropicqgql_betaforced-24.png differ diff --git a/v0.15.3/literated/barotropicqgql_betaforced.mp4 b/v0.15.3/literated/barotropicqgql_betaforced.mp4 new file mode 100644 index 00000000..44898adb Binary files /dev/null and b/v0.15.3/literated/barotropicqgql_betaforced.mp4 differ diff --git a/v0.15.3/literated/barotropicqgql_betaforced/index.html b/v0.15.3/literated/barotropicqgql_betaforced/index.html new file mode 100644 index 00000000..b68bca7c --- /dev/null +++ b/v0.15.3/literated/barotropicqgql_betaforced/index.html @@ -0,0 +1,172 @@ + +Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +using Statistics: mean
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n^2
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                              calcF=calcF!, stochastic=true, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x, grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics – energy and enstrophy are functions imported at the top.

    E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
    +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

    We can also define our custom diagnostics via functions.

    zetaMean(prob) = prob.sol[1, :]
    +
    +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

    We combile all diags in a list.

    diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaQLturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "forcedbetaQLturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  grid, vars = prob.grid, prob.vars
    +
    +  @. vars.uh = im * grid.l  * grid.invKrsq * sol
    +  ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))
    +
    +  return  vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    Output
    +  ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
    +  ├──── path: ./forcedbetaQLturb.jld2
    +  └── fields: Dict{Symbol, Function}(:sol => Main.var"##313".get_sol, :u => Main.var"##313".get_u)

    Visualizing the simulation

    We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

    title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axζ̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean ζ",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.05)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 5)))
    +
    +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta
    +ζ = Observable(Array(@. ζ̄ + ζ′))
    +ψ̄, ψ′= prob.vars.Psi,  prob.vars.psi
    +ψ = Observable(Array(@. ψ̄ + ψ′))
    +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))
    +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))
    +
    +μt = Observable(μ * E.t[1:1])
    +energy = Observable(E.data[1:1])
    +enstrophy = Observable(Z.data[1:1])
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +heatmap!(axψ, x, y, ψ;
    +         colormap = :viridis, colorrange = (-0.22, 0.22))
    +
    +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)
    +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, μt, energy; linewidth = 3)
    +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],
    +      (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = @. ζ̄ + ζ′
    +  ψ[] = @. ψ̄ + ψ′
    +  ζ̄ₘ[] = vec(mean(ζ̄, dims=1))
    +  ūₘ[] = vec(mean(prob.vars.U, dims=1))
    +
    +  μt.val = μ * E.t[1:E.i]
    +  energy[] = E.data[1:E.i]
    +  enstrophy[] = Z.data[1:E.i]
    +
    +  title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  BarotropicQGQL.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.64, E: 0.0286, Q: 3.9616, walltime: 0.13 min
    +step: 2000, t: 100, cfl: 0.81, E: 0.0384, Q: 4.1193, walltime: 0.24 min
    +step: 3000, t: 150, cfl: 0.80, E: 0.0441, Q: 4.4990, walltime: 0.34 min
    +step: 4000, t: 200, cfl: 0.80, E: 0.0450, Q: 3.6810, walltime: 0.45 min
    +step: 5000, t: 250, cfl: 0.87, E: 0.0472, Q: 4.0671, walltime: 0.57 min
    +step: 6000, t: 300, cfl: 0.92, E: 0.0484, Q: 4.1866, walltime: 0.69 min
    +step: 7000, t: 350, cfl: 0.89, E: 0.0482, Q: 3.8817, walltime: 0.81 min
    +step: 8000, t: 400, cfl: 0.92, E: 0.0482, Q: 3.7857, walltime: 0.94 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/multilayerqg_2layer-31.png b/v0.15.3/literated/multilayerqg_2layer-31.png new file mode 100644 index 00000000..cfb7afcf Binary files /dev/null and b/v0.15.3/literated/multilayerqg_2layer-31.png differ diff --git a/v0.15.3/literated/multilayerqg_2layer.mp4 b/v0.15.3/literated/multilayerqg_2layer.mp4 new file mode 100644 index 00000000..85d89df2 Binary files /dev/null and b/v0.15.3/literated/multilayerqg_2layer.mp4 differ diff --git a/v0.15.3/literated/multilayerqg_2layer/index.html b/v0.15.3/literated/multilayerqg_2layer/index.html new file mode 100644 index 00000000..d22269d8 --- /dev/null +++ b/v0.15.3/literated/multilayerqg_2layer/index.html @@ -0,0 +1,181 @@ + +Phillips model of Baroclinic Instability · GeophysicalFlows.jl

    Phillips model of Baroclinic Instability

    A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf
    +
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

    n = 128                  # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 2.5e-3         # timestep
    + nsteps = 20000          # total number of time-steps
    + nsubs  = 50             # number of time-steps for plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π                   # domain size
    +μ = 5e-2                 # bottom drag
    +β = 5                    # the y-gradient of planetary PV
    +
    +nlayers = 2              # number of layers
    +f₀, g = 1, 1             # Coriolis parameter and gravitational constant
    +H = [0.2, 0.8]           # the rest depths of each layer
    +ρ = [4.0, 5.0]           # the density of each layer
    +
    +U = zeros(nlayers)       # the imposed mean zonal flow in each layer
    +U[1] = 1.0
    +U[2] = 0.0

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,
    +                            dt, stepper, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

    device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    seed!(1234) # reset of the random number generator for reproducibility
    +q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
    +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft  only in dims=1, 2
    +q₀  = irfft(q₀h, grid.nx, (1, 2))                 # apply irfft only in dims=1, 2
    +
    +MultiLayerQG.set_q!(prob, q₀)

    Diagnostics

    Create Diagnostics – energies function is imported at the top.

    E = Diagnostic(MultiLayerQG.energies, prob; nsteps)
    +diags = [E] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_2layer"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "2layer.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid
    +
    +  @. vars.qh = sol
    +  streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +  @. vars.uh = -im * grid.l * vars.ψh
    +  invtransform!(vars.u, vars.uh, params)
    +
    +  return vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t))
    +
    +q₁ = Observable(Array(vars.q[:, :, 1]))
    +ψ₁ = Observable(Array(vars.ψ[:, :, 1]))
    +q₂ = Observable(Array(vars.q[:, :, 2]))
    +ψ₂ = Observable(Array(vars.ψ[:, :, 2]))
    +
    +function compute_levels(maxf, nlevels=8)
    +  # -max(|f|):...:max(|f|)
    +  levelsf  = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))
    +
    +  # only positive
    +  levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))
    +
    +  # only negative
    +  levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))
    +
    +  return levelsf, levelsf⁺, levelsf⁻
    +end
    +
    +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))
    +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))
    +
    +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)
    +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)
    +
    +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])
    +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])
    +PE  = Observable(Point2f[(μ * E.t[1], E.data[1][2])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...)
    +
    +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...)
    +
    +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...)
    +
    +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...)
    +
    +axKE = Axis(fig[1, 3],
    +            xlabel = "μ t",
    +            ylabel = "KE",
    +            title = title_KE,
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +axPE = Axis(fig[2, 3],
    +            xlabel = "μ t",
    +            ylabel = "PE",
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +heatmap!(axq₁, x, y, q₁; colormap = :balance)
    +
    +heatmap!(axq₂, x, y, q₂; colormap = :balance)
    +
    +contourf!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁺, color=:black)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁻, color=:black, linestyle = :dash)
    +
    +contourf!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁺, color=:black)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁻, color=:black, linestyle = :dash)
    +
    +ke₁ = lines!(axKE, KE₁; linewidth = 3)
    +ke₂ = lines!(axKE, KE₂; linewidth = 3)
    +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"])
    +
    +lines!(axPE, PE; linewidth = 3)
    +
    +fig

    Time-stepping the Problem forward

    Finally, we time-step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min",
    +                   clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q₁[] = vars.q[:, :, 1]
    +  ψ₁[] = vars.ψ[:, :, 1]
    +  q₂[] = vars.q[:, :, 2]
    +  ψ₂[] = vars.ψ[:, :, 2]
    +
    +  maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])
    +  maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])
    +
    +  KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))
    +  KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))
    +  PE[]  = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))
    +
    +  title_KE[] = @sprintf("μ t = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  MultiLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min
    +step: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.26 min
    +step: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.47 min
    +step: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.68 min
    +step: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.89 min
    +step: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 1.10 min
    +step: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 1.32 min
    +step: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.55 min
    +step: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.80 min
    +step: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 2.03 min
    +step: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 2.25 min
    +step: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 2.48 min
    +step: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 2.70 min
    +step: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 2.89 min
    +step: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 3.09 min
    +step: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 3.28 min
    +step: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 3.46 min
    +step: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 3.64 min
    +step: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 3.82 min
    +step: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 3.99 min
    +step: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 4.17 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/v0.15.3/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 new file mode 100644 index 00000000..96e7365a Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/v0.15.3/literated/singlelayerqg_betadecay-20.png b/v0.15.3/literated/singlelayerqg_betadecay-20.png new file mode 100644 index 00000000..97644316 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_betadecay-20.png differ diff --git a/v0.15.3/literated/singlelayerqg_betadecay-33.png b/v0.15.3/literated/singlelayerqg_betadecay-33.png new file mode 100644 index 00000000..ed3f1718 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_betadecay-33.png differ diff --git a/v0.15.3/literated/singlelayerqg_betadecay.mp4 b/v0.15.3/literated/singlelayerqg_betadecay.mp4 new file mode 100644 index 00000000..a3185880 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_betadecay.mp4 differ diff --git a/v0.15.3/literated/singlelayerqg_betadecay/index.html b/v0.15.3/literated/singlelayerqg_betadecay/index.html new file mode 100644 index 00000000..acfb6703 --- /dev/null +++ b/v0.15.3/literated/singlelayerqg_betadecay/index.html @@ -0,0 +1,131 @@ + +Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Decaying barotropic QG beta-plane turbulence

    An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.04           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.0       # bottom drag

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.08 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                          # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. q₀h = ifelse(K < 6  * 2π/L, 0, q₀h)
    +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)
    +@. q₀h[1, :] = 0    # remove any power from zonal wavenumber k=0
    +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀
    +q₀ = irfft(q₀h, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, q₀)

    Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (800, 360))
    +
    +axq = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial vorticity ∂v/∂x-∂u/∂y",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +axψ = Axis(fig[1, 2];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial streamfunction ψ",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +heatmap!(axq, x, y, Array(vars.q); colormap = :balance)
    +
    +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We plot the vorticity and streamfunction and their corresponding zonal mean structure.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(800, 720))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +q  = Observable(Array(vars.q))
    +ψ  = Observable(Array(vars.ψ))
    +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))
    +ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-12, 12))
    +
    +levels = collect(range(-0.7, stop=0.7, length=20))
    +
    +contourf!(axψ, x, y, ψ;
    +         levels, colormap = :viridis, colorrange = (-0.35, 0.35))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₘ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 12) do j
    +  if j % round(Int, nsteps/nsubs / 4) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +  q̄ₘ[] = vec(mean(vars.q, dims=1))
    +  ūₘ[] = vec(mean(vars.u, dims=1))
    +
    +  title_q[] = @sprintf("vorticity, t = %.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min
    +step: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.25 min
    +step: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.45 min
    +step: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.64 min
    +step: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.83 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/singlelayerqg_betaforced-23.png b/v0.15.3/literated/singlelayerqg_betaforced-23.png new file mode 100644 index 00000000..b48791f7 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_betaforced-23.png differ diff --git a/v0.15.3/literated/singlelayerqg_betaforced-48.png b/v0.15.3/literated/singlelayerqg_betaforced-48.png new file mode 100644 index 00000000..be9586f6 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_betaforced-48.png differ diff --git a/v0.15.3/literated/singlelayerqg_betaforced.mp4 b/v0.15.3/literated/singlelayerqg_betaforced.mp4 new file mode 100644 index 00000000..a8e53e9e Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_betaforced.mp4 differ diff --git a/v0.15.3/literated/singlelayerqg_betaforced/index.html b/v0.15.3/literated/singlelayerqg_betaforced/index.html new file mode 100644 index 00000000..0e429dac --- /dev/null +++ b/v0.15.3/literated/singlelayerqg_betaforced/index.html @@ -0,0 +1,199 @@ + +Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
    +
    +using Statistics: mean
    +using LinearAlgebra: ldiv!
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000          # total number of timesteps
    + save_substeps = 10      # number of timesteps after which output is saved
    +

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                             calcF=calcF!, stochastic=true)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostic – energy and enstrophy are functions imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  vars, grid, sol = prob.vars, prob.grid, prob.sol
    +
    +  @. vars.qh = sol
    +
    +  SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +
    +  ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)
    +
    +  return Array(vars.u)
    +end
    +
    +output = Output(prob, filename, (:qh, get_sol), (:u, get_u))

    We first save the problem's grid and other parameters so we can use them later.

    saveproblem(output)

    and then call saveoutput(output) once to save the initial state.

    saveoutput(output)

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +while clock.step <= nsteps
    +  if clock.step % 50save_substeps == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +    clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  stepforward!(prob, diags, save_substeps)
    +  SingleLayerQG.updatevars!(prob)
    +
    +  if clock.step % save_substeps == 0
    +    saveoutput(output)
    +  end
    +end
    +
    +savediagnostic(E, "energy", output.path)
    +savediagnostic(Z, "enstrophy", output.path)
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 0500, t: 25, cfl: 0.49, E: 0.0181, Q: 2.6734, walltime: 0.04 min
    +step: 1000, t: 50, cfl: 0.75, E: 0.0294, Q: 2.9033, walltime: 0.06 min
    +step: 1500, t: 75, cfl: 0.72, E: 0.0366, Q: 2.8531, walltime: 0.09 min
    +step: 2000, t: 100, cfl: 0.76, E: 0.0405, Q: 2.8524, walltime: 0.11 min
    +step: 2500, t: 125, cfl: 0.90, E: 0.0432, Q: 2.7659, walltime: 0.14 min
    +step: 3000, t: 150, cfl: 0.74, E: 0.0461, Q: 2.8456, walltime: 0.16 min
    +step: 3500, t: 175, cfl: 0.84, E: 0.0458, Q: 2.5441, walltime: 0.19 min
    +step: 4000, t: 200, cfl: 0.83, E: 0.0463, Q: 2.6039, walltime: 0.22 min
    +step: 4500, t: 225, cfl: 0.78, E: 0.0468, Q: 2.7381, walltime: 0.24 min
    +step: 5000, t: 250, cfl: 0.95, E: 0.0475, Q: 2.7058, walltime: 0.27 min
    +step: 5500, t: 275, cfl: 0.72, E: 0.0481, Q: 2.8522, walltime: 0.29 min
    +step: 6000, t: 300, cfl: 0.83, E: 0.0481, Q: 2.8540, walltime: 0.32 min
    +step: 6500, t: 325, cfl: 0.87, E: 0.0479, Q: 2.8534, walltime: 0.34 min
    +step: 7000, t: 350, cfl: 0.81, E: 0.0474, Q: 2.7300, walltime: 0.37 min
    +step: 7500, t: 375, cfl: 0.96, E: 0.0469, Q: 2.6818, walltime: 0.40 min
    +step: 8000, t: 400, cfl: 0.74, E: 0.0466, Q: 2.6955, walltime: 0.42 min
    +

    Load saved output and visualize

    We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

    file = jldopen(output.path)
    +
    +iterations = parse.(Int, keys(file["snapshots/t"]))
    +t = [file["snapshots/t/$i"] for i ∈ iterations]
    +
    +qh = [file["snapshots/qh/$i"] for i ∈ iterations]
    +u  = [file["snapshots/u/$i"] for i ∈ iterations]
    +
    +E_t = file["diagnostics/energy/t"]
    +Z_t = file["diagnostics/enstrophy/t"]
    +E_data = file["diagnostics/energy/data"]
    +Z_data = file["diagnostics/enstrophy/data"]
    +
    +x,  y  = file["grid/x"],  file["grid/y"]
    +nx, ny = file["grid/nx"], file["grid/ny"]
    +Lx, Ly = file["grid/Lx"], file["grid/Ly"]
    +
    +close(file)

    We create a figure using Makie's Observables

    n = Observable(1)
    +
    +qₙ = @lift irfft(qh[$n], nx)
    +ψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)
    +q̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))
    +ūₙ = @lift vec(mean(u[$n], dims=1))
    +
    +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$n])
    +
    +energy    = Observable([Point2f(E_t[1], E_data[1])])
    +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.055)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 3.1)))
    +
    +heatmap!(axq, x, y, qₙ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +levels = collect(-0.32:0.04:0.32)
    +
    +contourf!(axψ, x, y, ψₙ;
    +          levels, colormap = :viridis, colorrange = (-0.22, 0.22))
    +contour!(axψ, x, y, ψₙ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₙ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₙ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, energy; linewidth = 3)
    +lines!(axZ, enstrophy; linewidth = 3, color = :red)
    +
    +fig

    We are now ready to animate all saved output.

    frames = 1:length(t)
    +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 16) do i
    +  n[] = i
    +
    +  energy[]    = push!(energy[],    Point2f(μ * E_t[i], E_data[i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
    +end


    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png b/v0.15.3/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png new file mode 100644 index 00000000..e1500836 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png differ diff --git a/v0.15.3/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/v0.15.3/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html new file mode 100644 index 00000000..ee1b14c2 --- /dev/null +++ b/v0.15.3/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -0,0 +1,93 @@ + +SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

    SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

    We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using GeophysicalFlows: peakedisotropicspectrum
    +using LinearAlgebra: ldiv!
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length
    +deformation_radius = 0.35   # the deformation radius
    +
    +# Then we pick the time-stepper parameters
    +    dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.

    For both problems we use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    stepper="FilteredRK4"
    +
    +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)
    +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)

    Setting initial conditions

    For initial condition we construct a relative vorticity with energy most energy around total wavenumber $k_0$.

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)

    SingleLayerQG allows us to set up the initial $q$ for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.

    ∇²ψ₀h = rfft(∇²ψ₀)
    +ψ₀h = @. 0 * ∇²ψ₀h
    +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)

    and then use the streamfunction to compute the corresponding $q_0$ for each problem,

    q₀_bqg   = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)
    +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)

    Now we can initialize our problems with the same flow.

    SingleLayerQG.set_q!(prob_bqg, q₀_bqg)
    +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)

    Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    function relativevorticity(prob)
    +  vars, grid = prob.vars, prob.grid
    +
    +  ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)
    +
    +  return vars.q
    +end
    +
    +x,  y  = prob_bqg.grid.x,  prob_bqg.grid.y
    +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +t_bqg = Observable(prob_bqg.clock.t)
    +t_eqbqg = Observable(prob_eqbqg.clock.t)
    +
    +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg)
    +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg)
    +
    +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)
    +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)
    +
    +ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))
    +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))
    +
    +heatmap!(ax1, x, y, ζ_bqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +heatmap!(ax2, x, y, ζ_eqbqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Time-stepping the Problem forward

    Now we time-step both problems forward and animate the relative vorticity in each case.

    startwalltime = time()
    +
    +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
    +
    +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)
    +    println(log_bqg)
    +
    +    log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)
    +    println(log_eqbqg)
    +  end
    +
    +  stepforward!(prob_bqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_bqg)
    +
    +  stepforward!(prob_eqbqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_eqbqg)
    +
    +  t_bqg[] = prob_bqg.clock.t
    +  t_eqbqg[] = prob_eqbqg.clock.t
    +  ζ_bqg[] = relativevorticity(prob_bqg)
    +  ζ_eqbqg[] = relativevorticity(prob_eqbqg)
    +end
    barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +equivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.01 min
    +barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.09 min
    +equivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.09 min
    +barotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.16 min
    +equivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.16 min
    +barotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.23 min
    +equivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.23 min
    +barotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.30 min
    +equivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.30 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/singlelayerqg_decaying_topography-19.png b/v0.15.3/literated/singlelayerqg_decaying_topography-19.png new file mode 100644 index 00000000..5bacd88d Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_decaying_topography-19.png differ diff --git a/v0.15.3/literated/singlelayerqg_decaying_topography-24.png b/v0.15.3/literated/singlelayerqg_decaying_topography-24.png new file mode 100644 index 00000000..71773661 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_decaying_topography-24.png differ diff --git a/v0.15.3/literated/singlelayerqg_decaying_topography.mp4 b/v0.15.3/literated/singlelayerqg_decaying_topography.mp4 new file mode 100644 index 00000000..41b1cd59 Binary files /dev/null and b/v0.15.3/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/v0.15.3/literated/singlelayerqg_decaying_topography/index.html b/v0.15.3/literated/singlelayerqg_decaying_topography/index.html new file mode 100644 index 00000000..a3504e8b --- /dev/null +++ b/v0.15.3/literated/singlelayerqg_decaying_topography/index.html @@ -0,0 +1,102 @@ + +Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

    Decaying barotropic QG turbulence over topography

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size

    Define the topographic potential vorticity, $\eta = f_0 h(x, y)/H$. The topography here is an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$.

    σx, σy = 0.4, 0.8
    +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    The topophic PV is prescribed via keyword argument eta.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,
    +                             dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    η = Array(params.eta)
    +
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "topographic PV η=f₀h/H",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +contourf!(ax, x, y, η;
    +          levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
    +
    +fig

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.04 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. qih = ifelse(K < 6  * 2π/L, 0, qih)
    +@. qih = ifelse(K > 12 * 2π/L, 0, qih)
    +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid))  # normalize qi to have energy E₀
    +qi = irfft(qih, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, qi)

    Let's plot the initial vorticity and streamfunction.

    q = Observable(Array(vars.q))
    +ψ = Observable(Array(vars.ψ))
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y")
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +title_ψ = Observable("initial streamfunction ψ")
    +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
    +
    +hm = heatmap!(axq, x, y, q;
    +              colormap = :balance, colorrange = (-8, 8))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +levels = collect(range(-0.28, stop=0.28, length=11))
    +
    +hc = contourf!(axψ, x, y, ψ;
    +               levels, colormap = :viridis, colorrange = (-0.28, 0.28),
    +               extendlow = :auto, extendhigh = :auto)
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +Colorbar(fig[1, 4], hc)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files.

    filepath = "."
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.

    contour!(axq, x, y, η;
    +         levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))
    +
    +contour!(axq, x, y, η;
    +         levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
    +
    +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +title_ψ[] = "streamfunction ψ"
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +
    +  title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t)
    +  title_ψ[] = "streamfunction ψ"
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.40 min
    +step: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.74 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/sqg_ellipticalvortex.mp4 b/v0.15.3/literated/sqg_ellipticalvortex.mp4 new file mode 100644 index 00000000..5bc1f066 Binary files /dev/null and b/v0.15.3/literated/sqg_ellipticalvortex.mp4 differ diff --git a/v0.15.3/literated/surfaceqg_decaying-19.png b/v0.15.3/literated/surfaceqg_decaying-19.png new file mode 100644 index 00000000..e80ed661 Binary files /dev/null and b/v0.15.3/literated/surfaceqg_decaying-19.png differ diff --git a/v0.15.3/literated/surfaceqg_decaying-34.png b/v0.15.3/literated/surfaceqg_decaying-34.png new file mode 100644 index 00000000..d56bafd3 Binary files /dev/null and b/v0.15.3/literated/surfaceqg_decaying-34.png differ diff --git a/v0.15.3/literated/surfaceqg_decaying-39.png b/v0.15.3/literated/surfaceqg_decaying-39.png new file mode 100644 index 00000000..7c18f92f Binary files /dev/null and b/v0.15.3/literated/surfaceqg_decaying-39.png differ diff --git a/v0.15.3/literated/surfaceqg_decaying/index.html b/v0.15.3/literated/surfaceqg_decaying/index.html new file mode 100644 index 00000000..2d2aace9 --- /dev/null +++ b/v0.15.3/literated/surfaceqg_decaying/index.html @@ -0,0 +1,133 @@ + +Decaying Surface QG turbulence · GeophysicalFlows.jl

    Decaying Surface QG turbulence

    A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 256                       # 2D resolution = n²
    +stepper = "FilteredETDRK4"          # timestepper
    +     dt = 0.03                      # timestep
    +     tf = 60                        # length of time for simulation
    + nsteps = Int(tf / dt)              # total number of time-steps
    + nsubs  = round(Int, nsteps/100)    # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

     L = 2π        # domain size
    + ν = 1e-19     # hyper-viscosity coefficient
    +nν = 4         # hyper-viscosity order

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    We initialize the buoyancy equation with an elliptical vortex.

    X, Y = gridpoints(grid)
    +b₀ = @. exp(-(X^2 + 4Y^2))
    +
    +SurfaceQG.set_b!(prob, b₀)

    Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (500, 500))
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "buoyancy bₛ",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +hm = heatmap!(ax, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +fig

    Diagnostics

    Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

    B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
    +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
    +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
    +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

    base_filename = string("SurfaceQG_decaying_n_", n)
    "SurfaceQG_decaying_n_256"

    We choose folder for outputing .jld2 files and snapshots (.png files).

    datapath = "./"
    +plotpath = "./"
    +
    +dataname = joinpath(datapath, base_filename)
    +plotname = joinpath(plotpath, base_filename)

    Do some basic file management,

    if !isdir(plotpath); mkdir(plotpath); end
    +if !isdir(datapath); mkdir(datapath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.

    b = Observable(Array(vars.b))
    +
    +ke = Observable([Point2f(KE.t[1], KE.data[1])])
    +b² = Observable([Point2f(B.t[1], B.data[1])])
    +
    +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t))
    +
    +fig = Figure(resolution = (900, 600))
    +
    +axb = Axis(fig[1:2, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_b,
    +           aspect = 1,
    +           limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 2];
    +           xlabel = "t",
    +           limits = ((0, tf), (0, 2e-2)))
    +
    +heatmap!(axb, x, y, b;
    +         colormap = :deep, colorrange = (0, 1))
    +
    +hE  = lines!(axE, ke; linewidth = 3)
    +hb² = lines!(axE, b²; linewidth = 3)
    +
    +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
    +
    +fig

    Time-stepping the Problem forward and create animation by updating the plot.

    startwalltime = time()
    +
    +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
    +  if j % (500 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, (time()-startwalltime)/60)
    +
    +    log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e",
    +              B.data[B.i], Dᵇ.data[Dᵇ.i])
    +
    +    println(log1)
    +
    +    println(log2)
    +  end
    +
    +  b[] = vars.b
    +
    +  ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))
    +  b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))
    +
    +  title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SurfaceQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
    +step: 0500, t: 15.0, cfl: 0.588, walltime: 0.11 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11
    +step: 1000, t: 30.0, cfl: 0.571, walltime: 0.19 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09
    +step: 1500, t: 45.0, cfl: 0.577, walltime: 0.28 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08
    +step: 2000, t: 60.0, cfl: 0.574, walltime: 0.37 min
    +buoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08
    +

    Let's see how all flow fields look like at the end of the simulation.

    fig = Figure(resolution = (800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +
    +hb = heatmap!(axb, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[2, 1], hb, vertical = false)
    +
    +hu = heatmap!(axu, x, y, Array(vars.u);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
    +
    +Colorbar(fig[2, 2], hu, vertical = false)
    +
    +hv = heatmap!(axv, x, y, Array(vars.v);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
    +
    +Colorbar(fig[2, 3], hv, vertical = false)
    +
    +fig

    Save

    We can save the output at the end of the simulation by calling

    saveoutput(out)

    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/twodnavierstokes_decaying-20.png b/v0.15.3/literated/twodnavierstokes_decaying-20.png new file mode 100644 index 00000000..69596f38 Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_decaying-20.png differ diff --git a/v0.15.3/literated/twodnavierstokes_decaying-33.png b/v0.15.3/literated/twodnavierstokes_decaying-33.png new file mode 100644 index 00000000..d7cf88ee Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_decaying-33.png differ diff --git a/v0.15.3/literated/twodnavierstokes_decaying-42.png b/v0.15.3/literated/twodnavierstokes_decaying-42.png new file mode 100644 index 00000000..714aa19a Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_decaying-42.png differ diff --git a/v0.15.3/literated/twodnavierstokes_decaying/index.html b/v0.15.3/literated/twodnavierstokes_decaying/index.html new file mode 100644 index 00000000..86f94a61 --- /dev/null +++ b/v0.15.3/literated/twodnavierstokes_decaying/index.html @@ -0,0 +1,97 @@ + +2D decaying turbulence · GeophysicalFlows.jl

    2D decaying turbulence

    A simulation of decaying two-dimensional turbulence.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using Random: seed!
    +using GeophysicalFlows: peakedisotropicspectrum

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length

    Then we pick the time-stepper parameters

        dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

    Next we define some shortcuts for convenience.

    sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
    +TwoDNavierStokes.set_ζ!(prob, ζ₀)

    Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "initial vorticity",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ');
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
    +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingTwoDNavierStokes"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    +saveproblem(out)

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t))
    +
    +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])
    +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "t",
    +           limits = ((-0.5, 40.5), (0, 1.05)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
    +
    +fig

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min",
    +        clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))
    +  enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))
    +
    +  title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.03 min
    +step: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.11 min
    +step: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.15 min
    +step: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.19 min
    +step: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.23 min
    +

    Radial energy spectrum

    After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

    E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
    +Eh = rfft(E)                         # Fourier transform of energy density
    +
    +# compute radial specturm of `Eh`
    +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)

    and we plot it.

    lines(kr, vec(abs.(Ehr));
    +      linewidth = 2,
    +      axis = (xlabel = L"k_r",
    +              ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta",
    +              xscale = log10,
    +              yscale = log10,
    +              title = "Radial energy spectrum",
    +              limits = ((0.3, 1e2), (1e0, 1e5))))


    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing-23.png b/v0.15.3/literated/twodnavierstokes_stochasticforcing-23.png new file mode 100644 index 00000000..3f221142 Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_stochasticforcing-23.png differ diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing-32.png b/v0.15.3/literated/twodnavierstokes_stochasticforcing-32.png new file mode 100644 index 00000000..50d9fd83 Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_stochasticforcing-32.png differ diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing/index.html b/v0.15.3/literated/twodnavierstokes_stochasticforcing/index.html new file mode 100644 index 00000000..43a4f11f --- /dev/null +++ b/v0.15.3/literated/twodnavierstokes_stochasticforcing/index.html @@ -0,0 +1,100 @@ + +2D forced-dissipative turbulence · GeophysicalFlows.jl

    2D forced-dissipative turbulence

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π             # grid resolution and domain length
    + ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0             # linear drag coefficient
    +    dt = 0.005               # timestep
    +nsteps = 4000                # total number of steps
    + nsubs = 20                  # number of steps between each plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x, y = grid.x, grid.y

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy budget.

    E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
    +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
    +
    +energy = Observable(Point2f[(μ * E.t[1], E.data[1])])
    +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "μ t",
    +           limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["energy E(t)", "enstrophy Z(t) / k_f²"])
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
    +  if j % (1000/nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))
    +
    +  title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
    +step: 1000, t: 5, cfl: 0.40, E: 0.2971, Z: 36.2188, walltime: 0.19 min
    +step: 2000, t: 10, cfl: 0.49, E: 0.4138, Z: 37.5536, walltime: 0.37 min
    +step: 3000, t: 15, cfl: 0.45, E: 0.4564, Z: 36.3428, walltime: 0.54 min
    +step: 4000, t: 20, cfl: 0.55, E: 0.4775, Z: 37.3600, walltime: 0.72 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-22.png b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-22.png new file mode 100644 index 00000000..3f221142 Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-22.png differ diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-33.png b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-33.png new file mode 100644 index 00000000..4fa4bdd0 Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-33.png differ diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-35.png b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-35.png new file mode 100644 index 00000000..d255dccc Binary files /dev/null and b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets-35.png differ diff --git a/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets/index.html new file mode 100644 index 00000000..dcf41db6 --- /dev/null +++ b/v0.15.3/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -0,0 +1,161 @@ + +2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

    2D forced-dissipative turbulence budgets

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π              # grid resolution and domain length
    + ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0              # linear drag coefficient
    +dt, tf = 0.005, 0.2 / μ       # timestep and final time
    +    nt = round(Int, tf / dt)  # total timesteps
    +    ns = 4                    # how many intermediate times we want to plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

    E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
    +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
    +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
    +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy,                            prob, nsteps=nt) # enstrophy
    +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity,  prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work,                       prob, nsteps=nt) # enstrophy work input by forcing
    +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +for i = 1:ns
    +  stepforward!(prob, diags, round(Int, nt/ns))
    +
    +  TwoDNavierStokes.updatevars!(prob)
    +
    +  cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +  log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t,
    +        cfl, (time()-startwalltime)/60)
    +
    +  println(log)
    +end
    step: 0100, t: 0.5, cfl: 0.168, walltime: 0.02 min
    +step: 0200, t: 1.0, cfl: 0.238, walltime: 0.05 min
    +step: 0300, t: 1.5, cfl: 0.304, walltime: 0.06 min
    +step: 0400, t: 2.0, cfl: 0.301, walltime: 0.08 min
    +

    Plot

    Now let's see the final snapshot of the vorticity.

    fig = Figure(resolution = (400, 400))
    +
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ);
    +         colormap = :viridis, colorrange = (-25, 25))
    +
    +fig

    And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +TwoDNavierStokes.updatevars!(prob)
    +
    +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags
    +
    +clocktime = round(μ * clock.t, digits=2)
    +
    +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency
    +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency
    +
    +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]
    +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]
    +
    +residual_E = dEdt_computed - dEdt_numerical
    +residual_Z = dZdt_computed - dZdt_numerical
    +
    +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)
    +
    +t = E.t[2:E.i]
    +
    +fig = Figure(resolution = (800, 1100))
    +
    +axis_kwargs = (xlabel = "μ t", )
    +
    +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...)
    +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...)
    +ax3E = Axis(fig[5, 1]; axis_kwargs...)
    +
    +ax1Z = Axis(fig[1, 2]; axis_kwargs...)
    +ax2Z = Axis(fig[3, 2]; axis_kwargs...)
    +ax3Z = Axis(fig[5, 2]; axis_kwargs...)
    +
    +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i];   linestyle = :solid)
    +hε  = lines!(ax1E, t, ε .+ 0t;     linestyle = :dash)
    +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)
    +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 1],
    +       [hWᵋ, hε, hDᵋ, hRᵋ],
    +       ["energy work, Wᵋ", "ensemble mean energy work, <Wᵋ>", "dissipation, Dᵋ", "drag, Rᵋ = - 2μE"])
    +
    +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
    +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 1],
    +       [hc, hn],
    +       ["computed Wᵋ-Dᵋ", "numerical dE/dt"])
    +
    +hr = lines!(ax3E, t, residual_E)
    +
    +Legend(fig[6, 1],
    +       [hr],
    +       ["residual"])
    +
    +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i];  linestyle = :solid)
    +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t;    linestyle = :dash)
    +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)
    +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 2],
    +       [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
    +       ["enstrophy work, Wᶻ", "ensemble mean enstophy work, <Wᶻ>", "dissipation, Dᶻ", "drag, Rᶻ = - 2μZ"])
    +
    +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
    +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 2],
    +       [hcᶻ, hnᶻ],
    +       ["computed Wᶻ-Dᶻ", "numerical dZ/dt"])
    +
    +hrᶻ = lines!(ax3Z, t, residual_Z)
    +
    +Legend(fig[6, 2],
    +       [hr],
    +       ["residual"])
    +
    +fig


    This page was generated using Literate.jl.

    diff --git a/v0.15.3/literated/twodturb.mp4 b/v0.15.3/literated/twodturb.mp4 new file mode 100644 index 00000000..f97687be Binary files /dev/null and b/v0.15.3/literated/twodturb.mp4 differ diff --git a/v0.15.3/literated/twodturb_forced.mp4 b/v0.15.3/literated/twodturb_forced.mp4 new file mode 100644 index 00000000..5b5b9852 Binary files /dev/null and b/v0.15.3/literated/twodturb_forced.mp4 differ diff --git a/v0.15.3/modules/barotropicqgql/index.html b/v0.15.3/modules/barotropicqgql/index.html new file mode 100644 index 00000000..c3133b03 --- /dev/null +++ b/v0.15.3/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

    BarotropicQGQL

    Basic Equations

    This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

    \[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

    where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g.,

    As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

    \[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

    The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

    \[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

    Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

    The linear operator is constructed in Equation

    GeophysicalFlows.BarotropicQGQL.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    Nonlinear term is computed via calcN! function.

    source

    and the nonlinear terms are computed via

    GeophysicalFlows.BarotropicQGQL.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    The kinetic energy of the fluid is obtained via:

    while the enstrophy via:

    Other diagnostic include: dissipation, drag, and work.

    Examples

    • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
    diff --git a/v0.15.3/modules/multilayerqg/index.html b/v0.15.3/modules/multilayerqg/index.html new file mode 100644 index 00000000..df29f253 --- /dev/null +++ b/v0.15.3/modules/multilayerqg/index.html @@ -0,0 +1,27 @@ + +MultiLayerQG · GeophysicalFlows.jl

    MultiLayerQG

    Basic Equations

    This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

    The QGPV in each layer is

    \[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

    where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

    \[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

    with

    \[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = g \frac{\rho_{j+1} - \rho_j}{\rho_{j+1}} .\]

    In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

    \[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

    where

    \[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ + F_{3/2, 2} & -(F_{3/2, 2}+F_{5/2, 2}) & F_{5/2, 2} & & \vdots\\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

    Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

    \[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

    with

    \[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

    Implementation

    Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

    One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

    The equations of motion are time-stepped forward in Fourier space:

    \[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

    In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

    The linear operator is constructed in Equation

    GeophysicalFlows.MultiLayerQG.EquationFunction
    Equation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcN!.

    source
    GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
    hyperviscosity(params, grid)

    Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

    \[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

    source

    The nonlinear terms are computed via

    GeophysicalFlows.MultiLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Linearized MultiLayerQG dynamics

    The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

    Helper functions

    GeophysicalFlows.MultiLayerQG.set_ψ!Function
    set_ψ!(params, vars, grid, sol, ψ)
    +set_ψ!(prob, ψ)

    Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

    source

    Diagnostics

    The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

    GeophysicalFlows.MultiLayerQG.energiesFunction
    energies(vars, params, grid, sol)
    +energies(prob)

    Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

    The kinetic energy at the $j$-th fluid layer is

    \[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

    while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

    \[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

    source

    The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

    GeophysicalFlows.MultiLayerQG.fluxesFunction
    fluxes(vars, params, grid, sol)
    +fluxes(prob)

    Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

    The lateral eddy fluxes within the $j$-th fluid layer are

    \[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

    while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

    \[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

    source

    Examples

    diff --git a/v0.15.3/modules/singlelayerqg/index.html b/v0.15.3/modules/singlelayerqg/index.html new file mode 100644 index 00000000..805c7d00 --- /dev/null +++ b/v0.15.3/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

    SingleLayerQG

    Basic Equations

    This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

    \[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

    where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

    The dynamical variable is $q$. Thus, the equation solved by the module is:

    \[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

    The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SingleLayerQG.EquationFunction
    Equation(params::BarotropicQGParams, grid)

    Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    The nonlinear term is computed via calcN! function.

    source
    Equation(params::EquivalentBarotropicQGParams, grid)

    Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

    The nonlinear term is computed via calcN! function.

    source

    The nonlinear terms are computed via

    GeophysicalFlows.SingleLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    The kinetic energy of the fluid is computed via:

    GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    source

    while the potential energy, for an equivalent barotropic fluid, is computed via:

    GeophysicalFlows.SingleLayerQG.potential_energyFunction
    potential_energy(prob)

    Return the problem's (prob) domain-averaged potential energy of the fluid,

    \[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

    source

    The total energy is:

    GeophysicalFlows.SingleLayerQG.energyFunction
    energy(prob)

    Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

    source

    Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

    Examples

    diff --git a/v0.15.3/modules/surfaceqg/index.html b/v0.15.3/modules/surfaceqg/index.html new file mode 100644 index 00000000..bd6b7277 --- /dev/null +++ b/v0.15.3/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

    SurfaceQG

    Basic Equations

    This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

    \[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

    The SQG model evolves the surface buoyancy,

    \[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

    Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

    \[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

    with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

    These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

    \[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

    where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

    Implementation

    The buoyancy equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

    The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SurfaceQG.EquationFunction
    Equation(params, grid)

    Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

    \[L = - ν |𝐤|^{2 n_ν} .\]

    Plain old viscocity corresponds to $n_ν=1$.

    The nonlinear term is computed via function calcN!().

    source

    while the nonlinear terms via

    GeophysicalFlows.SurfaceQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    Some useful diagnostics are kinetic energy and buoyancy variance.

    GeophysicalFlows.SurfaceQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    In SQG, this is identical to half the domain-averaged surface buoyancy variance.

    source
    GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
    buoyancy_variance(prob)

    Return the buoyancy variance,

    \[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

    In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

    source

    Other diagnostic include: buoyancy_dissipation and buoyancy_work.

    Examples

    • examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.

      Capet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.

    diff --git a/v0.15.3/modules/twodnavierstokes/index.html b/v0.15.3/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..4d8c39a0 --- /dev/null +++ b/v0.15.3/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

    TwoDNavierStokes

    Basic Equations

    This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

    \[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

    where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.TwoDNavierStokes.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

    \[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

    Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

    The nonlinear term is computed via the function calcN!.

    source

    The nonlinear terms are computed via calcN!,

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    Some useful diagnostics are:

    GeophysicalFlows.TwoDNavierStokes.energyFunction
    energy(prob)

    Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

    where $ψ$ is the streamfunction.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
    enstrophy(prob)

    Return the problem's (prob) domain-averaged enstrophy,

    \[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

    Examples

    diff --git a/v0.15.3/search_index.js b/v0.15.3/search_index.js new file mode 100644 index 00000000..97fc72d6 --- /dev/null +++ b/v0.15.3/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (JFM, 1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.03 min\nstep: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.11 min\nstep: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.15 min\nstep: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.19 min\nstep: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.23 min\n","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = g fracrho_j+1 - rho_jrho_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described in Capet et al., 2008. The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.\nCapet, X. et al., (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. J. Fluid Mech., 604, 165-174.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia> ]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Output\n ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}\n ├──── path: ./forcedbetaQLturb.jld2\n └── fields: Dict{Symbol, Function}(:sol => Main.var\"##313\".get_sol, :u => Main.var\"##313\".get_u)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.64, E: 0.0286, Q: 3.9616, walltime: 0.13 min\nstep: 2000, t: 100, cfl: 0.81, E: 0.0384, Q: 4.1193, walltime: 0.24 min\nstep: 3000, t: 150, cfl: 0.80, E: 0.0441, Q: 4.4990, walltime: 0.34 min\nstep: 4000, t: 200, cfl: 0.80, E: 0.0450, Q: 3.6810, walltime: 0.45 min\nstep: 5000, t: 250, cfl: 0.87, E: 0.0472, Q: 4.0671, walltime: 0.57 min\nstep: 6000, t: 300, cfl: 0.92, E: 0.0484, Q: 4.1866, walltime: 0.69 min\nstep: 7000, t: 350, cfl: 0.89, E: 0.0482, Q: 3.8817, walltime: 0.81 min\nstep: 8000, t: 400, cfl: 0.92, E: 0.0482, Q: 3.7857, walltime: 0.94 min\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that oftentimes this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\", \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min\nstep: 1000, t: 5, cfl: 0.40, E: 0.2971, Z: 36.2188, walltime: 0.19 min\nstep: 2000, t: 10, cfl: 0.49, E: 0.4138, Z: 37.5536, walltime: 0.37 min\nstep: 3000, t: 15, cfl: 0.45, E: 0.4564, Z: 36.3428, walltime: 0.54 min\nstep: 4000, t: 20, cfl: 0.55, E: 0.4775, Z: 37.3600, walltime: 0.72 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"../../../examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#multilayerqg_2layer_example","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀, g = 1, 1 # Coriolis parameter and gravitational constant\nH = [0.2, 0.8] # the rest depths of each layer\nρ = [4.0, 5.0] # the density of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min\nstep: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.26 min\nstep: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.47 min\nstep: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.68 min\nstep: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.89 min\nstep: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 1.10 min\nstep: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 1.32 min\nstep: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.55 min\nstep: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.80 min\nstep: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 2.03 min\nstep: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 2.25 min\nstep: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 2.48 min\nstep: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 2.70 min\nstep: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 2.89 min\nstep: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 3.09 min\nstep: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 3.28 min\nstep: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 3.46 min\nstep: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 3.64 min\nstep: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 3.82 min\nstep: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 3.99 min\nstep: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 4.17 min\n","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"step: 0100, t: 0.5, cfl: 0.168, walltime: 0.02 min\nstep: 0200, t: 1.0, cfl: 0.238, walltime: 0.05 min\nstep: 0300, t: 1.5, cfl: 0.304, walltime: 0.06 min\nstep: 0400, t: 2.0, cfl: 0.301, walltime: 0.08 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\", \"ensemble mean energy work, \", \"dissipation, Dᵋ\", \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\", \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\", \"ensemble mean enstophy work, \", \"dissipation, Dᶻ\", \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\", \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"../../../examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nequivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.01 min\nbarotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.09 min\nequivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.09 min\nbarotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.16 min\nequivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.16 min\nbarotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.23 min\nequivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.23 min\nbarotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.30 min\nequivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.30 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Tuple: array with density of each fluid layer\nH::Tuple: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Tuple: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to eta in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Tuple: array with density of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 12) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min\nstep: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.25 min\nstep: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.45 min\nstep: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.64 min\nstep: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.83 min\n","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Farrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. J. Atmos. Sci., 60, 2101-2118.\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. J. Atmos. Sci., 69 (5), 1633-1656.\nConstantinou, N. C., Farrell, B. F., and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. J. Atmos. Sci., 71 (5), 1818-1842.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. J. Fluid Mech., 146, 21-43.\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.GeophysicalFlows","category":"page"},{"location":"lib/functions/#GeophysicalFlows.GeophysicalFlows","page":"Functions","title":"GeophysicalFlows.GeophysicalFlows","text":"Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.\n\n\n\n\n\n","category":"module"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work\nGeophysicalFlows.TwoDNavierStokes.palinstrophy","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.palinstrophy","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.palinstrophy","text":"palinstrophy(prob)\n\nReturn the problem's (prob) domain-averaged palinstrophy,\n\nint frac12 bf ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n g = 1.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n ρ = Array{Float64}(1:nlayers),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\ng: Gravitational acceleration constant.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nρ: Density of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 0500, t: 25, cfl: 0.49, E: 0.0181, Q: 2.6734, walltime: 0.04 min\nstep: 1000, t: 50, cfl: 0.75, E: 0.0294, Q: 2.9033, walltime: 0.06 min\nstep: 1500, t: 75, cfl: 0.72, E: 0.0366, Q: 2.8531, walltime: 0.09 min\nstep: 2000, t: 100, cfl: 0.76, E: 0.0405, Q: 2.8524, walltime: 0.11 min\nstep: 2500, t: 125, cfl: 0.90, E: 0.0432, Q: 2.7659, walltime: 0.14 min\nstep: 3000, t: 150, cfl: 0.74, E: 0.0461, Q: 2.8456, walltime: 0.16 min\nstep: 3500, t: 175, cfl: 0.84, E: 0.0458, Q: 2.5441, walltime: 0.19 min\nstep: 4000, t: 200, cfl: 0.83, E: 0.0463, Q: 2.6039, walltime: 0.22 min\nstep: 4500, t: 225, cfl: 0.78, E: 0.0468, Q: 2.7381, walltime: 0.24 min\nstep: 5000, t: 250, cfl: 0.95, E: 0.0475, Q: 2.7058, walltime: 0.27 min\nstep: 5500, t: 275, cfl: 0.72, E: 0.0481, Q: 2.8522, walltime: 0.29 min\nstep: 6000, t: 300, cfl: 0.83, E: 0.0481, Q: 2.8540, walltime: 0.32 min\nstep: 6500, t: 325, cfl: 0.87, E: 0.0479, Q: 2.8534, walltime: 0.34 min\nstep: 7000, t: 350, cfl: 0.81, E: 0.0474, Q: 2.7300, walltime: 0.37 min\nstep: 7500, t: 375, cfl: 0.96, E: 0.0469, Q: 2.6818, walltime: 0.40 min\nstep: 8000, t: 400, cfl: 0.74, E: 0.0466, Q: 2.6955, walltime: 0.42 min\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"n = Observable(1)\n\nqₙ = @lift irfft(qh[$n], nx)\nψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)\nq̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))\nūₙ = @lift vec(mean(u[$n], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$n])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, qₙ;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψₙ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψₙ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₙ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₙ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 16) do i\n n[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"../../../examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. 1995, J. Fluid Mech.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"\"SurfaceQG_decaying_n_256\"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16\nstep: 0500, t: 15.0, cfl: 0.588, walltime: 0.11 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11\nstep: 1000, t: 30.0, cfl: 0.571, walltime: 0.19 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09\nstep: 1500, t: 45.0, cfl: 0.577, walltime: 0.28 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08\nstep: 2000, t: 60.0, cfl: 0.574, walltime: 0.37 min\nbuoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08\n","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Siegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.\nBisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119. doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 2022, doi:10.1007/s00205-022-01825-w.\nDrivas, T. D. and Elgindi, T. M. (2022). Singularity formation in the incompressible Euler equation in finite and infinite time. arXiv preprint arXiv:2203.17221, doi:10.48550/arXiv.2203.17221.\nPalóczy, A., and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D., and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"../../../examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decay_topography_example","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.40 min\nstep: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.74 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/v0.15.3/siteinfo.js b/v0.15.3/siteinfo.js new file mode 100644 index 00000000..6698e23e --- /dev/null +++ b/v0.15.3/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.15.3"; diff --git a/v0.15.3/stochastic_forcing/index.html b/v0.15.3/stochastic_forcing/index.html new file mode 100644 index 00000000..b10f7bd6 --- /dev/null +++ b/v0.15.3/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by van Kampen.

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that oftentimes this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/v0.15.3/visualize/index.html b/v0.15.3/visualize/index.html new file mode 100644 index 00000000..b935d56b --- /dev/null +++ b/v0.15.3/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/v0.15.4/.documenter-siteinfo.json b/v0.15.4/.documenter-siteinfo.json new file mode 100644 index 00000000..fa799062 --- /dev/null +++ b/v0.15.4/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2023-12-11T10:00:20","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v0.15.4/aliasing/index.html b/v0.15.4/aliasing/index.html new file mode 100644 index 00000000..186b834c --- /dev/null +++ b/v0.15.4/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

    Aliasing

    In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

    De-aliasing scheme

    FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

    julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
    +
    +julia> OneDimensionalGrid
    +         ├─────────── Device: CPU
    +         ├──────── FloatType: Float64
    +         ├────────── size Lx: 6.283185307179586
    +         ├──── resolution nx: 64
    +         ├── grid spacing dx: 0.09817477042468103
    +         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
    +         └─ aliased fraction: 0.5

    or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

    julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
    +Problem
    +  ├─────────── grid: grid (on CPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper
    +  
    +julia> prob.grid.aliased_fraction
    +0.5

    Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

    All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

    To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

    diff --git a/v0.15.4/assets/README/index.html b/v0.15.4/assets/README/index.html new file mode 100644 index 00000000..b0266aa4 --- /dev/null +++ b/v0.15.4/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/v0.15.4/assets/documenter.js b/v0.15.4/assets/documenter.js new file mode 100644 index 00000000..f5311607 --- /dev/null +++ b/v0.15.4/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
    Type something to get started!
    + `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
    `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
    ${count} result(s)
    `; + + search_result_container = ` +
    + ${modal_filters} + ${search_divider} + ${result_count} +
    + ${search_results} +
    +
    + `; + } else { + search_result_container = ` +
    + ${modal_filters} + ${search_divider} +
    0 result(s)
    +
    +
    No result found!
    + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
    + Filters: + ${str} +
    + `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
    `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
    +
    ${result.title}
    +
    ${result.category}
    +
    +

    + ${display_result} +

    +
    + ${display_link} +
    +
    + ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
    Type something to get started!
    +`; + +let search_modal_footer = ` +
    + + Ctrl + + / to search + + esc to close +
    +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
    Type something to get started!
    + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v0.15.4/assets/energy_budgets_Ito.svg b/v0.15.4/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..de8d0090 --- /dev/null +++ b/v0.15.4/assets/energy_budgets_Ito.svg @@ -0,0 +1,1397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.4/assets/energy_budgets_Stratonovich.svg b/v0.15.4/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..7ed887ab --- /dev/null +++ b/v0.15.4/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.4/assets/energy_comparison.svg b/v0.15.4/assets/energy_comparison.svg new file mode 100644 index 00000000..398b7df7 --- /dev/null +++ b/v0.15.4/assets/energy_comparison.svg @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.15.4/assets/themes/documenter-dark.css b/v0.15.4/assets/themes/documenter-dark.css new file mode 100644 index 00000000..9f5449f4 --- /dev/null +++ b/v0.15.4/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v0.15.4/assets/themes/documenter-light.css b/v0.15.4/assets/themes/documenter-light.css new file mode 100644 index 00000000..2f168c77 --- /dev/null +++ b/v0.15.4/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v0.15.4/assets/themeswap.js b/v0.15.4/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v0.15.4/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v0.15.4/assets/warner.js b/v0.15.4/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v0.15.4/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v0.15.4/contributing/index.html b/v0.15.4/contributing/index.html new file mode 100644 index 00000000..7ce96bd8 --- /dev/null +++ b/v0.15.4/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

    Contributors' Guide

    This is a short guide for potential GeophysicalFlows.jl contributors.

    Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

    We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

    What can I do?

    • Tackle an existing issue.

    • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

    • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

    • Improve documentation, docstrings, or comments if you found something is hard to use.

    • Implement a new feature (e.g., a new diagnostic into a module).

    • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

    If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

    Ground Rules

    • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
    • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
    • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
    • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

    Reporting a bug

    The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

    • Head over to the issues page.
    • Search to see if your issue already exists or has even been solved previously.
    • If you indeed have a new issue or request, click the "New Issue" button.
    • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

    Setting up your development environment

    • Install Julia on your system.
    • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
    • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
    • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
      git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
    • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
    • Connect your repository to the upstream (main project).
      git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
    • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
    • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

    Your development environment is now ready!

    Pull Requests

    Changes and contributions should be made via GitHub pull requests against the main branch.

    When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

    When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

    Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

    Documentation

    All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

    We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

    You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

    julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    +julia --project=docs/ docs/make.jl

    and then open docs/build/index.html in your favorite browser.

    Credits

    This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

    diff --git a/v0.15.4/gpu/index.html b/v0.15.4/gpu/index.html new file mode 100644 index 00000000..e9f683f8 --- /dev/null +++ b/v0.15.4/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

    GPU

    GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

    All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

    julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
    +Problem
    +  ├─────────── grid: grid (on GPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper

    Selecting GPU device

    FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

    diff --git a/v0.15.4/index.html b/v0.15.4/index.html new file mode 100644 index 00000000..9a445f48 --- /dev/null +++ b/v0.15.4/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

    GeophysicalFlows.jl Documentation

    Overview

    GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

    Examples

    Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

    Fourier transforms normalization

    Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

    \[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

    The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

    \[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

    where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

    Read more in the FourierFlows.jl Documentation; see Grids section.

    Unicode

    Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

    Read more about Unicode symbols in the Julia Documentation.

    Developers

    The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

    Citing

    If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

    Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

    The bibtex entry for the paper is:

    @article{GeophysicalFlowsJOSS,
    +  doi = {10.21105/joss.03053},
    +  url = {https://doi.org/10.21105/joss.03053},
    +  year = {2021},
    +  publisher = {The Open Journal},
    +  volume = {6},
    +  number = {60},
    +  pages = {3053},
    +  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
    +  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
    +  journal = {Journal of Open Source Software}
    +}

    Papers using GeophysicalFlows.jl

    1. Drivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surv. Math. Sci., 10(1), 1–100, doi:10.4171/emss/66.

    2. Parfenyev, V. (2023) Statistical analysis of vortex condensate motion in two-dimensional turbulence. arXiv preprint arXiv:2311.03065, doi:10.48550/arXiv.2311.03065.

    3. Shokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.

    4. Bischoff, T. and Deck, K. (2023) Unpaired downscaling of fluid flows with diffusion bridges. arXiv preprint arXiv:2305.01822, doi:10.48550/arXiv.2305.01822.

    5. Siegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.

    6. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

    7. Parfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.

    8. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.

    9. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.

    10. Palóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

    11. Karrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

    diff --git a/v0.15.4/installation_instructions/index.html b/v0.15.4/installation_instructions/index.html new file mode 100644 index 00000000..d750ad6b --- /dev/null +++ b/v0.15.4/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

    Installation instructions

    You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

    julia> ]
    +(v1.6) pkg> add GeophysicalFlows
    +(v1.6) pkg> instantiate

    We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

    (v1.6) pkg> update GeophysicalFlows

    Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

    Use Julia 1.6 or newer

    The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

    Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

    diff --git a/v0.15.4/lib/functions/index.html b/v0.15.4/lib/functions/index.html new file mode 100644 index 00000000..671d1ec4 --- /dev/null +++ b/v0.15.4/lib/functions/index.html @@ -0,0 +1,89 @@ + +Functions · GeophysicalFlows.jl

    Functions

    GeophysicalFlows

    GeophysicalFlows.GeophysicalFlowsModule

    Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.

    source

    Exported functions

    GeophysicalFlows.lambdipoleFunction
    lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

    Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

    source
    GeophysicalFlows.peakedisotropicspectrumFunction
    peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

    Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

    source

    TwoDNavierStokes

    Exported functions

    GeophysicalFlows.TwoDNavierStokes.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                  μ = 0,
    +                 nμ = 0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a two-dimensional Navier-Stokes problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Large-scale (hypo)-viscosity coefficient.
    • : (Hypo)-viscosity order, $≤ 0$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.TwoDNavierStokes.energy_workFunction
    energy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

    \[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

    where $ψ$ is the stream flow.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
    enstrophy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

    \[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

    where $ζ$ is the relative vorticity.

    source
    GeophysicalFlows.TwoDNavierStokes.palinstrophyFunction
    palinstrophy(prob)

    Return the problem's (prob) domain-averaged palinstrophy,

    \[\int \frac1{2} |{\bf ∇} ζ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Private functions

    GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

    source
    GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
    energy_dissipation(prob, ξ, νξ)

    Return the domain-averaged energy dissipation rate done by the viscous term,

    \[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
    enstrophy_dissipation(prob, ξ, νξ)

    Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

    \[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source

    SingleLayerQG

    Exported functions

    GeophysicalFlows.SingleLayerQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    + deformation_radius = Inf,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a single-layer quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    GeophysicalFlows.SingleLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

    source

    MultiLayerQG

    Exported functions

    GeophysicalFlows.MultiLayerQG.ProblemFunction
    Problem(nlayers :: Int,
    +                    dev = CPU();
    +                     nx = 128,
    +                     ny = nx,
    +                     Lx = 2π,
    +                     Ly = Lx,
    +                     f₀ = 1.0,
    +                      β = 0.0,
    +                      g = 1.0,
    +                      U = zeros(nlayers),
    +                      H = 1/nlayers * ones(nlayers),
    +                      ρ = Array{Float64}(1:nlayers),
    +                    eta = nothing,
    +topographic_pv_gradient = (0, 0),
    +                      μ = 0,
    +                      ν = 0,
    +                     nν = 1,
    +                     dt = 0.01,
    +                stepper = "RK4",
    +                 calcFq = nothingfunction,
    +             stochastic = false,
    +                 linear = false,
    +       aliased_fraction = 1/3,
    +                      T = Float64)

    Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

    Arguments

    • nlayers: (required) Number of fluid layers.
    • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • f₀: Constant planetary vorticity.
    • β: Planetary vorticity $y$-gradient.
    • g: Gravitational acceleration constant.
    • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
    • H: Rest height of each fluid layer.
    • ρ: Density of each fluid layer.
    • eta: Periodic component of the topographic potential vorticity.
    • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
    • μ: Linear bottom drag coefficient.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
    • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64 (default); floating point type used for problem data.
    source
    GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
    streamfunctionfrompv!(ψh, qh, params, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

    source
    streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

    source
    streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    \[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source
    GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
    pvfromstreamfunction!(qh, ψh, params, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

    source
    pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

    source
    pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) (ψ̂₂ - ψ̂₁) ,\]

    \[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) (ψ̂₁ - ψ̂₂) .\]

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source

    Private functions

    GeophysicalFlows.MultiLayerQG.LinearEquationFunction
    LinearEquation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcNlinear!.

    source
    GeophysicalFlows.MultiLayerQG.calcS!Function
    calcS!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
    calcS⁻¹!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcNlinear!Function
    calcNlinear!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term of the linearized equations:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, vars, params, grid)

    Compute the advection term and stores it in N:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
    calcN_linearadvection!(N, sol, vars, params, grid)

    Compute the advection term of the linearized equations and stores it in N:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source

    SurfaceQG

    Exported functions

    GeophysicalFlows.SurfaceQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 Lx = 2π,
    +                 ny = nx,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a surface quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
    buoyancy_dissipation(prob)

    Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

    \[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

    where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

    source
    GeophysicalFlows.SurfaceQG.buoyancy_workFunction
    buoyancy_work(prob)
    +buoyancy_work(sol, vars, grid)

    Return the domain-averaged rate of work of buoyancy variance by the forcing,

    \[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

    source

    Private functions

    GeophysicalFlows.SurfaceQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

    source

    BarotropicQGQL

    Exported functions

    GeophysicalFlows.BarotropicQGQL.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    diff --git a/v0.15.4/lib/types/index.html b/v0.15.4/lib/types/index.html new file mode 100644 index 00000000..a03552b5 --- /dev/null +++ b/v0.15.4/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

    Private types

    TwoDNavierStokes

    GeophysicalFlows.TwoDNavierStokes.ParamsType
    struct Params{T} <: AbstractParams

    The parameters for a two-dimensional Navier-Stokes problem:

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • μ::Any: large-scale (hypo)-viscosity coefficient

    • nμ::Int64: (hypo)-viscosity order, $≤ 0$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.TwoDNavierStokes.VarsType
    struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

    The variables for two-dimensional Navier-Stokes problem:

    • ζ: relative vorticity

    • u: x-component of velocity

    • v: y-component of velocity

    • ζh: Fourier transform of relative vorticity

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SingleLayerQG

    GeophysicalFlows.SingleLayerQG.ParamsType
    struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

    The parameters for the SingleLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • deformation_radius::Any: Rossby radius of deformation

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SingleLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

    The variables for SingleLayer QG:

    • q: relative vorticity (+ vortex stretching)

    • ψ: streamfunction

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • qh: Fourier transform of relative vorticity (+ vortex stretching)

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    MultiLayerQG

    GeophysicalFlows.MultiLayerQG.ParamsType
    struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams

    The parameters for the MultiLayerQG problem.

    • nlayers::Int64: number of fluid layers

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Tuple: array with density of each fluid layer

    • H::Tuple: array with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Tuple: array with the reduced gravity constants for each fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to eta in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • S::Any: array containing coeffients for getting PV from streamfunction

    • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
    struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a single-layer MultiLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • U::Any: array with imposed constant zonal flow $U(y)$

    • eta::Any: array containing the periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
    struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a two-layer MultiLayerQG problem.

    • g::Any: gravitational constant

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • ρ::Tuple: array with density of each fluid layer

    • H::Tuple: tuple with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: the reduced gravity constants for the fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: AbstractVars

    The variables for multi-layer QG problem.

    • q: relative vorticity + vortex stretching

    • ψ: streamfunction

    • u: x-component of velocity

    • v: y-component of velocity

    • qh: Fourier transform of relative vorticity + vortex stretching

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fqh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SurfaceQG

    GeophysicalFlows.SurfaceQG.ParamsType
    Params{T}(ν, nν, calcF!)

    A struct containing the parameters for Surface QG dynamics. Included are:

    • ν::Any: buoyancy (hyper)-viscosity coefficient

    • nν::Int64: buoyancy (hyper)-viscosity order

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SurfaceQG.VarsType
    Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

    The variables for surface QG problem:

    • b: buoyancy

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • bh: Fourier transform of buoyancy

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    BarotropicQGQL

    GeophysicalFlows.BarotropicQGQL.ParamsType
    Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

    A struct containing the parameters for a barotropic QL QG problem. Included are:

    • β::Any: planetary vorticity $y$-gradient

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.BarotropicQGQL.VarsType
    Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

    The variables for barotropic QL QG:

    • u: $x$-component of small-scale velocity

    • v: $y$-component of small-scale velocity

    • U: $x$-component of large-scale velocity

    • uzeta: small-scale $u′ζ′$

    • vzeta: small-scale $v′ζ′$

    • zeta: small-scale relative vorticity

    • Zeta: large-scale relative vorticity

    • psi: small-scale streamfunction

    • Psi: large-scale streamfunction

    • Nz: small-scale nonlinear term

    • NZ: large-scale nonlinear term

    • uh: Fourier transform of $x$-component of small-scale velocity

    • vh: Fourier transform of $y$-component of small-scale velocity

    • Uh: Fourier transform of $x$-component of large-scale velocity

    • zetah: Fourier transform of small-scale relative vorticity

    • Zetah: Fourier transform of large-scale relative vorticity

    • psih: Fourier transform of small-scale relative vorticity

    • Psih: Fourier transform of large-scale relative vorticity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source
    diff --git a/v0.15.4/literated/barotropicqgql_betaforced-24.png b/v0.15.4/literated/barotropicqgql_betaforced-24.png new file mode 100644 index 00000000..b48791f7 Binary files /dev/null and b/v0.15.4/literated/barotropicqgql_betaforced-24.png differ diff --git a/v0.15.4/literated/barotropicqgql_betaforced.mp4 b/v0.15.4/literated/barotropicqgql_betaforced.mp4 new file mode 100644 index 00000000..307f3942 Binary files /dev/null and b/v0.15.4/literated/barotropicqgql_betaforced.mp4 differ diff --git a/v0.15.4/literated/barotropicqgql_betaforced/index.html b/v0.15.4/literated/barotropicqgql_betaforced/index.html new file mode 100644 index 00000000..163d3f25 --- /dev/null +++ b/v0.15.4/literated/barotropicqgql_betaforced/index.html @@ -0,0 +1,172 @@ + +Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +using Statistics: mean
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n^2
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                              calcF=calcF!, stochastic=true, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x, grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics – energy and enstrophy are functions imported at the top.

    E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
    +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

    We can also define our custom diagnostics via functions.

    zetaMean(prob) = prob.sol[1, :]
    +
    +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

    We combile all diags in a list.

    diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaQLturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "forcedbetaQLturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  grid, vars = prob.grid, prob.vars
    +
    +  @. vars.uh = im * grid.l  * grid.invKrsq * sol
    +  ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))
    +
    +  return  vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    Output
    +  ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
    +  ├──── path: ./forcedbetaQLturb.jld2
    +  └── fields: Dict{Symbol, Function}(:sol => Main.var"##313".get_sol, :u => Main.var"##313".get_u)

    Visualizing the simulation

    We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

    title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axζ̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean ζ",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.05)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 5)))
    +
    +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta
    +ζ = Observable(Array(@. ζ̄ + ζ′))
    +ψ̄, ψ′= prob.vars.Psi,  prob.vars.psi
    +ψ = Observable(Array(@. ψ̄ + ψ′))
    +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))
    +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))
    +
    +μt = Observable(μ * E.t[1:1])
    +energy = Observable(E.data[1:1])
    +enstrophy = Observable(Z.data[1:1])
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +heatmap!(axψ, x, y, ψ;
    +         colormap = :viridis, colorrange = (-0.22, 0.22))
    +
    +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)
    +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, μt, energy; linewidth = 3)
    +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],
    +      (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = @. ζ̄ + ζ′
    +  ψ[] = @. ψ̄ + ψ′
    +  ζ̄ₘ[] = vec(mean(ζ̄, dims=1))
    +  ūₘ[] = vec(mean(prob.vars.U, dims=1))
    +
    +  μt.val = μ * E.t[1:E.i]
    +  energy[] = E.data[1:E.i]
    +  enstrophy[] = Z.data[1:E.i]
    +
    +  title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  BarotropicQGQL.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.64, E: 0.0286, Q: 3.9616, walltime: 0.10 min
    +step: 2000, t: 100, cfl: 0.81, E: 0.0384, Q: 4.1193, walltime: 0.18 min
    +step: 3000, t: 150, cfl: 0.80, E: 0.0441, Q: 4.4990, walltime: 0.27 min
    +step: 4000, t: 200, cfl: 0.80, E: 0.0450, Q: 3.6810, walltime: 0.37 min
    +step: 5000, t: 250, cfl: 0.87, E: 0.0472, Q: 4.0671, walltime: 0.46 min
    +step: 6000, t: 300, cfl: 0.92, E: 0.0484, Q: 4.1866, walltime: 0.56 min
    +step: 7000, t: 350, cfl: 0.89, E: 0.0482, Q: 3.8817, walltime: 0.66 min
    +step: 8000, t: 400, cfl: 0.92, E: 0.0482, Q: 3.7857, walltime: 0.77 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/multilayerqg_2layer-31.png b/v0.15.4/literated/multilayerqg_2layer-31.png new file mode 100644 index 00000000..cfb7afcf Binary files /dev/null and b/v0.15.4/literated/multilayerqg_2layer-31.png differ diff --git a/v0.15.4/literated/multilayerqg_2layer.mp4 b/v0.15.4/literated/multilayerqg_2layer.mp4 new file mode 100644 index 00000000..f7703f77 Binary files /dev/null and b/v0.15.4/literated/multilayerqg_2layer.mp4 differ diff --git a/v0.15.4/literated/multilayerqg_2layer/index.html b/v0.15.4/literated/multilayerqg_2layer/index.html new file mode 100644 index 00000000..b54a3a87 --- /dev/null +++ b/v0.15.4/literated/multilayerqg_2layer/index.html @@ -0,0 +1,181 @@ + +Phillips model of Baroclinic Instability · GeophysicalFlows.jl

    Phillips model of Baroclinic Instability

    A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf
    +
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

    n = 128                  # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 2.5e-3         # timestep
    + nsteps = 20000          # total number of time-steps
    + nsubs  = 50             # number of time-steps for plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π                   # domain size
    +μ = 5e-2                 # bottom drag
    +β = 5                    # the y-gradient of planetary PV
    +
    +nlayers = 2              # number of layers
    +f₀, g = 1, 1             # Coriolis parameter and gravitational constant
    +H = [0.2, 0.8]           # the rest depths of each layer
    +ρ = [4.0, 5.0]           # the density of each layer
    +
    +U = zeros(nlayers)       # the imposed mean zonal flow in each layer
    +U[1] = 1.0
    +U[2] = 0.0

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,
    +                            dt, stepper, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

    device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    seed!(1234) # reset of the random number generator for reproducibility
    +q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
    +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft  only in dims=1, 2
    +q₀  = irfft(q₀h, grid.nx, (1, 2))                 # apply irfft only in dims=1, 2
    +
    +MultiLayerQG.set_q!(prob, q₀)

    Diagnostics

    Create Diagnostics – energies function is imported at the top.

    E = Diagnostic(MultiLayerQG.energies, prob; nsteps)
    +diags = [E] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_2layer"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "2layer.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid
    +
    +  @. vars.qh = sol
    +  streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +  @. vars.uh = -im * grid.l * vars.ψh
    +  invtransform!(vars.u, vars.uh, params)
    +
    +  return vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t))
    +
    +q₁ = Observable(Array(vars.q[:, :, 1]))
    +ψ₁ = Observable(Array(vars.ψ[:, :, 1]))
    +q₂ = Observable(Array(vars.q[:, :, 2]))
    +ψ₂ = Observable(Array(vars.ψ[:, :, 2]))
    +
    +function compute_levels(maxf, nlevels=8)
    +  # -max(|f|):...:max(|f|)
    +  levelsf  = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))
    +
    +  # only positive
    +  levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))
    +
    +  # only negative
    +  levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))
    +
    +  return levelsf, levelsf⁺, levelsf⁻
    +end
    +
    +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))
    +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))
    +
    +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)
    +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)
    +
    +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])
    +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])
    +PE  = Observable(Point2f[(μ * E.t[1], E.data[1][2])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...)
    +
    +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...)
    +
    +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...)
    +
    +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...)
    +
    +axKE = Axis(fig[1, 3],
    +            xlabel = "μ t",
    +            ylabel = "KE",
    +            title = title_KE,
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +axPE = Axis(fig[2, 3],
    +            xlabel = "μ t",
    +            ylabel = "PE",
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +heatmap!(axq₁, x, y, q₁; colormap = :balance)
    +
    +heatmap!(axq₂, x, y, q₂; colormap = :balance)
    +
    +contourf!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁺, color=:black)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁻, color=:black, linestyle = :dash)
    +
    +contourf!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁺, color=:black)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁻, color=:black, linestyle = :dash)
    +
    +ke₁ = lines!(axKE, KE₁; linewidth = 3)
    +ke₂ = lines!(axKE, KE₂; linewidth = 3)
    +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"])
    +
    +lines!(axPE, PE; linewidth = 3)
    +
    +fig

    Time-stepping the Problem forward

    Finally, we time-step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min",
    +                   clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q₁[] = vars.q[:, :, 1]
    +  ψ₁[] = vars.ψ[:, :, 1]
    +  q₂[] = vars.q[:, :, 2]
    +  ψ₂[] = vars.ψ[:, :, 2]
    +
    +  maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])
    +  maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])
    +
    +  KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))
    +  KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))
    +  PE[]  = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))
    +
    +  title_KE[] = @sprintf("μ t = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  MultiLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min
    +step: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.17 min
    +step: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.31 min
    +step: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.45 min
    +step: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.59 min
    +step: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.72 min
    +step: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.86 min
    +step: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.02 min
    +step: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.18 min
    +step: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.33 min
    +step: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.49 min
    +step: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.64 min
    +step: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.79 min
    +step: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 1.92 min
    +step: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.05 min
    +step: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.18 min
    +step: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.30 min
    +step: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.42 min
    +step: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.53 min
    +step: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.64 min
    +step: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.75 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/v0.15.4/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 new file mode 100644 index 00000000..172dc2bb Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/v0.15.4/literated/singlelayerqg_betadecay-20.png b/v0.15.4/literated/singlelayerqg_betadecay-20.png new file mode 100644 index 00000000..97644316 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_betadecay-20.png differ diff --git a/v0.15.4/literated/singlelayerqg_betadecay-33.png b/v0.15.4/literated/singlelayerqg_betadecay-33.png new file mode 100644 index 00000000..ed3f1718 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_betadecay-33.png differ diff --git a/v0.15.4/literated/singlelayerqg_betadecay.mp4 b/v0.15.4/literated/singlelayerqg_betadecay.mp4 new file mode 100644 index 00000000..1bbcefa2 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_betadecay.mp4 differ diff --git a/v0.15.4/literated/singlelayerqg_betadecay/index.html b/v0.15.4/literated/singlelayerqg_betadecay/index.html new file mode 100644 index 00000000..6de51ed1 --- /dev/null +++ b/v0.15.4/literated/singlelayerqg_betadecay/index.html @@ -0,0 +1,131 @@ + +Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Decaying barotropic QG beta-plane turbulence

    An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.04           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.0       # bottom drag

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.08 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                          # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. q₀h = ifelse(K < 6  * 2π/L, 0, q₀h)
    +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)
    +@. q₀h[1, :] = 0    # remove any power from zonal wavenumber k=0
    +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀
    +q₀ = irfft(q₀h, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, q₀)

    Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (800, 360))
    +
    +axq = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial vorticity ∂v/∂x-∂u/∂y",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +axψ = Axis(fig[1, 2];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial streamfunction ψ",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +heatmap!(axq, x, y, Array(vars.q); colormap = :balance)
    +
    +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We plot the vorticity and streamfunction and their corresponding zonal mean structure.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(800, 720))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +q  = Observable(Array(vars.q))
    +ψ  = Observable(Array(vars.ψ))
    +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))
    +ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-12, 12))
    +
    +levels = collect(range(-0.7, stop=0.7, length=20))
    +
    +contourf!(axψ, x, y, ψ;
    +         levels, colormap = :viridis, colorrange = (-0.35, 0.35))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₘ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 12) do j
    +  if j % round(Int, nsteps/nsubs / 4) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +  q̄ₘ[] = vec(mean(vars.q, dims=1))
    +  ūₘ[] = vec(mean(vars.u, dims=1))
    +
    +  title_q[] = @sprintf("vorticity, t = %.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min
    +step: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.17 min
    +step: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.30 min
    +step: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.42 min
    +step: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.55 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/singlelayerqg_betaforced-23.png b/v0.15.4/literated/singlelayerqg_betaforced-23.png new file mode 100644 index 00000000..b48791f7 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_betaforced-23.png differ diff --git a/v0.15.4/literated/singlelayerqg_betaforced-48.png b/v0.15.4/literated/singlelayerqg_betaforced-48.png new file mode 100644 index 00000000..be9586f6 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_betaforced-48.png differ diff --git a/v0.15.4/literated/singlelayerqg_betaforced.mp4 b/v0.15.4/literated/singlelayerqg_betaforced.mp4 new file mode 100644 index 00000000..c7fbe0a2 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_betaforced.mp4 differ diff --git a/v0.15.4/literated/singlelayerqg_betaforced/index.html b/v0.15.4/literated/singlelayerqg_betaforced/index.html new file mode 100644 index 00000000..a7d89dcc --- /dev/null +++ b/v0.15.4/literated/singlelayerqg_betaforced/index.html @@ -0,0 +1,199 @@ + +Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
    +
    +using Statistics: mean
    +using LinearAlgebra: ldiv!
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000          # total number of timesteps
    + save_substeps = 10      # number of timesteps after which output is saved
    +

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                             calcF=calcF!, stochastic=true)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostic – energy and enstrophy are functions imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  vars, grid, sol = prob.vars, prob.grid, prob.sol
    +
    +  @. vars.qh = sol
    +
    +  SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +
    +  ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)
    +
    +  return Array(vars.u)
    +end
    +
    +output = Output(prob, filename, (:qh, get_sol), (:u, get_u))

    We first save the problem's grid and other parameters so we can use them later.

    saveproblem(output)

    and then call saveoutput(output) once to save the initial state.

    saveoutput(output)

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +while clock.step <= nsteps
    +  if clock.step % 50save_substeps == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +    clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  stepforward!(prob, diags, save_substeps)
    +  SingleLayerQG.updatevars!(prob)
    +
    +  if clock.step % save_substeps == 0
    +    saveoutput(output)
    +  end
    +end
    +
    +savediagnostic(E, "energy", output.path)
    +savediagnostic(Z, "enstrophy", output.path)
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 0500, t: 25, cfl: 0.49, E: 0.0181, Q: 2.6734, walltime: 0.03 min
    +step: 1000, t: 50, cfl: 0.75, E: 0.0294, Q: 2.9033, walltime: 0.04 min
    +step: 1500, t: 75, cfl: 0.72, E: 0.0366, Q: 2.8531, walltime: 0.06 min
    +step: 2000, t: 100, cfl: 0.76, E: 0.0405, Q: 2.8524, walltime: 0.08 min
    +step: 2500, t: 125, cfl: 0.90, E: 0.0432, Q: 2.7659, walltime: 0.10 min
    +step: 3000, t: 150, cfl: 0.74, E: 0.0461, Q: 2.8456, walltime: 0.12 min
    +step: 3500, t: 175, cfl: 0.84, E: 0.0458, Q: 2.5441, walltime: 0.14 min
    +step: 4000, t: 200, cfl: 0.83, E: 0.0463, Q: 2.6039, walltime: 0.15 min
    +step: 4500, t: 225, cfl: 0.78, E: 0.0468, Q: 2.7381, walltime: 0.17 min
    +step: 5000, t: 250, cfl: 0.95, E: 0.0475, Q: 2.7058, walltime: 0.19 min
    +step: 5500, t: 275, cfl: 0.72, E: 0.0481, Q: 2.8522, walltime: 0.21 min
    +step: 6000, t: 300, cfl: 0.83, E: 0.0481, Q: 2.8540, walltime: 0.23 min
    +step: 6500, t: 325, cfl: 0.87, E: 0.0479, Q: 2.8534, walltime: 0.25 min
    +step: 7000, t: 350, cfl: 0.81, E: 0.0474, Q: 2.7300, walltime: 0.27 min
    +step: 7500, t: 375, cfl: 0.96, E: 0.0469, Q: 2.6818, walltime: 0.29 min
    +step: 8000, t: 400, cfl: 0.74, E: 0.0466, Q: 2.6955, walltime: 0.30 min
    +

    Load saved output and visualize

    We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

    file = jldopen(output.path)
    +
    +iterations = parse.(Int, keys(file["snapshots/t"]))
    +t = [file["snapshots/t/$i"] for i ∈ iterations]
    +
    +qh = [file["snapshots/qh/$i"] for i ∈ iterations]
    +u  = [file["snapshots/u/$i"] for i ∈ iterations]
    +
    +E_t = file["diagnostics/energy/t"]
    +Z_t = file["diagnostics/enstrophy/t"]
    +E_data = file["diagnostics/energy/data"]
    +Z_data = file["diagnostics/enstrophy/data"]
    +
    +x,  y  = file["grid/x"],  file["grid/y"]
    +nx, ny = file["grid/nx"], file["grid/ny"]
    +Lx, Ly = file["grid/Lx"], file["grid/Ly"]
    +
    +close(file)

    We create a figure using Makie's Observables

    n = Observable(1)
    +
    +qₙ = @lift irfft(qh[$n], nx)
    +ψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)
    +q̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))
    +ūₙ = @lift vec(mean(u[$n], dims=1))
    +
    +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$n])
    +
    +energy    = Observable([Point2f(E_t[1], E_data[1])])
    +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.055)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 3.1)))
    +
    +heatmap!(axq, x, y, qₙ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +levels = collect(-0.32:0.04:0.32)
    +
    +contourf!(axψ, x, y, ψₙ;
    +          levels, colormap = :viridis, colorrange = (-0.22, 0.22))
    +contour!(axψ, x, y, ψₙ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₙ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₙ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, energy; linewidth = 3)
    +lines!(axZ, enstrophy; linewidth = 3, color = :red)
    +
    +fig

    We are now ready to animate all saved output.

    frames = 1:length(t)
    +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 16) do i
    +  n[] = i
    +
    +  energy[]    = push!(energy[],    Point2f(μ * E_t[i], E_data[i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
    +end


    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png b/v0.15.4/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png new file mode 100644 index 00000000..e1500836 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png differ diff --git a/v0.15.4/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/v0.15.4/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html new file mode 100644 index 00000000..39ac8a14 --- /dev/null +++ b/v0.15.4/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -0,0 +1,93 @@ + +SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

    SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

    We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using GeophysicalFlows: peakedisotropicspectrum
    +using LinearAlgebra: ldiv!
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length
    +deformation_radius = 0.35   # the deformation radius
    +
    +# Then we pick the time-stepper parameters
    +    dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.

    For both problems we use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    stepper="FilteredRK4"
    +
    +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)
    +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)

    Setting initial conditions

    For initial condition we construct a relative vorticity with energy most energy around total wavenumber $k_0$.

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)

    SingleLayerQG allows us to set up the initial $q$ for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.

    ∇²ψ₀h = rfft(∇²ψ₀)
    +ψ₀h = @. 0 * ∇²ψ₀h
    +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)

    and then use the streamfunction to compute the corresponding $q_0$ for each problem,

    q₀_bqg   = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)
    +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)

    Now we can initialize our problems with the same flow.

    SingleLayerQG.set_q!(prob_bqg, q₀_bqg)
    +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)

    Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    function relativevorticity(prob)
    +  vars, grid = prob.vars, prob.grid
    +
    +  ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)
    +
    +  return vars.q
    +end
    +
    +x,  y  = prob_bqg.grid.x,  prob_bqg.grid.y
    +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +t_bqg = Observable(prob_bqg.clock.t)
    +t_eqbqg = Observable(prob_eqbqg.clock.t)
    +
    +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg)
    +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg)
    +
    +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)
    +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)
    +
    +ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))
    +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))
    +
    +heatmap!(ax1, x, y, ζ_bqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +heatmap!(ax2, x, y, ζ_eqbqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Time-stepping the Problem forward

    Now we time-step both problems forward and animate the relative vorticity in each case.

    startwalltime = time()
    +
    +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
    +
    +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)
    +    println(log_bqg)
    +
    +    log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)
    +    println(log_eqbqg)
    +  end
    +
    +  stepforward!(prob_bqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_bqg)
    +
    +  stepforward!(prob_eqbqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_eqbqg)
    +
    +  t_bqg[] = prob_bqg.clock.t
    +  t_eqbqg[] = prob_eqbqg.clock.t
    +  ζ_bqg[] = relativevorticity(prob_bqg)
    +  ζ_eqbqg[] = relativevorticity(prob_eqbqg)
    +end
    barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +equivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.07 min
    +equivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.07 min
    +barotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.14 min
    +equivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.14 min
    +barotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.20 min
    +equivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.20 min
    +barotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.27 min
    +equivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.27 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/singlelayerqg_decaying_topography-19.png b/v0.15.4/literated/singlelayerqg_decaying_topography-19.png new file mode 100644 index 00000000..5bacd88d Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_decaying_topography-19.png differ diff --git a/v0.15.4/literated/singlelayerqg_decaying_topography-24.png b/v0.15.4/literated/singlelayerqg_decaying_topography-24.png new file mode 100644 index 00000000..71773661 Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_decaying_topography-24.png differ diff --git a/v0.15.4/literated/singlelayerqg_decaying_topography.mp4 b/v0.15.4/literated/singlelayerqg_decaying_topography.mp4 new file mode 100644 index 00000000..46e84d1d Binary files /dev/null and b/v0.15.4/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/v0.15.4/literated/singlelayerqg_decaying_topography/index.html b/v0.15.4/literated/singlelayerqg_decaying_topography/index.html new file mode 100644 index 00000000..e4ed0f18 --- /dev/null +++ b/v0.15.4/literated/singlelayerqg_decaying_topography/index.html @@ -0,0 +1,102 @@ + +Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

    Decaying barotropic QG turbulence over topography

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size

    Define the topographic potential vorticity, $\eta = f_0 h(x, y)/H$. The topography here is an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$.

    σx, σy = 0.4, 0.8
    +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    The topophic PV is prescribed via keyword argument eta.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,
    +                             dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    η = Array(params.eta)
    +
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "topographic PV η=f₀h/H",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +contourf!(ax, x, y, η;
    +          levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
    +
    +fig

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.04 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. qih = ifelse(K < 6  * 2π/L, 0, qih)
    +@. qih = ifelse(K > 12 * 2π/L, 0, qih)
    +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid))  # normalize qi to have energy E₀
    +qi = irfft(qih, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, qi)

    Let's plot the initial vorticity and streamfunction.

    q = Observable(Array(vars.q))
    +ψ = Observable(Array(vars.ψ))
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y")
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +title_ψ = Observable("initial streamfunction ψ")
    +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
    +
    +hm = heatmap!(axq, x, y, q;
    +              colormap = :balance, colorrange = (-8, 8))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +levels = collect(range(-0.28, stop=0.28, length=11))
    +
    +hc = contourf!(axψ, x, y, ψ;
    +               levels, colormap = :viridis, colorrange = (-0.28, 0.28),
    +               extendlow = :auto, extendhigh = :auto)
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +Colorbar(fig[1, 4], hc)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files.

    filepath = "."
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.

    contour!(axq, x, y, η;
    +         levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))
    +
    +contour!(axq, x, y, η;
    +         levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
    +
    +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +title_ψ[] = "streamfunction ψ"
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +
    +  title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t)
    +  title_ψ[] = "streamfunction ψ"
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.25 min
    +step: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.46 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/sqg_ellipticalvortex.mp4 b/v0.15.4/literated/sqg_ellipticalvortex.mp4 new file mode 100644 index 00000000..763e94d9 Binary files /dev/null and b/v0.15.4/literated/sqg_ellipticalvortex.mp4 differ diff --git a/v0.15.4/literated/surfaceqg_decaying-19.png b/v0.15.4/literated/surfaceqg_decaying-19.png new file mode 100644 index 00000000..e80ed661 Binary files /dev/null and b/v0.15.4/literated/surfaceqg_decaying-19.png differ diff --git a/v0.15.4/literated/surfaceqg_decaying-34.png b/v0.15.4/literated/surfaceqg_decaying-34.png new file mode 100644 index 00000000..d56bafd3 Binary files /dev/null and b/v0.15.4/literated/surfaceqg_decaying-34.png differ diff --git a/v0.15.4/literated/surfaceqg_decaying-39.png b/v0.15.4/literated/surfaceqg_decaying-39.png new file mode 100644 index 00000000..7c18f92f Binary files /dev/null and b/v0.15.4/literated/surfaceqg_decaying-39.png differ diff --git a/v0.15.4/literated/surfaceqg_decaying/index.html b/v0.15.4/literated/surfaceqg_decaying/index.html new file mode 100644 index 00000000..767a14fd --- /dev/null +++ b/v0.15.4/literated/surfaceqg_decaying/index.html @@ -0,0 +1,133 @@ + +Decaying Surface QG turbulence · GeophysicalFlows.jl

    Decaying Surface QG turbulence

    A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 256                       # 2D resolution = n²
    +stepper = "FilteredETDRK4"          # timestepper
    +     dt = 0.03                      # timestep
    +     tf = 60                        # length of time for simulation
    + nsteps = Int(tf / dt)              # total number of time-steps
    + nsubs  = round(Int, nsteps/100)    # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

     L = 2π        # domain size
    + ν = 1e-19     # hyper-viscosity coefficient
    +nν = 4         # hyper-viscosity order

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    We initialize the buoyancy equation with an elliptical vortex.

    X, Y = gridpoints(grid)
    +b₀ = @. exp(-(X^2 + 4Y^2))
    +
    +SurfaceQG.set_b!(prob, b₀)

    Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (500, 500))
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "buoyancy bₛ",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +hm = heatmap!(ax, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +fig

    Diagnostics

    Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

    B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
    +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
    +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
    +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

    base_filename = string("SurfaceQG_decaying_n_", n)
    "SurfaceQG_decaying_n_256"

    We choose folder for outputing .jld2 files and snapshots (.png files).

    datapath = "./"
    +plotpath = "./"
    +
    +dataname = joinpath(datapath, base_filename)
    +plotname = joinpath(plotpath, base_filename)

    Do some basic file management,

    if !isdir(plotpath); mkdir(plotpath); end
    +if !isdir(datapath); mkdir(datapath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.

    b = Observable(Array(vars.b))
    +
    +ke = Observable([Point2f(KE.t[1], KE.data[1])])
    +b² = Observable([Point2f(B.t[1], B.data[1])])
    +
    +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t))
    +
    +fig = Figure(resolution = (900, 600))
    +
    +axb = Axis(fig[1:2, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_b,
    +           aspect = 1,
    +           limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 2];
    +           xlabel = "t",
    +           limits = ((0, tf), (0, 2e-2)))
    +
    +heatmap!(axb, x, y, b;
    +         colormap = :deep, colorrange = (0, 1))
    +
    +hE  = lines!(axE, ke; linewidth = 3)
    +hb² = lines!(axE, b²; linewidth = 3)
    +
    +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
    +
    +fig

    Time-stepping the Problem forward and create animation by updating the plot.

    startwalltime = time()
    +
    +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
    +  if j % (500 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, (time()-startwalltime)/60)
    +
    +    log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e",
    +              B.data[B.i], Dᵇ.data[Dᵇ.i])
    +
    +    println(log1)
    +
    +    println(log2)
    +  end
    +
    +  b[] = vars.b
    +
    +  ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))
    +  b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))
    +
    +  title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SurfaceQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
    +step: 0500, t: 15.0, cfl: 0.588, walltime: 0.06 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11
    +step: 1000, t: 30.0, cfl: 0.571, walltime: 0.10 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09
    +step: 1500, t: 45.0, cfl: 0.577, walltime: 0.15 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08
    +step: 2000, t: 60.0, cfl: 0.574, walltime: 0.20 min
    +buoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08
    +

    Let's see how all flow fields look like at the end of the simulation.

    fig = Figure(resolution = (800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +
    +hb = heatmap!(axb, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[2, 1], hb, vertical = false)
    +
    +hu = heatmap!(axu, x, y, Array(vars.u);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
    +
    +Colorbar(fig[2, 2], hu, vertical = false)
    +
    +hv = heatmap!(axv, x, y, Array(vars.v);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
    +
    +Colorbar(fig[2, 3], hv, vertical = false)
    +
    +fig

    Save

    We can save the output at the end of the simulation by calling

    saveoutput(out)

    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/twodnavierstokes_decaying-20.png b/v0.15.4/literated/twodnavierstokes_decaying-20.png new file mode 100644 index 00000000..69596f38 Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_decaying-20.png differ diff --git a/v0.15.4/literated/twodnavierstokes_decaying-33.png b/v0.15.4/literated/twodnavierstokes_decaying-33.png new file mode 100644 index 00000000..d7cf88ee Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_decaying-33.png differ diff --git a/v0.15.4/literated/twodnavierstokes_decaying-42.png b/v0.15.4/literated/twodnavierstokes_decaying-42.png new file mode 100644 index 00000000..714aa19a Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_decaying-42.png differ diff --git a/v0.15.4/literated/twodnavierstokes_decaying/index.html b/v0.15.4/literated/twodnavierstokes_decaying/index.html new file mode 100644 index 00000000..0f93e3e0 --- /dev/null +++ b/v0.15.4/literated/twodnavierstokes_decaying/index.html @@ -0,0 +1,97 @@ + +2D decaying turbulence · GeophysicalFlows.jl

    2D decaying turbulence

    A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using Random: seed!
    +using GeophysicalFlows: peakedisotropicspectrum

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length

    Then we pick the time-stepper parameters

        dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

    Next we define some shortcuts for convenience.

    sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    Our initial condition tries to reproduce the initial condition used by McWilliams (1984).

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
    +TwoDNavierStokes.set_ζ!(prob, ζ₀)

    Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "initial vorticity",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ');
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
    +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingTwoDNavierStokes"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    +saveproblem(out)

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t))
    +
    +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])
    +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "t",
    +           limits = ((-0.5, 40.5), (0, 1.05)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
    +
    +fig

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min",
    +        clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))
    +  enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))
    +
    +  title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min
    +step: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.08 min
    +step: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.11 min
    +step: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.15 min
    +step: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.19 min
    +

    Radial energy spectrum

    After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

    E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
    +Eh = rfft(E)                         # Fourier transform of energy density
    +
    +# compute radial specturm of `Eh`
    +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)

    and we plot it.

    lines(kr, vec(abs.(Ehr));
    +      linewidth = 2,
    +      axis = (xlabel = L"k_r",
    +              ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta",
    +              xscale = log10,
    +              yscale = log10,
    +              title = "Radial energy spectrum",
    +              limits = ((0.3, 1e2), (1e0, 1e5))))


    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing-23.png b/v0.15.4/literated/twodnavierstokes_stochasticforcing-23.png new file mode 100644 index 00000000..3f221142 Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_stochasticforcing-23.png differ diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing-32.png b/v0.15.4/literated/twodnavierstokes_stochasticforcing-32.png new file mode 100644 index 00000000..50d9fd83 Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_stochasticforcing-32.png differ diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing/index.html b/v0.15.4/literated/twodnavierstokes_stochasticforcing/index.html new file mode 100644 index 00000000..9cde6034 --- /dev/null +++ b/v0.15.4/literated/twodnavierstokes_stochasticforcing/index.html @@ -0,0 +1,100 @@ + +2D forced-dissipative turbulence · GeophysicalFlows.jl

    2D forced-dissipative turbulence

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π             # grid resolution and domain length
    + ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0             # linear drag coefficient
    +    dt = 0.005               # timestep
    +nsteps = 4000                # total number of steps
    + nsubs = 20                  # number of steps between each plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x, y = grid.x, grid.y

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy budget.

    E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
    +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
    +
    +energy = Observable(Point2f[(μ * E.t[1], E.data[1])])
    +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "μ t",
    +           limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["energy E(t)", "enstrophy Z(t) / k_f²"])
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
    +  if j % (1000/nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))
    +
    +  title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
    +step: 1000, t: 5, cfl: 0.40, E: 0.2971, Z: 36.2188, walltime: 0.12 min
    +step: 2000, t: 10, cfl: 0.49, E: 0.4138, Z: 37.5536, walltime: 0.22 min
    +step: 3000, t: 15, cfl: 0.45, E: 0.4564, Z: 36.3428, walltime: 0.33 min
    +step: 4000, t: 20, cfl: 0.55, E: 0.4775, Z: 37.3600, walltime: 0.44 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-22.png b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-22.png new file mode 100644 index 00000000..3f221142 Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-22.png differ diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-33.png b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-33.png new file mode 100644 index 00000000..4fa4bdd0 Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-33.png differ diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-35.png b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-35.png new file mode 100644 index 00000000..d255dccc Binary files /dev/null and b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets-35.png differ diff --git a/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets/index.html new file mode 100644 index 00000000..30bdf43d --- /dev/null +++ b/v0.15.4/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -0,0 +1,161 @@ + +2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

    2D forced-dissipative turbulence budgets

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π              # grid resolution and domain length
    + ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0              # linear drag coefficient
    +dt, tf = 0.005, 0.2 / μ       # timestep and final time
    +    nt = round(Int, tf / dt)  # total timesteps
    +    ns = 4                    # how many intermediate times we want to plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

    E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
    +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
    +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
    +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy,                            prob, nsteps=nt) # enstrophy
    +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity,  prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work,                       prob, nsteps=nt) # enstrophy work input by forcing
    +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +for i = 1:ns
    +  stepforward!(prob, diags, round(Int, nt/ns))
    +
    +  TwoDNavierStokes.updatevars!(prob)
    +
    +  cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +  log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t,
    +        cfl, (time()-startwalltime)/60)
    +
    +  println(log)
    +end
    step: 0100, t: 0.5, cfl: 0.168, walltime: 0.01 min
    +step: 0200, t: 1.0, cfl: 0.238, walltime: 0.03 min
    +step: 0300, t: 1.5, cfl: 0.304, walltime: 0.04 min
    +step: 0400, t: 2.0, cfl: 0.301, walltime: 0.05 min
    +

    Plot

    Now let's see the final snapshot of the vorticity.

    fig = Figure(resolution = (400, 400))
    +
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ);
    +         colormap = :viridis, colorrange = (-25, 25))
    +
    +fig

    And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +TwoDNavierStokes.updatevars!(prob)
    +
    +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags
    +
    +clocktime = round(μ * clock.t, digits=2)
    +
    +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency
    +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency
    +
    +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]
    +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]
    +
    +residual_E = dEdt_computed - dEdt_numerical
    +residual_Z = dZdt_computed - dZdt_numerical
    +
    +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)
    +
    +t = E.t[2:E.i]
    +
    +fig = Figure(resolution = (800, 1100))
    +
    +axis_kwargs = (xlabel = "μ t", )
    +
    +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...)
    +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...)
    +ax3E = Axis(fig[5, 1]; axis_kwargs...)
    +
    +ax1Z = Axis(fig[1, 2]; axis_kwargs...)
    +ax2Z = Axis(fig[3, 2]; axis_kwargs...)
    +ax3Z = Axis(fig[5, 2]; axis_kwargs...)
    +
    +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i];   linestyle = :solid)
    +hε  = lines!(ax1E, t, ε .+ 0t;     linestyle = :dash)
    +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)
    +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 1],
    +       [hWᵋ, hε, hDᵋ, hRᵋ],
    +       ["energy work, Wᵋ", "ensemble mean energy work, <Wᵋ>", "dissipation, Dᵋ", "drag, Rᵋ = - 2μE"])
    +
    +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
    +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 1],
    +       [hc, hn],
    +       ["computed Wᵋ-Dᵋ", "numerical dE/dt"])
    +
    +hr = lines!(ax3E, t, residual_E)
    +
    +Legend(fig[6, 1],
    +       [hr],
    +       ["residual"])
    +
    +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i];  linestyle = :solid)
    +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t;    linestyle = :dash)
    +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)
    +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 2],
    +       [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
    +       ["enstrophy work, Wᶻ", "ensemble mean enstophy work, <Wᶻ>", "dissipation, Dᶻ", "drag, Rᶻ = - 2μZ"])
    +
    +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
    +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 2],
    +       [hcᶻ, hnᶻ],
    +       ["computed Wᶻ-Dᶻ", "numerical dZ/dt"])
    +
    +hrᶻ = lines!(ax3Z, t, residual_Z)
    +
    +Legend(fig[6, 2],
    +       [hr],
    +       ["residual"])
    +
    +fig


    This page was generated using Literate.jl.

    diff --git a/v0.15.4/literated/twodturb.mp4 b/v0.15.4/literated/twodturb.mp4 new file mode 100644 index 00000000..3f44e764 Binary files /dev/null and b/v0.15.4/literated/twodturb.mp4 differ diff --git a/v0.15.4/literated/twodturb_forced.mp4 b/v0.15.4/literated/twodturb_forced.mp4 new file mode 100644 index 00000000..186ebdf1 Binary files /dev/null and b/v0.15.4/literated/twodturb_forced.mp4 differ diff --git a/v0.15.4/modules/barotropicqgql/index.html b/v0.15.4/modules/barotropicqgql/index.html new file mode 100644 index 00000000..944b17cc --- /dev/null +++ b/v0.15.4/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

    BarotropicQGQL

    Basic Equations

    This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

    \[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

    where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).

    As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

    \[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

    The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

    \[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

    Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

    The linear operator is constructed in Equation

    GeophysicalFlows.BarotropicQGQL.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    Nonlinear term is computed via calcN! function.

    source

    and the nonlinear terms are computed via

    GeophysicalFlows.BarotropicQGQL.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    The kinetic energy of the fluid is obtained via:

    while the enstrophy via:

    Other diagnostic include: dissipation, drag, and work.

    Examples

    • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
    diff --git a/v0.15.4/modules/multilayerqg/index.html b/v0.15.4/modules/multilayerqg/index.html new file mode 100644 index 00000000..b53ff7e0 --- /dev/null +++ b/v0.15.4/modules/multilayerqg/index.html @@ -0,0 +1,27 @@ + +MultiLayerQG · GeophysicalFlows.jl

    MultiLayerQG

    Basic Equations

    This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

    The QGPV in each layer is

    \[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

    where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

    \[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

    with

    \[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = g \frac{\rho_{j+1} - \rho_j}{\rho_{j+1}} .\]

    In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

    \[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

    where

    \[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ + F_{3/2, 2} & -(F_{3/2, 2}+F_{5/2, 2}) & F_{5/2, 2} & & \vdots\\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

    Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

    \[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

    with

    \[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

    Implementation

    Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

    One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

    The equations of motion are time-stepped forward in Fourier space:

    \[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

    In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

    The linear operator is constructed in Equation

    GeophysicalFlows.MultiLayerQG.EquationFunction
    Equation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcN!.

    source
    GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
    hyperviscosity(params, grid)

    Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

    \[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

    source

    The nonlinear terms are computed via

    GeophysicalFlows.MultiLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Linearized MultiLayerQG dynamics

    The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

    Helper functions

    GeophysicalFlows.MultiLayerQG.set_ψ!Function
    set_ψ!(params, vars, grid, sol, ψ)
    +set_ψ!(prob, ψ)

    Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

    source

    Diagnostics

    The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

    GeophysicalFlows.MultiLayerQG.energiesFunction
    energies(vars, params, grid, sol)
    +energies(prob)

    Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

    The kinetic energy at the $j$-th fluid layer is

    \[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

    while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

    \[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

    source

    The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

    GeophysicalFlows.MultiLayerQG.fluxesFunction
    fluxes(vars, params, grid, sol)
    +fluxes(prob)

    Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

    The lateral eddy fluxes within the $j$-th fluid layer are

    \[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

    while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

    \[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

    source

    Examples

    diff --git a/v0.15.4/modules/singlelayerqg/index.html b/v0.15.4/modules/singlelayerqg/index.html new file mode 100644 index 00000000..8f835609 --- /dev/null +++ b/v0.15.4/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

    SingleLayerQG

    Basic Equations

    This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

    \[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

    where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

    The dynamical variable is $q$. Thus, the equation solved by the module is:

    \[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

    The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SingleLayerQG.EquationFunction
    Equation(params::BarotropicQGParams, grid)

    Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    The nonlinear term is computed via calcN! function.

    source
    Equation(params::EquivalentBarotropicQGParams, grid)

    Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

    The nonlinear term is computed via calcN! function.

    source

    The nonlinear terms are computed via

    GeophysicalFlows.SingleLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    The kinetic energy of the fluid is computed via:

    GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    source

    while the potential energy, for an equivalent barotropic fluid, is computed via:

    GeophysicalFlows.SingleLayerQG.potential_energyFunction
    potential_energy(prob)

    Return the problem's (prob) domain-averaged potential energy of the fluid,

    \[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

    source

    The total energy is:

    GeophysicalFlows.SingleLayerQG.energyFunction
    energy(prob)

    Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

    source

    Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

    Examples

    diff --git a/v0.15.4/modules/surfaceqg/index.html b/v0.15.4/modules/surfaceqg/index.html new file mode 100644 index 00000000..044215e2 --- /dev/null +++ b/v0.15.4/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

    SurfaceQG

    Basic Equations

    This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

    \[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

    The SQG model evolves the surface buoyancy,

    \[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

    Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

    \[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

    with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

    These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

    \[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

    where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

    Implementation

    The buoyancy equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

    The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SurfaceQG.EquationFunction
    Equation(params, grid)

    Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

    \[L = - ν |𝐤|^{2 n_ν} .\]

    Plain old viscocity corresponds to $n_ν=1$.

    The nonlinear term is computed via function calcN!().

    source

    while the nonlinear terms via

    GeophysicalFlows.SurfaceQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    Some useful diagnostics are kinetic energy and buoyancy variance.

    GeophysicalFlows.SurfaceQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    In SQG, this is identical to half the domain-averaged surface buoyancy variance.

    source
    GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
    buoyancy_variance(prob)

    Return the buoyancy variance,

    \[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

    In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

    source

    Other diagnostic include: buoyancy_dissipation and buoyancy_work.

    Examples

    diff --git a/v0.15.4/modules/twodnavierstokes/index.html b/v0.15.4/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..9e45df56 --- /dev/null +++ b/v0.15.4/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

    TwoDNavierStokes

    Basic Equations

    This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

    \[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

    where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.TwoDNavierStokes.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

    \[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

    Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

    The nonlinear term is computed via the function calcN!.

    source

    The nonlinear terms are computed via calcN!,

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    Some useful diagnostics are:

    GeophysicalFlows.TwoDNavierStokes.energyFunction
    energy(prob)

    Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

    where $ψ$ is the streamfunction.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
    enstrophy(prob)

    Return the problem's (prob) domain-averaged enstrophy,

    \[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

    Examples

    diff --git a/v0.15.4/references.bib b/v0.15.4/references.bib new file mode 100644 index 00000000..4007e7ac --- /dev/null +++ b/v0.15.4/references.bib @@ -0,0 +1,81 @@ +@article{Held-etal-1995, + title={Surface quasi-geostrophic dynamics}, + author={Held, Isaac M. and Pierrehumbert, Raymond T. and Garner, Stephen T. and Swanson, Kyle L.}, + journal={Journal of Fluid Mechanics}, + volume={282}, + pages={1--20}, + year={1995}, + doi={10.1017/S0022112095000012} +} + +@article{Capet-etal-2008, + title={Surface kinetic energy transfer in surface quasi-geostrophic flows}, + author={Capet, Xavier and Klein, Patrice and Hua, Bach Lien and Lapeyre, Guillaume and Mcwilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={604}, + pages={165--174}, + year={2008}, + doi={10.1017/S0022112008001110} +} + +@article{McWilliams-1984, + title={The emergence of isolated coherent vortices in turbulent flow}, + author={McWilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={146}, + pages={21--43}, + year={1984}, + doi={10.1017/S0022112084001750} +} + +@article{Farrell-Ioannou-2003, + title = {Structural stability of turbulent jets}, + author = {Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + pages = {2101--2118}, + volume = 60, + year = 2003, + doi = {10.1175/1520-0469(2003)060<2101:SSOTJ>2.0.CO;2}, +} + +@article{Constantinou-etal-2014, + title = {Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory}, + author = {Constantinou, Navid C. and Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {71}, + number = {5}, + pages = {1818--1842}, + year = {2014}, + doi = {10.1175/JAS-D-13-076.1}, +} + +@article{Srinivasan-Young-2012, + title = {Zonostrophic instability}, + author = {Srinivasan, Kaushik and Young, William R.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {69}, + number = {5}, + pages = {1633--1656}, + year = {2012}, + doi = {10.1175/JAS-D-11-0200.1}, +} + +@article{vanKampen-1981, + title={Itô versus Stratonovich}, + author={Van Kampen, Nicolaas G}, + journal={Journal of Statistical Physics}, + volume={24}, + pages={175--187}, + year={1981}, + doi={10.1007/BF01007642} +} + +@phdthesis{Constantinou-2015-phd, + title = {Formation of large-scale structures by turbulence in rotating planets}, + author = {Constantinou, N. C.}, + school = {National and Kapodistrian University of Athens}, + address = {Athens}, + url = {http://www.didaktorika.gr/eadd/handle/10442/35501?locale=en}, + year = {2015}, + note = {(also available at arXiv:1503.07644)} +} diff --git a/v0.15.4/references/index.html b/v0.15.4/references/index.html new file mode 100644 index 00000000..f8358d0b --- /dev/null +++ b/v0.15.4/references/index.html @@ -0,0 +1,2 @@ + +References · GeophysicalFlows.jl

    References

    diff --git a/v0.15.4/search_index.js b/v0.15.4/search_index.js new file mode 100644 index 00000000..827d2a4e --- /dev/null +++ b/v0.15.4/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min\nstep: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.08 min\nstep: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.11 min\nstep: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.15 min\nstep: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.19 min\n","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"Capet, X.; Klein, P.; Hua, B. L.; Lapeyre, G. and Mcwilliams, J. C. (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. Journal of Fluid Mechanics 604, 165–174.\n\n\n\nConstantinou, N. C. (2015). Formation of large-scale structures by turbulence in rotating planets. Ph.D. Thesis, National and Kapodistrian University of Athens (Athens) (also available at arXiv:1503.07644).\n\n\n\nConstantinou, N. C.; Farrell, B. F. and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. Journal of the Atmospheric Sciences 71, 1818–1842.\n\n\n\nFarrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. Journal of the Atmospheric Sciences 60, 2101–2118.\n\n\n\nHeld, I. M.; Pierrehumbert, R. T.; Garner, S. T. and Swanson, K. L. (1995). Surface quasi-geostrophic dynamics. Journal of Fluid Mechanics 282, 1–20.\n\n\n\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. Journal of Fluid Mechanics 146, 21–43.\n\n\n\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. Journal of the Atmospheric Sciences 69, 1633–1656.\n\n\n\nVan Kampen, N. G. (1981). Itô versus Stratonovich. Journal of Statistical Physics 24, 175–187.\n\n\n\n","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = g fracrho_j+1 - rho_jrho_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia> ]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Output\n ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}\n ├──── path: ./forcedbetaQLturb.jld2\n └── fields: Dict{Symbol, Function}(:sol => Main.var\"##313\".get_sol, :u => Main.var\"##313\".get_u)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.64, E: 0.0286, Q: 3.9616, walltime: 0.10 min\nstep: 2000, t: 100, cfl: 0.81, E: 0.0384, Q: 4.1193, walltime: 0.18 min\nstep: 3000, t: 150, cfl: 0.80, E: 0.0441, Q: 4.4990, walltime: 0.27 min\nstep: 4000, t: 200, cfl: 0.80, E: 0.0450, Q: 3.6810, walltime: 0.37 min\nstep: 5000, t: 250, cfl: 0.87, E: 0.0472, Q: 4.0671, walltime: 0.46 min\nstep: 6000, t: 300, cfl: 0.92, E: 0.0484, Q: 4.1866, walltime: 0.56 min\nstep: 7000, t: 350, cfl: 0.89, E: 0.0482, Q: 3.8817, walltime: 0.66 min\nstep: 8000, t: 400, cfl: 0.92, E: 0.0482, Q: 3.7857, walltime: 0.77 min\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that often this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\", \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min\nstep: 1000, t: 5, cfl: 0.40, E: 0.2971, Z: 36.2188, walltime: 0.12 min\nstep: 2000, t: 10, cfl: 0.49, E: 0.4138, Z: 37.5536, walltime: 0.22 min\nstep: 3000, t: 15, cfl: 0.45, E: 0.4564, Z: 36.3428, walltime: 0.33 min\nstep: 4000, t: 20, cfl: 0.55, E: 0.4775, Z: 37.3600, walltime: 0.44 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"../../../examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#multilayerqg_2layer_example","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀, g = 1, 1 # Coriolis parameter and gravitational constant\nH = [0.2, 0.8] # the rest depths of each layer\nρ = [4.0, 5.0] # the density of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, g, H, ρ, U, μ, β,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min\nstep: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.17 min\nstep: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.31 min\nstep: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.45 min\nstep: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.59 min\nstep: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.72 min\nstep: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.86 min\nstep: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.02 min\nstep: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.18 min\nstep: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.33 min\nstep: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.49 min\nstep: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.64 min\nstep: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.79 min\nstep: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 1.92 min\nstep: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.05 min\nstep: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.18 min\nstep: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.30 min\nstep: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.42 min\nstep: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.53 min\nstep: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.64 min\nstep: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.75 min\n","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"step: 0100, t: 0.5, cfl: 0.168, walltime: 0.01 min\nstep: 0200, t: 1.0, cfl: 0.238, walltime: 0.03 min\nstep: 0300, t: 1.5, cfl: 0.304, walltime: 0.04 min\nstep: 0400, t: 2.0, cfl: 0.301, walltime: 0.05 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\", \"ensemble mean energy work, \", \"dissipation, Dᵋ\", \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\", \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\", \"ensemble mean enstophy work, \", \"dissipation, Dᶻ\", \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\", \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"../../../examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nequivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nbarotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.07 min\nequivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.07 min\nbarotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.14 min\nequivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.14 min\nbarotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.20 min\nequivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.20 min\nbarotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.27 min\nequivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.27 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Tuple: array with density of each fluid layer\nH::Tuple: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Tuple: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to eta in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\ng::Any: gravitational constant\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nρ::Tuple: array with density of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 12) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min\nstep: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.17 min\nstep: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.30 min\nstep: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.42 min\nstep: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.55 min\n","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.GeophysicalFlows","category":"page"},{"location":"lib/functions/#GeophysicalFlows.GeophysicalFlows","page":"Functions","title":"GeophysicalFlows.GeophysicalFlows","text":"Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.\n\n\n\n\n\n","category":"module"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work\nGeophysicalFlows.TwoDNavierStokes.palinstrophy","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.palinstrophy","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.palinstrophy","text":"palinstrophy(prob)\n\nReturn the problem's (prob) domain-averaged palinstrophy,\n\nint frac12 bf ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n g = 1.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n ρ = Array{Float64}(1:nlayers),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\ng: Gravitational acceleration constant.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nρ: Density of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 0500, t: 25, cfl: 0.49, E: 0.0181, Q: 2.6734, walltime: 0.03 min\nstep: 1000, t: 50, cfl: 0.75, E: 0.0294, Q: 2.9033, walltime: 0.04 min\nstep: 1500, t: 75, cfl: 0.72, E: 0.0366, Q: 2.8531, walltime: 0.06 min\nstep: 2000, t: 100, cfl: 0.76, E: 0.0405, Q: 2.8524, walltime: 0.08 min\nstep: 2500, t: 125, cfl: 0.90, E: 0.0432, Q: 2.7659, walltime: 0.10 min\nstep: 3000, t: 150, cfl: 0.74, E: 0.0461, Q: 2.8456, walltime: 0.12 min\nstep: 3500, t: 175, cfl: 0.84, E: 0.0458, Q: 2.5441, walltime: 0.14 min\nstep: 4000, t: 200, cfl: 0.83, E: 0.0463, Q: 2.6039, walltime: 0.15 min\nstep: 4500, t: 225, cfl: 0.78, E: 0.0468, Q: 2.7381, walltime: 0.17 min\nstep: 5000, t: 250, cfl: 0.95, E: 0.0475, Q: 2.7058, walltime: 0.19 min\nstep: 5500, t: 275, cfl: 0.72, E: 0.0481, Q: 2.8522, walltime: 0.21 min\nstep: 6000, t: 300, cfl: 0.83, E: 0.0481, Q: 2.8540, walltime: 0.23 min\nstep: 6500, t: 325, cfl: 0.87, E: 0.0479, Q: 2.8534, walltime: 0.25 min\nstep: 7000, t: 350, cfl: 0.81, E: 0.0474, Q: 2.7300, walltime: 0.27 min\nstep: 7500, t: 375, cfl: 0.96, E: 0.0469, Q: 2.6818, walltime: 0.29 min\nstep: 8000, t: 400, cfl: 0.74, E: 0.0466, Q: 2.6955, walltime: 0.30 min\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"n = Observable(1)\n\nqₙ = @lift irfft(qh[$n], nx)\nψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)\nq̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))\nūₙ = @lift vec(mean(u[$n], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$n])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, qₙ;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψₙ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψₙ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₙ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₙ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 16) do i\n n[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"../../../examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"\"SurfaceQG_decaying_n_256\"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16\nstep: 0500, t: 15.0, cfl: 0.588, walltime: 0.06 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11\nstep: 1000, t: 30.0, cfl: 0.571, walltime: 0.10 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09\nstep: 1500, t: 45.0, cfl: 0.577, walltime: 0.15 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08\nstep: 2000, t: 60.0, cfl: 0.574, walltime: 0.20 min\nbuoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08\n","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Drivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surv. Math. Sci., 10(1), 1–100, doi:10.4171/emss/66.\nParfenyev, V. (2023) Statistical analysis of vortex condensate motion in two-dimensional turbulence. arXiv preprint arXiv:2311.03065, doi:10.48550/arXiv.2311.03065.\nShokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.\nBischoff, T. and Deck, K. (2023) Unpaired downscaling of fluid flows with diffusion bridges. arXiv preprint arXiv:2305.01822, doi:10.48550/arXiv.2305.01822.\nSiegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.\nBisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nParfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.\nPalóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"../../../examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decay_topography_example","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.25 min\nstep: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.46 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/v0.15.4/siteinfo.js b/v0.15.4/siteinfo.js new file mode 100644 index 00000000..55ed1c16 --- /dev/null +++ b/v0.15.4/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.15.4"; diff --git a/v0.15.4/stochastic_forcing/index.html b/v0.15.4/stochastic_forcing/index.html new file mode 100644 index 00000000..e4ff0ade --- /dev/null +++ b/v0.15.4/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that often this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/v0.15.4/visualize/index.html b/v0.15.4/visualize/index.html new file mode 100644 index 00000000..367a09d0 --- /dev/null +++ b/v0.15.4/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/v0.16 b/v0.16 new file mode 120000 index 00000000..23fed31c --- /dev/null +++ b/v0.16 @@ -0,0 +1 @@ +v0.16.1 \ No newline at end of file diff --git a/v0.16.0/.documenter-siteinfo.json b/v0.16.0/.documenter-siteinfo.json new file mode 100644 index 00000000..6c1fffb4 --- /dev/null +++ b/v0.16.0/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2023-12-20T06:23:46","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v0.16.0/aliasing/index.html b/v0.16.0/aliasing/index.html new file mode 100644 index 00000000..97496be1 --- /dev/null +++ b/v0.16.0/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

    Aliasing

    In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

    De-aliasing scheme

    FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

    julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
    +
    +julia> OneDimensionalGrid
    +         ├─────────── Device: CPU
    +         ├──────── FloatType: Float64
    +         ├────────── size Lx: 6.283185307179586
    +         ├──── resolution nx: 64
    +         ├── grid spacing dx: 0.09817477042468103
    +         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
    +         └─ aliased fraction: 0.5

    or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

    julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
    +Problem
    +  ├─────────── grid: grid (on CPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper
    +  
    +julia> prob.grid.aliased_fraction
    +0.5

    Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

    All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

    To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

    diff --git a/v0.16.0/assets/README/index.html b/v0.16.0/assets/README/index.html new file mode 100644 index 00000000..57cf2f5d --- /dev/null +++ b/v0.16.0/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/v0.16.0/assets/documenter.js b/v0.16.0/assets/documenter.js new file mode 100644 index 00000000..f5311607 --- /dev/null +++ b/v0.16.0/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
    Type something to get started!
    + `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
    `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
    ${count} result(s)
    `; + + search_result_container = ` +
    + ${modal_filters} + ${search_divider} + ${result_count} +
    + ${search_results} +
    +
    + `; + } else { + search_result_container = ` +
    + ${modal_filters} + ${search_divider} +
    0 result(s)
    +
    +
    No result found!
    + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
    + Filters: + ${str} +
    + `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
    `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
    +
    ${result.title}
    +
    ${result.category}
    +
    +

    + ${display_result} +

    +
    + ${display_link} +
    +
    + ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
    Type something to get started!
    +`; + +let search_modal_footer = ` +
    + + Ctrl + + / to search + + esc to close +
    +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
    Type something to get started!
    + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v0.16.0/assets/energy_budgets_Ito.svg b/v0.16.0/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..de8d0090 --- /dev/null +++ b/v0.16.0/assets/energy_budgets_Ito.svg @@ -0,0 +1,1397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.16.0/assets/energy_budgets_Stratonovich.svg b/v0.16.0/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..7ed887ab --- /dev/null +++ b/v0.16.0/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.16.0/assets/energy_comparison.svg b/v0.16.0/assets/energy_comparison.svg new file mode 100644 index 00000000..398b7df7 --- /dev/null +++ b/v0.16.0/assets/energy_comparison.svg @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.16.0/assets/themes/documenter-dark.css b/v0.16.0/assets/themes/documenter-dark.css new file mode 100644 index 00000000..9f5449f4 --- /dev/null +++ b/v0.16.0/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v0.16.0/assets/themes/documenter-light.css b/v0.16.0/assets/themes/documenter-light.css new file mode 100644 index 00000000..2f168c77 --- /dev/null +++ b/v0.16.0/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v0.16.0/assets/themeswap.js b/v0.16.0/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v0.16.0/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v0.16.0/assets/warner.js b/v0.16.0/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v0.16.0/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v0.16.0/contributing/index.html b/v0.16.0/contributing/index.html new file mode 100644 index 00000000..d0b26385 --- /dev/null +++ b/v0.16.0/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

    Contributors' Guide

    This is a short guide for potential GeophysicalFlows.jl contributors.

    Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

    We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

    What can I do?

    • Tackle an existing issue.

    • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

    • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

    • Improve documentation, docstrings, or comments if you found something is hard to use.

    • Implement a new feature (e.g., a new diagnostic into a module).

    • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

    If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

    Ground Rules

    • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
    • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
    • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
    • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

    Reporting a bug

    The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

    • Head over to the issues page.
    • Search to see if your issue already exists or has even been solved previously.
    • If you indeed have a new issue or request, click the "New Issue" button.
    • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

    Setting up your development environment

    • Install Julia on your system.
    • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
    • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
    • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
      git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
    • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
    • Connect your repository to the upstream (main project).
      git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
    • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
    • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

    Your development environment is now ready!

    Pull Requests

    Changes and contributions should be made via GitHub pull requests against the main branch.

    When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

    When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

    Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

    Documentation

    All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

    We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

    You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

    julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    +julia --project=docs/ docs/make.jl

    and then open docs/build/index.html in your favorite browser.

    Credits

    This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

    diff --git a/v0.16.0/gpu/index.html b/v0.16.0/gpu/index.html new file mode 100644 index 00000000..27a0542a --- /dev/null +++ b/v0.16.0/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

    GPU

    GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

    All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

    julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
    +Problem
    +  ├─────────── grid: grid (on GPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper

    Selecting GPU device

    FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

    diff --git a/v0.16.0/index.html b/v0.16.0/index.html new file mode 100644 index 00000000..8a3f5640 --- /dev/null +++ b/v0.16.0/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

    GeophysicalFlows.jl Documentation

    Overview

    GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

    Examples

    Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

    Fourier transforms normalization

    Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

    \[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

    The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

    \[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

    where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

    Read more in the FourierFlows.jl Documentation; see Grids section.

    Unicode

    Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

    Read more about Unicode symbols in the Julia Documentation.

    Developers

    The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

    Citing

    If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

    Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

    The bibtex entry for the paper is:

    @article{GeophysicalFlowsJOSS,
    +  doi = {10.21105/joss.03053},
    +  url = {https://doi.org/10.21105/joss.03053},
    +  year = {2021},
    +  publisher = {The Open Journal},
    +  volume = {6},
    +  number = {60},
    +  pages = {3053},
    +  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
    +  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
    +  journal = {Journal of Open Source Software}
    +}

    Papers using GeophysicalFlows.jl

    1. Drivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surveys in Mathematical Sciences, 10(1), 1–100, doi:10.4171/emss/66.

    2. Parfenyev, V. (2023) Statistical analysis of vortex condensate motion in two-dimensional turbulence. arXiv preprint arXiv:2311.03065, doi:10.48550/arXiv.2311.03065.

    3. Shokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.

    4. Bischoff, T. and Deck, K. (2023) Unpaired downscaling of fluid flows with diffusion bridges. arXiv preprint arXiv:2305.01822, doi:10.48550/arXiv.2305.01822.

    5. Siegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.

    6. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

    7. Parfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.

    8. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.

    9. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.

    10. Palóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

    11. Karrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

    diff --git a/v0.16.0/installation_instructions/index.html b/v0.16.0/installation_instructions/index.html new file mode 100644 index 00000000..141cf4f9 --- /dev/null +++ b/v0.16.0/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

    Installation instructions

    You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

    julia> ]
    +(v1.6) pkg> add GeophysicalFlows
    +(v1.6) pkg> instantiate

    We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

    (v1.6) pkg> update GeophysicalFlows

    Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

    Use Julia 1.6 or newer

    The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

    Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

    diff --git a/v0.16.0/lib/functions/index.html b/v0.16.0/lib/functions/index.html new file mode 100644 index 00000000..2d63024f --- /dev/null +++ b/v0.16.0/lib/functions/index.html @@ -0,0 +1,88 @@ + +Functions · GeophysicalFlows.jl

    Functions

    GeophysicalFlows

    GeophysicalFlows.GeophysicalFlowsModule

    Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.

    source

    Exported functions

    GeophysicalFlows.lambdipoleFunction
    lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

    Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

    source
    GeophysicalFlows.peakedisotropicspectrumFunction
    peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

    Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

    source

    TwoDNavierStokes

    Exported functions

    GeophysicalFlows.TwoDNavierStokes.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                  μ = 0,
    +                 nμ = 0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a two-dimensional Navier-Stokes problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Large-scale (hypo)-viscosity coefficient.
    • : (Hypo)-viscosity order, $≤ 0$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.TwoDNavierStokes.energy_workFunction
    energy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

    \[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

    where $ψ$ is the stream flow.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
    enstrophy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

    \[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

    where $ζ$ is the relative vorticity.

    source
    GeophysicalFlows.TwoDNavierStokes.palinstrophyFunction
    palinstrophy(prob)

    Return the problem's (prob) domain-averaged palinstrophy,

    \[\int \frac1{2} |{\bf ∇} ζ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Private functions

    GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

    source
    GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
    energy_dissipation(prob, ξ, νξ)

    Return the domain-averaged energy dissipation rate done by the viscous term,

    \[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
    enstrophy_dissipation(prob, ξ, νξ)

    Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

    \[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source

    SingleLayerQG

    Exported functions

    GeophysicalFlows.SingleLayerQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    + deformation_radius = Inf,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a single-layer quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    GeophysicalFlows.SingleLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

    source

    MultiLayerQG

    Exported functions

    GeophysicalFlows.MultiLayerQG.ProblemFunction
    Problem(nlayers :: Int,
    +                    dev = CPU();
    +                     nx = 128,
    +                     ny = nx,
    +                     Lx = 2π,
    +                     Ly = Lx,
    +                     f₀ = 1.0,
    +                      β = 0.0,
    +                      U = zeros(nlayers),
    +                      H = 1/nlayers * ones(nlayers),
    +                      b = -(1 .+ 1/nlayers * Array{Float64}(0:nlayers-1)),
    +                    eta = nothing,
    +topographic_pv_gradient = (0, 0),
    +                      μ = 0,
    +                      ν = 0,
    +                     nν = 1,
    +                     dt = 0.01,
    +                stepper = "RK4",
    +                 calcFq = nothingfunction,
    +             stochastic = false,
    +                 linear = false,
    +       aliased_fraction = 1/3,
    +                      T = Float64)

    Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

    Arguments

    • nlayers: (required) Number of fluid layers.
    • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • f₀: Constant planetary vorticity.
    • β: Planetary vorticity $y$-gradient.
    • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
    • H: Rest height of each fluid layer.
    • b: Boussinesq buoyancy of each fluid layer.
    • eta: Periodic component of the topographic potential vorticity.
    • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
    • μ: Linear bottom drag coefficient.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
    • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64 (default); floating point type used for problem data.
    source
    GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
    streamfunctionfrompv!(ψh, qh, params, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

    source
    streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

    source
    streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    \[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source
    GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
    pvfromstreamfunction!(qh, ψh, params, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

    source
    pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

    source
    pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) (ψ̂₂ - ψ̂₁) ,\]

    \[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) (ψ̂₁ - ψ̂₂) .\]

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source

    Private functions

    GeophysicalFlows.MultiLayerQG.LinearEquationFunction
    LinearEquation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcNlinear!.

    source
    GeophysicalFlows.MultiLayerQG.calcS!Function
    calcS!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
    calcS⁻¹!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcNlinear!Function
    calcNlinear!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term of the linearized equations:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, vars, params, grid)

    Compute the advection term and stores it in N:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
    calcN_linearadvection!(N, sol, vars, params, grid)

    Compute the advection term of the linearized equations and stores it in N:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source

    SurfaceQG

    Exported functions

    GeophysicalFlows.SurfaceQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 Lx = 2π,
    +                 ny = nx,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a surface quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
    buoyancy_dissipation(prob)

    Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

    \[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

    where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

    source
    GeophysicalFlows.SurfaceQG.buoyancy_workFunction
    buoyancy_work(prob)
    +buoyancy_work(sol, vars, grid)

    Return the domain-averaged rate of work of buoyancy variance by the forcing,

    \[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

    source

    Private functions

    GeophysicalFlows.SurfaceQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

    source

    BarotropicQGQL

    Exported functions

    GeophysicalFlows.BarotropicQGQL.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    diff --git a/v0.16.0/lib/types/index.html b/v0.16.0/lib/types/index.html new file mode 100644 index 00000000..b6b941c0 --- /dev/null +++ b/v0.16.0/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

    Private types

    TwoDNavierStokes

    GeophysicalFlows.TwoDNavierStokes.ParamsType
    struct Params{T} <: AbstractParams

    The parameters for a two-dimensional Navier-Stokes problem:

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • μ::Any: large-scale (hypo)-viscosity coefficient

    • nμ::Int64: (hypo)-viscosity order, $≤ 0$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.TwoDNavierStokes.VarsType
    struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

    The variables for two-dimensional Navier-Stokes problem:

    • ζ: relative vorticity

    • u: x-component of velocity

    • v: y-component of velocity

    • ζh: Fourier transform of relative vorticity

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SingleLayerQG

    GeophysicalFlows.SingleLayerQG.ParamsType
    struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

    The parameters for the SingleLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • deformation_radius::Any: Rossby radius of deformation

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SingleLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

    The variables for SingleLayer QG:

    • q: relative vorticity (+ vortex stretching)

    • ψ: streamfunction

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • qh: Fourier transform of relative vorticity (+ vortex stretching)

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    MultiLayerQG

    GeophysicalFlows.MultiLayerQG.ParamsType
    struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams

    The parameters for the MultiLayerQG problem.

    • nlayers::Int64: number of fluid layers

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • b::Tuple: array with Boussinesq buoyancy of each fluid layer

    • H::Tuple: array with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Tuple: array with the reduced gravity constants for each fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to eta in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • S::Any: array containing coeffients for getting PV from streamfunction

    • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
    struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a single-layer MultiLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • U::Any: array with imposed constant zonal flow $U(y)$

    • eta::Any: array containing the periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
    struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a two-layer MultiLayerQG problem.

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • b::Tuple: array with Boussinesq buoyancy of each fluid layer

    • H::Tuple: tuple with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: the reduced gravity constants for the fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: AbstractVars

    The variables for multi-layer QG problem.

    • q: relative vorticity + vortex stretching

    • ψ: streamfunction

    • u: x-component of velocity

    • v: y-component of velocity

    • qh: Fourier transform of relative vorticity + vortex stretching

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fqh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SurfaceQG

    GeophysicalFlows.SurfaceQG.ParamsType
    Params{T}(ν, nν, calcF!)

    A struct containing the parameters for Surface QG dynamics. Included are:

    • ν::Any: buoyancy (hyper)-viscosity coefficient

    • nν::Int64: buoyancy (hyper)-viscosity order

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SurfaceQG.VarsType
    Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

    The variables for surface QG problem:

    • b: buoyancy

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • bh: Fourier transform of buoyancy

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    BarotropicQGQL

    GeophysicalFlows.BarotropicQGQL.ParamsType
    Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

    A struct containing the parameters for a barotropic QL QG problem. Included are:

    • β::Any: planetary vorticity $y$-gradient

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.BarotropicQGQL.VarsType
    Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

    The variables for barotropic QL QG:

    • u: $x$-component of small-scale velocity

    • v: $y$-component of small-scale velocity

    • U: $x$-component of large-scale velocity

    • uzeta: small-scale $u′ζ′$

    • vzeta: small-scale $v′ζ′$

    • zeta: small-scale relative vorticity

    • Zeta: large-scale relative vorticity

    • psi: small-scale streamfunction

    • Psi: large-scale streamfunction

    • Nz: small-scale nonlinear term

    • NZ: large-scale nonlinear term

    • uh: Fourier transform of $x$-component of small-scale velocity

    • vh: Fourier transform of $y$-component of small-scale velocity

    • Uh: Fourier transform of $x$-component of large-scale velocity

    • zetah: Fourier transform of small-scale relative vorticity

    • Zetah: Fourier transform of large-scale relative vorticity

    • psih: Fourier transform of small-scale relative vorticity

    • Psih: Fourier transform of large-scale relative vorticity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source
    diff --git a/v0.16.0/literated/barotropicqgql_betaforced-24.png b/v0.16.0/literated/barotropicqgql_betaforced-24.png new file mode 100644 index 00000000..b48791f7 Binary files /dev/null and b/v0.16.0/literated/barotropicqgql_betaforced-24.png differ diff --git a/v0.16.0/literated/barotropicqgql_betaforced.mp4 b/v0.16.0/literated/barotropicqgql_betaforced.mp4 new file mode 100644 index 00000000..307f3942 Binary files /dev/null and b/v0.16.0/literated/barotropicqgql_betaforced.mp4 differ diff --git a/v0.16.0/literated/barotropicqgql_betaforced/index.html b/v0.16.0/literated/barotropicqgql_betaforced/index.html new file mode 100644 index 00000000..170771cd --- /dev/null +++ b/v0.16.0/literated/barotropicqgql_betaforced/index.html @@ -0,0 +1,172 @@ + +Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +using Statistics: mean
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n^2
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                              calcF=calcF!, stochastic=true, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x, grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics – energy and enstrophy are functions imported at the top.

    E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
    +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

    We can also define our custom diagnostics via functions.

    zetaMean(prob) = prob.sol[1, :]
    +
    +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

    We combile all diags in a list.

    diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaQLturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "forcedbetaQLturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  grid, vars = prob.grid, prob.vars
    +
    +  @. vars.uh = im * grid.l  * grid.invKrsq * sol
    +  ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))
    +
    +  return  vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    Output
    +  ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
    +  ├──── path: ./forcedbetaQLturb.jld2
    +  └── fields: Dict{Symbol, Function}(:sol => Main.var"##313".get_sol, :u => Main.var"##313".get_u)

    Visualizing the simulation

    We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

    title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axζ̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean ζ",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.05)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 5)))
    +
    +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta
    +ζ = Observable(Array(@. ζ̄ + ζ′))
    +ψ̄, ψ′= prob.vars.Psi,  prob.vars.psi
    +ψ = Observable(Array(@. ψ̄ + ψ′))
    +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))
    +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))
    +
    +μt = Observable(μ * E.t[1:1])
    +energy = Observable(E.data[1:1])
    +enstrophy = Observable(Z.data[1:1])
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +heatmap!(axψ, x, y, ψ;
    +         colormap = :viridis, colorrange = (-0.22, 0.22))
    +
    +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)
    +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, μt, energy; linewidth = 3)
    +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],
    +      (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = @. ζ̄ + ζ′
    +  ψ[] = @. ψ̄ + ψ′
    +  ζ̄ₘ[] = vec(mean(ζ̄, dims=1))
    +  ūₘ[] = vec(mean(prob.vars.U, dims=1))
    +
    +  μt.val = μ * E.t[1:E.i]
    +  energy[] = E.data[1:E.i]
    +  enstrophy[] = Z.data[1:E.i]
    +
    +  title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  BarotropicQGQL.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.64, E: 0.0286, Q: 3.9616, walltime: 0.10 min
    +step: 2000, t: 100, cfl: 0.81, E: 0.0384, Q: 4.1193, walltime: 0.19 min
    +step: 3000, t: 150, cfl: 0.80, E: 0.0441, Q: 4.4990, walltime: 0.28 min
    +step: 4000, t: 200, cfl: 0.80, E: 0.0450, Q: 3.6810, walltime: 0.38 min
    +step: 5000, t: 250, cfl: 0.87, E: 0.0472, Q: 4.0671, walltime: 0.48 min
    +step: 6000, t: 300, cfl: 0.92, E: 0.0484, Q: 4.1866, walltime: 0.58 min
    +step: 7000, t: 350, cfl: 0.89, E: 0.0482, Q: 3.8817, walltime: 0.68 min
    +step: 8000, t: 400, cfl: 0.92, E: 0.0482, Q: 3.7857, walltime: 0.79 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/multilayerqg_2layer-31.png b/v0.16.0/literated/multilayerqg_2layer-31.png new file mode 100644 index 00000000..cfb7afcf Binary files /dev/null and b/v0.16.0/literated/multilayerqg_2layer-31.png differ diff --git a/v0.16.0/literated/multilayerqg_2layer.mp4 b/v0.16.0/literated/multilayerqg_2layer.mp4 new file mode 100644 index 00000000..42307e05 Binary files /dev/null and b/v0.16.0/literated/multilayerqg_2layer.mp4 differ diff --git a/v0.16.0/literated/multilayerqg_2layer/index.html b/v0.16.0/literated/multilayerqg_2layer/index.html new file mode 100644 index 00000000..c6e9a97a --- /dev/null +++ b/v0.16.0/literated/multilayerqg_2layer/index.html @@ -0,0 +1,181 @@ + +Phillips model of Baroclinic Instability · GeophysicalFlows.jl

    Phillips model of Baroclinic Instability

    A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf
    +
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

    n = 128                  # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 2.5e-3         # timestep
    + nsteps = 20000          # total number of time-steps
    + nsubs  = 50             # number of time-steps for plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π                   # domain size
    +μ = 5e-2                 # bottom drag
    +β = 5                    # the y-gradient of planetary PV
    +
    +nlayers = 2              # number of layers
    +f₀ = 1                   # Coriolis parameter
    +H = [0.2, 0.8]           # the rest depths of each layer
    +b = [-1.0, -1.2]         # Boussinesq buoyancy of each layer
    +
    +U = zeros(nlayers)       # the imposed mean zonal flow in each layer
    +U[1] = 1.0
    +U[2] = 0.0

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, H, b, U, μ, β,
    +                            dt, stepper, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

    device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    seed!(1234) # reset of the random number generator for reproducibility
    +q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
    +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft  only in dims=1, 2
    +q₀  = irfft(q₀h, grid.nx, (1, 2))                 # apply irfft only in dims=1, 2
    +
    +MultiLayerQG.set_q!(prob, q₀)

    Diagnostics

    Create Diagnostics – energies function is imported at the top.

    E = Diagnostic(MultiLayerQG.energies, prob; nsteps)
    +diags = [E] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_2layer"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "2layer.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid
    +
    +  @. vars.qh = sol
    +  streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +  @. vars.uh = -im * grid.l * vars.ψh
    +  invtransform!(vars.u, vars.uh, params)
    +
    +  return vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t))
    +
    +q₁ = Observable(Array(vars.q[:, :, 1]))
    +ψ₁ = Observable(Array(vars.ψ[:, :, 1]))
    +q₂ = Observable(Array(vars.q[:, :, 2]))
    +ψ₂ = Observable(Array(vars.ψ[:, :, 2]))
    +
    +function compute_levels(maxf, nlevels=8)
    +  # -max(|f|):...:max(|f|)
    +  levelsf  = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))
    +
    +  # only positive
    +  levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))
    +
    +  # only negative
    +  levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))
    +
    +  return levelsf, levelsf⁺, levelsf⁻
    +end
    +
    +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))
    +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))
    +
    +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)
    +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)
    +
    +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])
    +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])
    +PE  = Observable(Point2f[(μ * E.t[1], E.data[1][2])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...)
    +
    +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...)
    +
    +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...)
    +
    +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...)
    +
    +axKE = Axis(fig[1, 3],
    +            xlabel = "μ t",
    +            ylabel = "KE",
    +            title = title_KE,
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +axPE = Axis(fig[2, 3],
    +            xlabel = "μ t",
    +            ylabel = "PE",
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +heatmap!(axq₁, x, y, q₁; colormap = :balance)
    +
    +heatmap!(axq₂, x, y, q₂; colormap = :balance)
    +
    +contourf!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁺, color=:black)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁻, color=:black, linestyle = :dash)
    +
    +contourf!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁺, color=:black)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁻, color=:black, linestyle = :dash)
    +
    +ke₁ = lines!(axKE, KE₁; linewidth = 3)
    +ke₂ = lines!(axKE, KE₂; linewidth = 3)
    +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"])
    +
    +lines!(axPE, PE; linewidth = 3)
    +
    +fig

    Time-stepping the Problem forward

    Finally, we time-step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min",
    +                   clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q₁[] = vars.q[:, :, 1]
    +  ψ₁[] = vars.ψ[:, :, 1]
    +  q₂[] = vars.q[:, :, 2]
    +  ψ₂[] = vars.ψ[:, :, 2]
    +
    +  maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])
    +  maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])
    +
    +  KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))
    +  KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))
    +  PE[]  = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))
    +
    +  title_KE[] = @sprintf("μ t = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  MultiLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min
    +step: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.17 min
    +step: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.32 min
    +step: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.46 min
    +step: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.60 min
    +step: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.74 min
    +step: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.88 min
    +step: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.04 min
    +step: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.21 min
    +step: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.37 min
    +step: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.53 min
    +step: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.68 min
    +step: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.83 min
    +step: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 1.96 min
    +step: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.10 min
    +step: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.23 min
    +step: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.35 min
    +step: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.47 min
    +step: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.59 min
    +step: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.71 min
    +step: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.82 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/v0.16.0/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 new file mode 100644 index 00000000..172dc2bb Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/v0.16.0/literated/singlelayerqg_betadecay-20.png b/v0.16.0/literated/singlelayerqg_betadecay-20.png new file mode 100644 index 00000000..97644316 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_betadecay-20.png differ diff --git a/v0.16.0/literated/singlelayerqg_betadecay-33.png b/v0.16.0/literated/singlelayerqg_betadecay-33.png new file mode 100644 index 00000000..ed3f1718 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_betadecay-33.png differ diff --git a/v0.16.0/literated/singlelayerqg_betadecay.mp4 b/v0.16.0/literated/singlelayerqg_betadecay.mp4 new file mode 100644 index 00000000..1bbcefa2 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_betadecay.mp4 differ diff --git a/v0.16.0/literated/singlelayerqg_betadecay/index.html b/v0.16.0/literated/singlelayerqg_betadecay/index.html new file mode 100644 index 00000000..a404d940 --- /dev/null +++ b/v0.16.0/literated/singlelayerqg_betadecay/index.html @@ -0,0 +1,131 @@ + +Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Decaying barotropic QG beta-plane turbulence

    An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.04           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.0       # bottom drag

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.08 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                          # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. q₀h = ifelse(K < 6  * 2π/L, 0, q₀h)
    +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)
    +@. q₀h[1, :] = 0    # remove any power from zonal wavenumber k=0
    +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀
    +q₀ = irfft(q₀h, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, q₀)

    Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (800, 360))
    +
    +axq = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial vorticity ∂v/∂x-∂u/∂y",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +axψ = Axis(fig[1, 2];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial streamfunction ψ",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +heatmap!(axq, x, y, Array(vars.q); colormap = :balance)
    +
    +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We plot the vorticity and streamfunction and their corresponding zonal mean structure.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(800, 720))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +q  = Observable(Array(vars.q))
    +ψ  = Observable(Array(vars.ψ))
    +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))
    +ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-12, 12))
    +
    +levels = collect(range(-0.7, stop=0.7, length=20))
    +
    +contourf!(axψ, x, y, ψ;
    +         levels, colormap = :viridis, colorrange = (-0.35, 0.35))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₘ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 12) do j
    +  if j % round(Int, nsteps/nsubs / 4) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +  q̄ₘ[] = vec(mean(vars.q, dims=1))
    +  ūₘ[] = vec(mean(vars.u, dims=1))
    +
    +  title_q[] = @sprintf("vorticity, t = %.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min
    +step: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.17 min
    +step: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.31 min
    +step: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.44 min
    +step: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.57 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/singlelayerqg_betaforced-23.png b/v0.16.0/literated/singlelayerqg_betaforced-23.png new file mode 100644 index 00000000..b48791f7 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_betaforced-23.png differ diff --git a/v0.16.0/literated/singlelayerqg_betaforced-48.png b/v0.16.0/literated/singlelayerqg_betaforced-48.png new file mode 100644 index 00000000..be9586f6 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_betaforced-48.png differ diff --git a/v0.16.0/literated/singlelayerqg_betaforced.mp4 b/v0.16.0/literated/singlelayerqg_betaforced.mp4 new file mode 100644 index 00000000..c7fbe0a2 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_betaforced.mp4 differ diff --git a/v0.16.0/literated/singlelayerqg_betaforced/index.html b/v0.16.0/literated/singlelayerqg_betaforced/index.html new file mode 100644 index 00000000..75c37f24 --- /dev/null +++ b/v0.16.0/literated/singlelayerqg_betaforced/index.html @@ -0,0 +1,199 @@ + +Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
    +
    +using Statistics: mean
    +using LinearAlgebra: ldiv!
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000          # total number of timesteps
    + save_substeps = 10      # number of timesteps after which output is saved
    +

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                             calcF=calcF!, stochastic=true)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostic – energy and enstrophy are functions imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  vars, grid, sol = prob.vars, prob.grid, prob.sol
    +
    +  @. vars.qh = sol
    +
    +  SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +
    +  ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)
    +
    +  return Array(vars.u)
    +end
    +
    +output = Output(prob, filename, (:qh, get_sol), (:u, get_u))

    We first save the problem's grid and other parameters so we can use them later.

    saveproblem(output)

    and then call saveoutput(output) once to save the initial state.

    saveoutput(output)

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +while clock.step <= nsteps
    +  if clock.step % 50save_substeps == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +    clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  stepforward!(prob, diags, save_substeps)
    +  SingleLayerQG.updatevars!(prob)
    +
    +  if clock.step % save_substeps == 0
    +    saveoutput(output)
    +  end
    +end
    +
    +savediagnostic(E, "energy", output.path)
    +savediagnostic(Z, "enstrophy", output.path)
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 0500, t: 25, cfl: 0.49, E: 0.0181, Q: 2.6734, walltime: 0.03 min
    +step: 1000, t: 50, cfl: 0.75, E: 0.0294, Q: 2.9033, walltime: 0.04 min
    +step: 1500, t: 75, cfl: 0.72, E: 0.0366, Q: 2.8531, walltime: 0.06 min
    +step: 2000, t: 100, cfl: 0.76, E: 0.0405, Q: 2.8524, walltime: 0.08 min
    +step: 2500, t: 125, cfl: 0.90, E: 0.0432, Q: 2.7659, walltime: 0.10 min
    +step: 3000, t: 150, cfl: 0.74, E: 0.0461, Q: 2.8456, walltime: 0.12 min
    +step: 3500, t: 175, cfl: 0.84, E: 0.0458, Q: 2.5441, walltime: 0.14 min
    +step: 4000, t: 200, cfl: 0.83, E: 0.0463, Q: 2.6039, walltime: 0.16 min
    +step: 4500, t: 225, cfl: 0.78, E: 0.0468, Q: 2.7381, walltime: 0.17 min
    +step: 5000, t: 250, cfl: 0.95, E: 0.0475, Q: 2.7058, walltime: 0.19 min
    +step: 5500, t: 275, cfl: 0.72, E: 0.0481, Q: 2.8522, walltime: 0.21 min
    +step: 6000, t: 300, cfl: 0.83, E: 0.0481, Q: 2.8540, walltime: 0.23 min
    +step: 6500, t: 325, cfl: 0.87, E: 0.0479, Q: 2.8534, walltime: 0.25 min
    +step: 7000, t: 350, cfl: 0.81, E: 0.0474, Q: 2.7300, walltime: 0.27 min
    +step: 7500, t: 375, cfl: 0.96, E: 0.0469, Q: 2.6818, walltime: 0.29 min
    +step: 8000, t: 400, cfl: 0.74, E: 0.0466, Q: 2.6955, walltime: 0.31 min
    +

    Load saved output and visualize

    We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

    file = jldopen(output.path)
    +
    +iterations = parse.(Int, keys(file["snapshots/t"]))
    +t = [file["snapshots/t/$i"] for i ∈ iterations]
    +
    +qh = [file["snapshots/qh/$i"] for i ∈ iterations]
    +u  = [file["snapshots/u/$i"] for i ∈ iterations]
    +
    +E_t = file["diagnostics/energy/t"]
    +Z_t = file["diagnostics/enstrophy/t"]
    +E_data = file["diagnostics/energy/data"]
    +Z_data = file["diagnostics/enstrophy/data"]
    +
    +x,  y  = file["grid/x"],  file["grid/y"]
    +nx, ny = file["grid/nx"], file["grid/ny"]
    +Lx, Ly = file["grid/Lx"], file["grid/Ly"]
    +
    +close(file)

    We create a figure using Makie's Observables

    n = Observable(1)
    +
    +qₙ = @lift irfft(qh[$n], nx)
    +ψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)
    +q̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))
    +ūₙ = @lift vec(mean(u[$n], dims=1))
    +
    +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$n])
    +
    +energy    = Observable([Point2f(E_t[1], E_data[1])])
    +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.055)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 3.1)))
    +
    +heatmap!(axq, x, y, qₙ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +levels = collect(-0.32:0.04:0.32)
    +
    +contourf!(axψ, x, y, ψₙ;
    +          levels, colormap = :viridis, colorrange = (-0.22, 0.22))
    +contour!(axψ, x, y, ψₙ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₙ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₙ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, energy; linewidth = 3)
    +lines!(axZ, enstrophy; linewidth = 3, color = :red)
    +
    +fig

    We are now ready to animate all saved output.

    frames = 1:length(t)
    +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 16) do i
    +  n[] = i
    +
    +  energy[]    = push!(energy[],    Point2f(μ * E_t[i], E_data[i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
    +end


    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png b/v0.16.0/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png new file mode 100644 index 00000000..e1500836 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png differ diff --git a/v0.16.0/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/v0.16.0/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html new file mode 100644 index 00000000..1e458acf --- /dev/null +++ b/v0.16.0/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -0,0 +1,93 @@ + +SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

    SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

    We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using GeophysicalFlows: peakedisotropicspectrum
    +using LinearAlgebra: ldiv!
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length
    +deformation_radius = 0.35   # the deformation radius
    +
    +# Then we pick the time-stepper parameters
    +    dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.

    For both problems we use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    stepper="FilteredRK4"
    +
    +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)
    +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)

    Setting initial conditions

    For initial condition we construct a relative vorticity with energy most energy around total wavenumber $k_0$.

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)

    SingleLayerQG allows us to set up the initial $q$ for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.

    ∇²ψ₀h = rfft(∇²ψ₀)
    +ψ₀h = @. 0 * ∇²ψ₀h
    +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)

    and then use the streamfunction to compute the corresponding $q_0$ for each problem,

    q₀_bqg   = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)
    +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)

    Now we can initialize our problems with the same flow.

    SingleLayerQG.set_q!(prob_bqg, q₀_bqg)
    +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)

    Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    function relativevorticity(prob)
    +  vars, grid = prob.vars, prob.grid
    +
    +  ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)
    +
    +  return vars.q
    +end
    +
    +x,  y  = prob_bqg.grid.x,  prob_bqg.grid.y
    +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +t_bqg = Observable(prob_bqg.clock.t)
    +t_eqbqg = Observable(prob_eqbqg.clock.t)
    +
    +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg)
    +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg)
    +
    +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)
    +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)
    +
    +ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))
    +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))
    +
    +heatmap!(ax1, x, y, ζ_bqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +heatmap!(ax2, x, y, ζ_eqbqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Time-stepping the Problem forward

    Now we time-step both problems forward and animate the relative vorticity in each case.

    startwalltime = time()
    +
    +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
    +
    +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)
    +    println(log_bqg)
    +
    +    log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)
    +    println(log_eqbqg)
    +  end
    +
    +  stepforward!(prob_bqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_bqg)
    +
    +  stepforward!(prob_eqbqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_eqbqg)
    +
    +  t_bqg[] = prob_bqg.clock.t
    +  t_eqbqg[] = prob_eqbqg.clock.t
    +  ζ_bqg[] = relativevorticity(prob_bqg)
    +  ζ_eqbqg[] = relativevorticity(prob_eqbqg)
    +end
    barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +equivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.07 min
    +equivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.07 min
    +barotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.14 min
    +equivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.14 min
    +barotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.21 min
    +equivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.21 min
    +barotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.28 min
    +equivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.28 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/singlelayerqg_decaying_topography-19.png b/v0.16.0/literated/singlelayerqg_decaying_topography-19.png new file mode 100644 index 00000000..5bacd88d Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_decaying_topography-19.png differ diff --git a/v0.16.0/literated/singlelayerqg_decaying_topography-24.png b/v0.16.0/literated/singlelayerqg_decaying_topography-24.png new file mode 100644 index 00000000..71773661 Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_decaying_topography-24.png differ diff --git a/v0.16.0/literated/singlelayerqg_decaying_topography.mp4 b/v0.16.0/literated/singlelayerqg_decaying_topography.mp4 new file mode 100644 index 00000000..46e84d1d Binary files /dev/null and b/v0.16.0/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/v0.16.0/literated/singlelayerqg_decaying_topography/index.html b/v0.16.0/literated/singlelayerqg_decaying_topography/index.html new file mode 100644 index 00000000..6e1a8004 --- /dev/null +++ b/v0.16.0/literated/singlelayerqg_decaying_topography/index.html @@ -0,0 +1,102 @@ + +Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

    Decaying barotropic QG turbulence over topography

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size

    Define the topographic potential vorticity, $\eta = f_0 h(x, y)/H$. The topography here is an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$.

    σx, σy = 0.4, 0.8
    +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    The topophic PV is prescribed via keyword argument eta.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,
    +                             dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    η = Array(params.eta)
    +
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "topographic PV η=f₀h/H",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +contourf!(ax, x, y, η;
    +          levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
    +
    +fig

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.04 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. qih = ifelse(K < 6  * 2π/L, 0, qih)
    +@. qih = ifelse(K > 12 * 2π/L, 0, qih)
    +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid))  # normalize qi to have energy E₀
    +qi = irfft(qih, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, qi)

    Let's plot the initial vorticity and streamfunction.

    q = Observable(Array(vars.q))
    +ψ = Observable(Array(vars.ψ))
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y")
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +title_ψ = Observable("initial streamfunction ψ")
    +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
    +
    +hm = heatmap!(axq, x, y, q;
    +              colormap = :balance, colorrange = (-8, 8))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +levels = collect(range(-0.28, stop=0.28, length=11))
    +
    +hc = contourf!(axψ, x, y, ψ;
    +               levels, colormap = :viridis, colorrange = (-0.28, 0.28),
    +               extendlow = :auto, extendhigh = :auto)
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +Colorbar(fig[1, 4], hc)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files.

    filepath = "."
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.

    contour!(axq, x, y, η;
    +         levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))
    +
    +contour!(axq, x, y, η;
    +         levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
    +
    +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +title_ψ[] = "streamfunction ψ"
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +
    +  title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t)
    +  title_ψ[] = "streamfunction ψ"
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.26 min
    +step: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.48 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/sqg_ellipticalvortex.mp4 b/v0.16.0/literated/sqg_ellipticalvortex.mp4 new file mode 100644 index 00000000..763e94d9 Binary files /dev/null and b/v0.16.0/literated/sqg_ellipticalvortex.mp4 differ diff --git a/v0.16.0/literated/surfaceqg_decaying-19.png b/v0.16.0/literated/surfaceqg_decaying-19.png new file mode 100644 index 00000000..e80ed661 Binary files /dev/null and b/v0.16.0/literated/surfaceqg_decaying-19.png differ diff --git a/v0.16.0/literated/surfaceqg_decaying-34.png b/v0.16.0/literated/surfaceqg_decaying-34.png new file mode 100644 index 00000000..d56bafd3 Binary files /dev/null and b/v0.16.0/literated/surfaceqg_decaying-34.png differ diff --git a/v0.16.0/literated/surfaceqg_decaying-39.png b/v0.16.0/literated/surfaceqg_decaying-39.png new file mode 100644 index 00000000..7c18f92f Binary files /dev/null and b/v0.16.0/literated/surfaceqg_decaying-39.png differ diff --git a/v0.16.0/literated/surfaceqg_decaying/index.html b/v0.16.0/literated/surfaceqg_decaying/index.html new file mode 100644 index 00000000..6dccc74e --- /dev/null +++ b/v0.16.0/literated/surfaceqg_decaying/index.html @@ -0,0 +1,133 @@ + +Decaying Surface QG turbulence · GeophysicalFlows.jl

    Decaying Surface QG turbulence

    A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 256                       # 2D resolution = n²
    +stepper = "FilteredETDRK4"          # timestepper
    +     dt = 0.03                      # timestep
    +     tf = 60                        # length of time for simulation
    + nsteps = Int(tf / dt)              # total number of time-steps
    + nsubs  = round(Int, nsteps/100)    # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

     L = 2π        # domain size
    + ν = 1e-19     # hyper-viscosity coefficient
    +nν = 4         # hyper-viscosity order

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    We initialize the buoyancy equation with an elliptical vortex.

    X, Y = gridpoints(grid)
    +b₀ = @. exp(-(X^2 + 4Y^2))
    +
    +SurfaceQG.set_b!(prob, b₀)

    Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (500, 500))
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "buoyancy bₛ",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +hm = heatmap!(ax, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +fig

    Diagnostics

    Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

    B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
    +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
    +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
    +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

    base_filename = string("SurfaceQG_decaying_n_", n)
    "SurfaceQG_decaying_n_256"

    We choose folder for outputing .jld2 files and snapshots (.png files).

    datapath = "./"
    +plotpath = "./"
    +
    +dataname = joinpath(datapath, base_filename)
    +plotname = joinpath(plotpath, base_filename)

    Do some basic file management,

    if !isdir(plotpath); mkdir(plotpath); end
    +if !isdir(datapath); mkdir(datapath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.

    b = Observable(Array(vars.b))
    +
    +ke = Observable([Point2f(KE.t[1], KE.data[1])])
    +b² = Observable([Point2f(B.t[1], B.data[1])])
    +
    +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t))
    +
    +fig = Figure(resolution = (900, 600))
    +
    +axb = Axis(fig[1:2, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_b,
    +           aspect = 1,
    +           limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 2];
    +           xlabel = "t",
    +           limits = ((0, tf), (0, 2e-2)))
    +
    +heatmap!(axb, x, y, b;
    +         colormap = :deep, colorrange = (0, 1))
    +
    +hE  = lines!(axE, ke; linewidth = 3)
    +hb² = lines!(axE, b²; linewidth = 3)
    +
    +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
    +
    +fig

    Time-stepping the Problem forward and create animation by updating the plot.

    startwalltime = time()
    +
    +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
    +  if j % (500 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, (time()-startwalltime)/60)
    +
    +    log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e",
    +              B.data[B.i], Dᵇ.data[Dᵇ.i])
    +
    +    println(log1)
    +
    +    println(log2)
    +  end
    +
    +  b[] = vars.b
    +
    +  ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))
    +  b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))
    +
    +  title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SurfaceQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
    +step: 0500, t: 15.0, cfl: 0.588, walltime: 0.06 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11
    +step: 1000, t: 30.0, cfl: 0.571, walltime: 0.10 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09
    +step: 1500, t: 45.0, cfl: 0.577, walltime: 0.15 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08
    +step: 2000, t: 60.0, cfl: 0.574, walltime: 0.20 min
    +buoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08
    +

    Let's see how all flow fields look like at the end of the simulation.

    fig = Figure(resolution = (800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +
    +hb = heatmap!(axb, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[2, 1], hb, vertical = false)
    +
    +hu = heatmap!(axu, x, y, Array(vars.u);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
    +
    +Colorbar(fig[2, 2], hu, vertical = false)
    +
    +hv = heatmap!(axv, x, y, Array(vars.v);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
    +
    +Colorbar(fig[2, 3], hv, vertical = false)
    +
    +fig

    Save

    We can save the output at the end of the simulation by calling

    saveoutput(out)

    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/twodnavierstokes_decaying-20.png b/v0.16.0/literated/twodnavierstokes_decaying-20.png new file mode 100644 index 00000000..69596f38 Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_decaying-20.png differ diff --git a/v0.16.0/literated/twodnavierstokes_decaying-33.png b/v0.16.0/literated/twodnavierstokes_decaying-33.png new file mode 100644 index 00000000..d7cf88ee Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_decaying-33.png differ diff --git a/v0.16.0/literated/twodnavierstokes_decaying-42.png b/v0.16.0/literated/twodnavierstokes_decaying-42.png new file mode 100644 index 00000000..714aa19a Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_decaying-42.png differ diff --git a/v0.16.0/literated/twodnavierstokes_decaying/index.html b/v0.16.0/literated/twodnavierstokes_decaying/index.html new file mode 100644 index 00000000..a30ce344 --- /dev/null +++ b/v0.16.0/literated/twodnavierstokes_decaying/index.html @@ -0,0 +1,97 @@ + +2D decaying turbulence · GeophysicalFlows.jl

    2D decaying turbulence

    A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using Random: seed!
    +using GeophysicalFlows: peakedisotropicspectrum

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length

    Then we pick the time-stepper parameters

        dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

    Next we define some shortcuts for convenience.

    sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    Our initial condition tries to reproduce the initial condition used by McWilliams (1984).

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
    +TwoDNavierStokes.set_ζ!(prob, ζ₀)

    Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "initial vorticity",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ');
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
    +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingTwoDNavierStokes"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    +saveproblem(out)

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t))
    +
    +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])
    +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "t",
    +           limits = ((-0.5, 40.5), (0, 1.05)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
    +
    +fig

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min",
    +        clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))
    +  enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))
    +
    +  title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min
    +step: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.08 min
    +step: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.12 min
    +step: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.16 min
    +step: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.19 min
    +

    Radial energy spectrum

    After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

    E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
    +Eh = rfft(E)                         # Fourier transform of energy density
    +
    +# compute radial specturm of `Eh`
    +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)

    and we plot it.

    lines(kr, vec(abs.(Ehr));
    +      linewidth = 2,
    +      axis = (xlabel = L"k_r",
    +              ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta",
    +              xscale = log10,
    +              yscale = log10,
    +              title = "Radial energy spectrum",
    +              limits = ((0.3, 1e2), (1e0, 1e5))))


    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing-23.png b/v0.16.0/literated/twodnavierstokes_stochasticforcing-23.png new file mode 100644 index 00000000..3f221142 Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_stochasticforcing-23.png differ diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing-32.png b/v0.16.0/literated/twodnavierstokes_stochasticforcing-32.png new file mode 100644 index 00000000..50d9fd83 Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_stochasticforcing-32.png differ diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing/index.html b/v0.16.0/literated/twodnavierstokes_stochasticforcing/index.html new file mode 100644 index 00000000..91d7ed48 --- /dev/null +++ b/v0.16.0/literated/twodnavierstokes_stochasticforcing/index.html @@ -0,0 +1,100 @@ + +2D forced-dissipative turbulence · GeophysicalFlows.jl

    2D forced-dissipative turbulence

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π             # grid resolution and domain length
    + ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0             # linear drag coefficient
    +    dt = 0.005               # timestep
    +nsteps = 4000                # total number of steps
    + nsubs = 20                  # number of steps between each plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x, y = grid.x, grid.y

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy budget.

    E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
    +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
    +
    +energy = Observable(Point2f[(μ * E.t[1], E.data[1])])
    +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "μ t",
    +           limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["energy E(t)", "enstrophy Z(t) / k_f²"])
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
    +  if j % (1000/nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))
    +
    +  title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
    +step: 1000, t: 5, cfl: 0.40, E: 0.2971, Z: 36.2188, walltime: 0.11 min
    +step: 2000, t: 10, cfl: 0.49, E: 0.4138, Z: 37.5536, walltime: 0.21 min
    +step: 3000, t: 15, cfl: 0.45, E: 0.4564, Z: 36.3428, walltime: 0.31 min
    +step: 4000, t: 20, cfl: 0.55, E: 0.4775, Z: 37.3600, walltime: 0.42 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-22.png b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-22.png new file mode 100644 index 00000000..3f221142 Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-22.png differ diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-33.png b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-33.png new file mode 100644 index 00000000..4fa4bdd0 Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-33.png differ diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-35.png b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-35.png new file mode 100644 index 00000000..d255dccc Binary files /dev/null and b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets-35.png differ diff --git a/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets/index.html new file mode 100644 index 00000000..4566039c --- /dev/null +++ b/v0.16.0/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -0,0 +1,161 @@ + +2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

    2D forced-dissipative turbulence budgets

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π              # grid resolution and domain length
    + ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0              # linear drag coefficient
    +dt, tf = 0.005, 0.2 / μ       # timestep and final time
    +    nt = round(Int, tf / dt)  # total timesteps
    +    ns = 4                    # how many intermediate times we want to plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.

    random_uniform = dev==CPU() ? rand : CUDA.rand
    +
    +function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  T = eltype(grid)
    +  @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)
    +
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

    E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
    +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
    +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
    +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy,                            prob, nsteps=nt) # enstrophy
    +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity,  prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work,                       prob, nsteps=nt) # enstrophy work input by forcing
    +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +for i = 1:ns
    +  stepforward!(prob, diags, round(Int, nt/ns))
    +
    +  TwoDNavierStokes.updatevars!(prob)
    +
    +  cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +  log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t,
    +        cfl, (time()-startwalltime)/60)
    +
    +  println(log)
    +end
    step: 0100, t: 0.5, cfl: 0.168, walltime: 0.01 min
    +step: 0200, t: 1.0, cfl: 0.238, walltime: 0.03 min
    +step: 0300, t: 1.5, cfl: 0.304, walltime: 0.04 min
    +step: 0400, t: 2.0, cfl: 0.301, walltime: 0.05 min
    +

    Plot

    Now let's see the final snapshot of the vorticity.

    fig = Figure(resolution = (400, 400))
    +
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ);
    +         colormap = :viridis, colorrange = (-25, 25))
    +
    +fig

    And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +TwoDNavierStokes.updatevars!(prob)
    +
    +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags
    +
    +clocktime = round(μ * clock.t, digits=2)
    +
    +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency
    +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency
    +
    +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]
    +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]
    +
    +residual_E = dEdt_computed - dEdt_numerical
    +residual_Z = dZdt_computed - dZdt_numerical
    +
    +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)
    +
    +t = E.t[2:E.i]
    +
    +fig = Figure(resolution = (800, 1100))
    +
    +axis_kwargs = (xlabel = "μ t", )
    +
    +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...)
    +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...)
    +ax3E = Axis(fig[5, 1]; axis_kwargs...)
    +
    +ax1Z = Axis(fig[1, 2]; axis_kwargs...)
    +ax2Z = Axis(fig[3, 2]; axis_kwargs...)
    +ax3Z = Axis(fig[5, 2]; axis_kwargs...)
    +
    +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i];   linestyle = :solid)
    +hε  = lines!(ax1E, t, ε .+ 0t;     linestyle = :dash)
    +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)
    +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 1],
    +       [hWᵋ, hε, hDᵋ, hRᵋ],
    +       ["energy work, Wᵋ", "ensemble mean energy work, <Wᵋ>", "dissipation, Dᵋ", "drag, Rᵋ = - 2μE"])
    +
    +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
    +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 1],
    +       [hc, hn],
    +       ["computed Wᵋ-Dᵋ", "numerical dE/dt"])
    +
    +hr = lines!(ax3E, t, residual_E)
    +
    +Legend(fig[6, 1],
    +       [hr],
    +       ["residual"])
    +
    +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i];  linestyle = :solid)
    +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t;    linestyle = :dash)
    +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)
    +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 2],
    +       [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
    +       ["enstrophy work, Wᶻ", "ensemble mean enstophy work, <Wᶻ>", "dissipation, Dᶻ", "drag, Rᶻ = - 2μZ"])
    +
    +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
    +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 2],
    +       [hcᶻ, hnᶻ],
    +       ["computed Wᶻ-Dᶻ", "numerical dZ/dt"])
    +
    +hrᶻ = lines!(ax3Z, t, residual_Z)
    +
    +Legend(fig[6, 2],
    +       [hr],
    +       ["residual"])
    +
    +fig


    This page was generated using Literate.jl.

    diff --git a/v0.16.0/literated/twodturb.mp4 b/v0.16.0/literated/twodturb.mp4 new file mode 100644 index 00000000..3f44e764 Binary files /dev/null and b/v0.16.0/literated/twodturb.mp4 differ diff --git a/v0.16.0/literated/twodturb_forced.mp4 b/v0.16.0/literated/twodturb_forced.mp4 new file mode 100644 index 00000000..f69fc5de Binary files /dev/null and b/v0.16.0/literated/twodturb_forced.mp4 differ diff --git a/v0.16.0/modules/barotropicqgql/index.html b/v0.16.0/modules/barotropicqgql/index.html new file mode 100644 index 00000000..7757bee6 --- /dev/null +++ b/v0.16.0/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

    BarotropicQGQL

    Basic Equations

    This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

    \[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

    where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).

    As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

    \[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

    The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

    \[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

    Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

    The linear operator is constructed in Equation

    GeophysicalFlows.BarotropicQGQL.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    Nonlinear term is computed via calcN! function.

    source

    and the nonlinear terms are computed via

    GeophysicalFlows.BarotropicQGQL.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    The kinetic energy of the fluid is obtained via:

    while the enstrophy via:

    Other diagnostic include: dissipation, drag, and work.

    Examples

    • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
    diff --git a/v0.16.0/modules/multilayerqg/index.html b/v0.16.0/modules/multilayerqg/index.html new file mode 100644 index 00000000..5ea3b9c3 --- /dev/null +++ b/v0.16.0/modules/multilayerqg/index.html @@ -0,0 +1,27 @@ + +MultiLayerQG · GeophysicalFlows.jl

    MultiLayerQG

    Basic Equations

    This module solves the layered Boussinesq quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

    The QGPV in each layer is

    \[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

    where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

    \[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

    with

    \[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = b_j - b_{j+1} ,\]

    where

    \[b_{j} = - g \frac{\delta \rho_j}{\rho_0}\]

    is the Boussinesq buoyancy in each layer, with $\rho = \rho_0 + \delta \rho$ the total density, $\rho_0$ a constant reference density, and $|\delta \rho| \ll \rho_0$ the perturbation density.

    In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

    \[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

    where

    \[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ + F_{3/2, 2} & -(F_{3/2, 2}+F_{5/2, 2}) & F_{5/2, 2} & & \vdots\\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

    Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

    \[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

    with

    \[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

    Implementation

    Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

    One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

    The equations of motion are time-stepped forward in Fourier space:

    \[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

    In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

    The linear operator is constructed in Equation

    GeophysicalFlows.MultiLayerQG.EquationFunction
    Equation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcN!.

    source
    GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
    hyperviscosity(params, grid)

    Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

    \[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

    source

    The nonlinear terms are computed via

    GeophysicalFlows.MultiLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Linearized MultiLayerQG dynamics

    The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

    Helper functions

    GeophysicalFlows.MultiLayerQG.set_ψ!Function
    set_ψ!(params, vars, grid, sol, ψ)
    +set_ψ!(prob, ψ)

    Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

    source

    Diagnostics

    The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

    GeophysicalFlows.MultiLayerQG.energiesFunction
    energies(vars, params, grid, sol)
    +energies(prob)

    Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

    The kinetic energy at the $j$-th fluid layer is

    \[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

    while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

    \[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

    source

    The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

    GeophysicalFlows.MultiLayerQG.fluxesFunction
    fluxes(vars, params, grid, sol)
    +fluxes(prob)

    Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

    The lateral eddy fluxes within the $j$-th fluid layer are

    \[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

    while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

    \[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

    source

    Examples

    diff --git a/v0.16.0/modules/singlelayerqg/index.html b/v0.16.0/modules/singlelayerqg/index.html new file mode 100644 index 00000000..e96c11dd --- /dev/null +++ b/v0.16.0/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

    SingleLayerQG

    Basic Equations

    This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

    \[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

    where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

    The dynamical variable is $q$. Thus, the equation solved by the module is:

    \[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

    The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SingleLayerQG.EquationFunction
    Equation(params::BarotropicQGParams, grid)

    Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    The nonlinear term is computed via calcN! function.

    source
    Equation(params::EquivalentBarotropicQGParams, grid)

    Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

    The nonlinear term is computed via calcN! function.

    source

    The nonlinear terms are computed via

    GeophysicalFlows.SingleLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    The kinetic energy of the fluid is computed via:

    GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    source

    while the potential energy, for an equivalent barotropic fluid, is computed via:

    GeophysicalFlows.SingleLayerQG.potential_energyFunction
    potential_energy(prob)

    Return the problem's (prob) domain-averaged potential energy of the fluid,

    \[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

    source

    The total energy is:

    GeophysicalFlows.SingleLayerQG.energyFunction
    energy(prob)

    Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

    source

    Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

    Examples

    diff --git a/v0.16.0/modules/surfaceqg/index.html b/v0.16.0/modules/surfaceqg/index.html new file mode 100644 index 00000000..48a9fa9e --- /dev/null +++ b/v0.16.0/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

    SurfaceQG

    Basic Equations

    This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

    \[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

    The SQG model evolves the surface buoyancy,

    \[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

    Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

    \[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

    with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

    These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

    \[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

    where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

    Implementation

    The buoyancy equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

    The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SurfaceQG.EquationFunction
    Equation(params, grid)

    Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

    \[L = - ν |𝐤|^{2 n_ν} .\]

    Plain old viscocity corresponds to $n_ν=1$.

    The nonlinear term is computed via function calcN!().

    source

    while the nonlinear terms via

    GeophysicalFlows.SurfaceQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    Some useful diagnostics are kinetic energy and buoyancy variance.

    GeophysicalFlows.SurfaceQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    In SQG, this is identical to half the domain-averaged surface buoyancy variance.

    source
    GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
    buoyancy_variance(prob)

    Return the buoyancy variance,

    \[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

    In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

    source

    Other diagnostic include: buoyancy_dissipation and buoyancy_work.

    Examples

    diff --git a/v0.16.0/modules/twodnavierstokes/index.html b/v0.16.0/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..3412e6b8 --- /dev/null +++ b/v0.16.0/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

    TwoDNavierStokes

    Basic Equations

    This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

    \[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

    where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.TwoDNavierStokes.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

    \[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

    Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

    The nonlinear term is computed via the function calcN!.

    source

    The nonlinear terms are computed via calcN!,

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    Some useful diagnostics are:

    GeophysicalFlows.TwoDNavierStokes.energyFunction
    energy(prob)

    Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

    where $ψ$ is the streamfunction.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
    enstrophy(prob)

    Return the problem's (prob) domain-averaged enstrophy,

    \[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

    Examples

    diff --git a/v0.16.0/references.bib b/v0.16.0/references.bib new file mode 100644 index 00000000..4007e7ac --- /dev/null +++ b/v0.16.0/references.bib @@ -0,0 +1,81 @@ +@article{Held-etal-1995, + title={Surface quasi-geostrophic dynamics}, + author={Held, Isaac M. and Pierrehumbert, Raymond T. and Garner, Stephen T. and Swanson, Kyle L.}, + journal={Journal of Fluid Mechanics}, + volume={282}, + pages={1--20}, + year={1995}, + doi={10.1017/S0022112095000012} +} + +@article{Capet-etal-2008, + title={Surface kinetic energy transfer in surface quasi-geostrophic flows}, + author={Capet, Xavier and Klein, Patrice and Hua, Bach Lien and Lapeyre, Guillaume and Mcwilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={604}, + pages={165--174}, + year={2008}, + doi={10.1017/S0022112008001110} +} + +@article{McWilliams-1984, + title={The emergence of isolated coherent vortices in turbulent flow}, + author={McWilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={146}, + pages={21--43}, + year={1984}, + doi={10.1017/S0022112084001750} +} + +@article{Farrell-Ioannou-2003, + title = {Structural stability of turbulent jets}, + author = {Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + pages = {2101--2118}, + volume = 60, + year = 2003, + doi = {10.1175/1520-0469(2003)060<2101:SSOTJ>2.0.CO;2}, +} + +@article{Constantinou-etal-2014, + title = {Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory}, + author = {Constantinou, Navid C. and Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {71}, + number = {5}, + pages = {1818--1842}, + year = {2014}, + doi = {10.1175/JAS-D-13-076.1}, +} + +@article{Srinivasan-Young-2012, + title = {Zonostrophic instability}, + author = {Srinivasan, Kaushik and Young, William R.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {69}, + number = {5}, + pages = {1633--1656}, + year = {2012}, + doi = {10.1175/JAS-D-11-0200.1}, +} + +@article{vanKampen-1981, + title={Itô versus Stratonovich}, + author={Van Kampen, Nicolaas G}, + journal={Journal of Statistical Physics}, + volume={24}, + pages={175--187}, + year={1981}, + doi={10.1007/BF01007642} +} + +@phdthesis{Constantinou-2015-phd, + title = {Formation of large-scale structures by turbulence in rotating planets}, + author = {Constantinou, N. C.}, + school = {National and Kapodistrian University of Athens}, + address = {Athens}, + url = {http://www.didaktorika.gr/eadd/handle/10442/35501?locale=en}, + year = {2015}, + note = {(also available at arXiv:1503.07644)} +} diff --git a/v0.16.0/references/index.html b/v0.16.0/references/index.html new file mode 100644 index 00000000..c1203792 --- /dev/null +++ b/v0.16.0/references/index.html @@ -0,0 +1,2 @@ + +References · GeophysicalFlows.jl

    References

    diff --git a/v0.16.0/search_index.js b/v0.16.0/search_index.js new file mode 100644 index 00000000..241ce544 --- /dev/null +++ b/v0.16.0/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min\nstep: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.08 min\nstep: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.12 min\nstep: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.16 min\nstep: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.19 min\n","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"Capet, X.; Klein, P.; Hua, B. L.; Lapeyre, G. and Mcwilliams, J. C. (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. Journal of Fluid Mechanics 604, 165–174.\n\n\n\nConstantinou, N. C. (2015). Formation of large-scale structures by turbulence in rotating planets. Ph.D. Thesis, National and Kapodistrian University of Athens (Athens) (also available at arXiv:1503.07644).\n\n\n\nConstantinou, N. C.; Farrell, B. F. and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. Journal of the Atmospheric Sciences 71, 1818–1842.\n\n\n\nFarrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. Journal of the Atmospheric Sciences 60, 2101–2118.\n\n\n\nHeld, I. M.; Pierrehumbert, R. T.; Garner, S. T. and Swanson, K. L. (1995). Surface quasi-geostrophic dynamics. Journal of Fluid Mechanics 282, 1–20.\n\n\n\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. Journal of Fluid Mechanics 146, 21–43.\n\n\n\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. Journal of the Atmospheric Sciences 69, 1633–1656.\n\n\n\nVan Kampen, N. G. (1981). Itô versus Stratonovich. Journal of Statistical Physics 24, 175–187.\n\n\n\n","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered Boussinesq quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = b_j - b_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"b_j = - g fracdelta rho_jrho_0","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"is the Boussinesq buoyancy in each layer, with rho = rho_0 + delta rho the total density, rho_0 a constant reference density, and delta rho ll rho_0 the perturbation density.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia> ]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Output\n ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}\n ├──── path: ./forcedbetaQLturb.jld2\n └── fields: Dict{Symbol, Function}(:sol => Main.var\"##313\".get_sol, :u => Main.var\"##313\".get_u)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.64, E: 0.0286, Q: 3.9616, walltime: 0.10 min\nstep: 2000, t: 100, cfl: 0.81, E: 0.0384, Q: 4.1193, walltime: 0.19 min\nstep: 3000, t: 150, cfl: 0.80, E: 0.0441, Q: 4.4990, walltime: 0.28 min\nstep: 4000, t: 200, cfl: 0.80, E: 0.0450, Q: 3.6810, walltime: 0.38 min\nstep: 5000, t: 250, cfl: 0.87, E: 0.0472, Q: 4.0671, walltime: 0.48 min\nstep: 6000, t: 300, cfl: 0.92, E: 0.0484, Q: 4.1866, walltime: 0.58 min\nstep: 7000, t: 350, cfl: 0.89, E: 0.0482, Q: 3.8817, walltime: 0.68 min\nstep: 8000, t: 400, cfl: 0.92, E: 0.0482, Q: 3.7857, walltime: 0.79 min\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that often this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\", \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min\nstep: 1000, t: 5, cfl: 0.40, E: 0.2971, Z: 36.2188, walltime: 0.11 min\nstep: 2000, t: 10, cfl: 0.49, E: 0.4138, Z: 37.5536, walltime: 0.21 min\nstep: 3000, t: 15, cfl: 0.45, E: 0.4564, Z: 36.3428, walltime: 0.31 min\nstep: 4000, t: 20, cfl: 0.55, E: 0.4775, Z: 37.3600, walltime: 0.42 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"../../../examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#multilayerqg_2layer_example","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀ = 1 # Coriolis parameter\nH = [0.2, 0.8] # the rest depths of each layer\nb = [-1.0, -1.2] # Boussinesq buoyancy of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, H, b, U, μ, β,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min\nstep: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.17 min\nstep: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.32 min\nstep: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.46 min\nstep: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.60 min\nstep: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.74 min\nstep: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.88 min\nstep: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.04 min\nstep: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.21 min\nstep: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.37 min\nstep: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.53 min\nstep: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.68 min\nstep: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.83 min\nstep: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 1.96 min\nstep: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.10 min\nstep: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.23 min\nstep: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.35 min\nstep: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.47 min\nstep: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.59 min\nstep: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.71 min\nstep: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.82 min\n","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"step: 0100, t: 0.5, cfl: 0.168, walltime: 0.01 min\nstep: 0200, t: 1.0, cfl: 0.238, walltime: 0.03 min\nstep: 0300, t: 1.5, cfl: 0.304, walltime: 0.04 min\nstep: 0400, t: 2.0, cfl: 0.301, walltime: 0.05 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\", \"ensemble mean energy work, \", \"dissipation, Dᵋ\", \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\", \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\", \"ensemble mean enstophy work, \", \"dissipation, Dᶻ\", \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\", \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"../../../examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nequivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nbarotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.07 min\nequivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.07 min\nbarotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.14 min\nequivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.14 min\nbarotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.21 min\nequivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.21 min\nbarotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.28 min\nequivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.28 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nb::Tuple: array with Boussinesq buoyancy of each fluid layer\nH::Tuple: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Tuple: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to eta in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nb::Tuple: array with Boussinesq buoyancy of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 12) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min\nstep: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.17 min\nstep: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.31 min\nstep: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.44 min\nstep: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.57 min\n","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.GeophysicalFlows","category":"page"},{"location":"lib/functions/#GeophysicalFlows.GeophysicalFlows","page":"Functions","title":"GeophysicalFlows.GeophysicalFlows","text":"Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.\n\n\n\n\n\n","category":"module"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work\nGeophysicalFlows.TwoDNavierStokes.palinstrophy","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.palinstrophy","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.palinstrophy","text":"palinstrophy(prob)\n\nReturn the problem's (prob) domain-averaged palinstrophy,\n\nint frac12 bf ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n b = -(1 .+ 1/nlayers * Array{Float64}(0:nlayers-1)),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nb: Boussinesq buoyancy of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. First we make sure that if dev=GPU(), then CUDA.rand() function is called for random numbers uniformly distributed between 0 and 1.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"random_uniform = dev==CPU() ? rand : CUDA.rand\n\nfunction calcF!(Fh, sol, t, clock, vars, params, grid)\n T = eltype(grid)\n @. Fh = sqrt(forcing_spectrum) * cis(2π * random_uniform(T)) / sqrt(clock.dt)\n\n return nothing\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 0500, t: 25, cfl: 0.49, E: 0.0181, Q: 2.6734, walltime: 0.03 min\nstep: 1000, t: 50, cfl: 0.75, E: 0.0294, Q: 2.9033, walltime: 0.04 min\nstep: 1500, t: 75, cfl: 0.72, E: 0.0366, Q: 2.8531, walltime: 0.06 min\nstep: 2000, t: 100, cfl: 0.76, E: 0.0405, Q: 2.8524, walltime: 0.08 min\nstep: 2500, t: 125, cfl: 0.90, E: 0.0432, Q: 2.7659, walltime: 0.10 min\nstep: 3000, t: 150, cfl: 0.74, E: 0.0461, Q: 2.8456, walltime: 0.12 min\nstep: 3500, t: 175, cfl: 0.84, E: 0.0458, Q: 2.5441, walltime: 0.14 min\nstep: 4000, t: 200, cfl: 0.83, E: 0.0463, Q: 2.6039, walltime: 0.16 min\nstep: 4500, t: 225, cfl: 0.78, E: 0.0468, Q: 2.7381, walltime: 0.17 min\nstep: 5000, t: 250, cfl: 0.95, E: 0.0475, Q: 2.7058, walltime: 0.19 min\nstep: 5500, t: 275, cfl: 0.72, E: 0.0481, Q: 2.8522, walltime: 0.21 min\nstep: 6000, t: 300, cfl: 0.83, E: 0.0481, Q: 2.8540, walltime: 0.23 min\nstep: 6500, t: 325, cfl: 0.87, E: 0.0479, Q: 2.8534, walltime: 0.25 min\nstep: 7000, t: 350, cfl: 0.81, E: 0.0474, Q: 2.7300, walltime: 0.27 min\nstep: 7500, t: 375, cfl: 0.96, E: 0.0469, Q: 2.6818, walltime: 0.29 min\nstep: 8000, t: 400, cfl: 0.74, E: 0.0466, Q: 2.6955, walltime: 0.31 min\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"n = Observable(1)\n\nqₙ = @lift irfft(qh[$n], nx)\nψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)\nq̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))\nūₙ = @lift vec(mean(u[$n], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$n])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, qₙ;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψₙ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψₙ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₙ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₙ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 16) do i\n n[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"../../../examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"\"SurfaceQG_decaying_n_256\"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16\nstep: 0500, t: 15.0, cfl: 0.588, walltime: 0.06 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11\nstep: 1000, t: 30.0, cfl: 0.571, walltime: 0.10 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09\nstep: 1500, t: 45.0, cfl: 0.577, walltime: 0.15 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08\nstep: 2000, t: 60.0, cfl: 0.574, walltime: 0.20 min\nbuoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08\n","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Drivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surveys in Mathematical Sciences, 10(1), 1–100, doi:10.4171/emss/66.\nParfenyev, V. (2023) Statistical analysis of vortex condensate motion in two-dimensional turbulence. arXiv preprint arXiv:2311.03065, doi:10.48550/arXiv.2311.03065.\nShokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.\nBischoff, T. and Deck, K. (2023) Unpaired downscaling of fluid flows with diffusion bridges. arXiv preprint arXiv:2305.01822, doi:10.48550/arXiv.2305.01822.\nSiegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.\nBisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nParfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.\nPalóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"../../../examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decay_topography_example","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.26 min\nstep: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.48 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/v0.16.0/siteinfo.js b/v0.16.0/siteinfo.js new file mode 100644 index 00000000..3b6f54a4 --- /dev/null +++ b/v0.16.0/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.16.0"; diff --git a/v0.16.0/stochastic_forcing/index.html b/v0.16.0/stochastic_forcing/index.html new file mode 100644 index 00000000..5b01b062 --- /dev/null +++ b/v0.16.0/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that often this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/v0.16.0/visualize/index.html b/v0.16.0/visualize/index.html new file mode 100644 index 00000000..bd23706d --- /dev/null +++ b/v0.16.0/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/v0.16.1/.documenter-siteinfo.json b/v0.16.1/.documenter-siteinfo.json new file mode 100644 index 00000000..669dac7c --- /dev/null +++ b/v0.16.1/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-11T12:18:41","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/v0.16.1/aliasing/index.html b/v0.16.1/aliasing/index.html new file mode 100644 index 00000000..58e63bf0 --- /dev/null +++ b/v0.16.1/aliasing/index.html @@ -0,0 +1,22 @@ + +Aliasing · GeophysicalFlows.jl

    Aliasing

    In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.

    De-aliasing scheme

    FourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction via

    julia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)
    +
    +julia> OneDimensionalGrid
    +         ├─────────── Device: CPU
    +         ├──────── FloatType: Float64
    +         ├────────── size Lx: 6.283185307179586
    +         ├──── resolution nx: 64
    +         ├── grid spacing dx: 0.09817477042468103
    +         ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]
    +         └─ aliased fraction: 0.5

    or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,

    julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)
    +Problem
    +  ├─────────── grid: grid (on CPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper
    +  
    +julia> prob.grid.aliased_fraction
    +0.5

    Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.

    All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.

    To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.

    diff --git a/v0.16.1/assets/README/index.html b/v0.16.1/assets/README/index.html new file mode 100644 index 00000000..b104f4f8 --- /dev/null +++ b/v0.16.1/assets/README/index.html @@ -0,0 +1,2 @@ + +- · GeophysicalFlows.jl diff --git a/v0.16.1/assets/documenter.js b/v0.16.1/assets/documenter.js new file mode 100644 index 00000000..c6562b55 --- /dev/null +++ b/v0.16.1/assets/documenter.js @@ -0,0 +1,1050 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function (event) { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + let animationSpeed = event.noToggleAnimation ? 0 : 400; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(animationSpeed); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(animationSpeed); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let meta = $("div[data-docstringscollapsed]").data(); + + if (meta?.docstringscollapsed) { + $("#documenter-article-toggle-button").trigger({ + type: "click", + noToggleAnimation: true, + }); + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +/* +To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +PSEUDOCODE: + +Searching happens automatically as the user types or adjusts the selected filters. +To preserve responsiveness, as much as possible of the slow parts of the search are done +in a web worker. Searching and result generation are done in the worker, and filtering and +DOM updates are done in the main thread. The filters are in the main thread as they should +be very quick to apply. This lets filters be changed without re-searching with minisearch +(which is possible even if filtering is on the worker thread) and also lets filters be +changed _while_ the worker is searching and without message passing (neither of which are +possible if filtering is on the worker thread) + +SEARCH WORKER: + +Import minisearch + +Build index + +On message from main thread + run search + find the first 200 unique results from each category, and compute their divs for display + note that this is necessary and sufficient information for the main thread to find the + first 200 unique results from any given filter set + post results to main thread + +MAIN: + +Launch worker + +Declare nonconstant globals (worker_is_running, last_search_text, unfiltered_results) + +On text update + if worker is not running, launch_search() + +launch_search + set worker_is_running to true, set last_search_text to the search text + post the search query to worker + +on message from worker + if last_search_text is not the same as the text in the search field, + the latest search result is not reflective of the latest search query, so update again + launch_search() + otherwise + set worker_is_running to false + + regardless, display the new search results to the user + save the unfiltered_results as a global + update_search() + +on filter click + adjust the filter selection + update_search() + +update_search + apply search filters by looping through the unfiltered_results and finding the first 200 + unique results that match the filters + + Update the DOM +*/ + +/////// SEARCH WORKER /////// + +function worker_function(documenterSearchIndex, documenterBaseURL, filters) { + importScripts( + "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" + ); + + let data = documenterSearchIndex.map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; + }); + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", + ]); + + let index = new MiniSearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + + word = word.toLowerCase(); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not + // find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + prefix: true, + boost: { title: 100 }, + fuzzy: 2, + }, + }); + + index.addAll(data); + + /** + * Used to map characters to HTML entities. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }; + + /** + * Used to match HTML entities and HTML characters. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** + * Escape function from lodash + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + function escape(string) { + return string && reHasUnescapedHtml.test(string) + ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) + : string || ""; + } + + /** + * Make the result component given a minisearch result data object and the value + * of the search input as queryString. To view the result object structure, refer: + * https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ + function make_search_result(result, querystring) { + let search_divider = `
    `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`${querystring}`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + text = text.length ? escape(text) : ""; + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`${escape(querystring)}`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
    +
    ${escape(result.title)}
    +
    ${result.category}
    +
    +

    + ${display_result} +

    +
    + ${display_link} +
    +
    + ${search_divider} + `; + + return result_div; + } + + self.onmessage = function (e) { + let query = e.data; + let results = index.search(query, { + filter: (result) => { + // Only return relevant results + return result.score >= 1; + }, + }); + + // Pre-filter to deduplicate and limit to 200 per category to the extent + // possible without knowing what the filters are. + let filtered_results = []; + let counts = {}; + for (let filter of filters) { + counts[filter] = 0; + } + let present = {}; + + for (let result of results) { + cat = result.category; + cnt = counts[cat]; + if (cnt < 200) { + id = cat + "---" + result.location; + if (present[id]) { + continue; + } + present[id] = true; + filtered_results.push({ + location: result.location, + category: cat, + div: make_search_result(result, query), + }); + } + } + + postMessage(filtered_results); + }; +} + +// `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! +const filters = [ + ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), +]; +const worker_str = + "(" + + worker_function.toString() + + ")(" + + JSON.stringify(documenterSearchIndex["docs"]) + + "," + + JSON.stringify(documenterBaseURL) + + "," + + JSON.stringify(filters) + + ")"; +const worker_blob = new Blob([worker_str], { type: "text/javascript" }); +const worker = new Worker(URL.createObjectURL(worker_blob)); + +/////// SEARCH MAIN /////// + +// Whether the worker is currently handling a search. This is a boolean +// as the worker only ever handles 1 or 0 searches at a time. +var worker_is_running = false; + +// The last search text that was sent to the worker. This is used to determine +// if the worker should be launched again when it reports back results. +var last_search_text = ""; + +// The results of the last search. This, in combination with the state of the filters +// in the DOM, is used compute the results to display on calls to update_search. +var unfiltered_results = []; + +// Which filter is currently selected +var selected_filter = ""; + +$(document).on("input", ".documenter-search-input", function (event) { + if (!worker_is_running) { + launch_search(); + } +}); + +function launch_search() { + worker_is_running = true; + last_search_text = $(".documenter-search-input").val(); + worker.postMessage(last_search_text); +} + +worker.onmessage = function (e) { + if (last_search_text !== $(".documenter-search-input").val()) { + launch_search(); + } else { + worker_is_running = false; + } + + unfiltered_results = e.data; + update_search(); +}; + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + selected_filter = ""; + } else { + selected_filter = $(this).text().toLowerCase(); + } + + // This updates search results and toggles classes for UI: + update_search(); +}); + +/** + * Make/Update the search component + */ +function update_search() { + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + if (selected_filter == "") { + results = unfiltered_results; + } else { + results = unfiltered_results.filter((result) => { + return selected_filter == result.category.toLowerCase(); + }); + } + + let search_result_container = ``; + let modal_filters = make_modal_body_filters(); + let search_divider = `
    `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + for (var i = 0, n = results.length; i < n && count < 200; ++i) { + let result = results[i]; + if (result.location && !links.includes(result.location)) { + search_results += result.div; + count++; + links.push(result.location); + } + } + + if (count == 1) { + count_str = "1 result"; + } else if (count == 200) { + count_str = "200+ results"; + } else { + count_str = count + " results"; + } + let result_count = `
    ${count_str}
    `; + + search_result_container = ` +
    + ${modal_filters} + ${search_divider} + ${result_count} +
    + ${search_results} +
    +
    + `; + } else { + search_result_container = ` +
    + ${modal_filters} + ${search_divider} +
    0 result(s)
    +
    +
    No result found!
    + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(` +
    Type something to get started!
    + `); + } +} + +/** + * Make the modal filter html + * + * @returns string + */ +function make_modal_body_filters() { + let str = filters + .map((val) => { + if (selected_filter == val.toLowerCase()) { + return `${val}`; + } else { + return `${val}`; + } + }) + .join(""); + + return ` +
    + Filters: + ${str} +
    `; +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let search_modal_header = ` + + `; + + let initial_search_body = ` +
    Type something to get started!
    + `; + + let search_modal_footer = ` +
    + + Ctrl + + / to search + + esc to close +
    + `; + + $(document.body).append( + ` + + ` + ); + + document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); + }); + + document + .querySelector(".close-search-modal") + .addEventListener("click", () => { + closeModal(); + }); + + $(document).on("click", ".search-result-link", function () { + closeModal(); + }); + + document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; + }); + + // Functions to open and close a modal + function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); + } + + function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
    Type something to get started!
    + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); + } + + document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v0.16.1/assets/energy_budgets_Ito.svg b/v0.16.1/assets/energy_budgets_Ito.svg new file mode 100644 index 00000000..fd5b62fd --- /dev/null +++ b/v0.16.1/assets/energy_budgets_Ito.svg @@ -0,0 +1,1208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.16.1/assets/energy_budgets_Stratonovich.svg b/v0.16.1/assets/energy_budgets_Stratonovich.svg new file mode 100644 index 00000000..f7da023c --- /dev/null +++ b/v0.16.1/assets/energy_budgets_Stratonovich.svg @@ -0,0 +1,1259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.16.1/assets/energy_comparison.svg b/v0.16.1/assets/energy_comparison.svg new file mode 100644 index 00000000..4ab4ca22 --- /dev/null +++ b/v0.16.1/assets/energy_comparison.svg @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v0.16.1/assets/themes/documenter-dark.css b/v0.16.1/assets/themes/documenter-dark.css new file mode 100644 index 00000000..53889fb9 --- /dev/null +++ b/v0.16.1/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v0.16.1/assets/themes/documenter-light.css b/v0.16.1/assets/themes/documenter-light.css new file mode 100644 index 00000000..2f168c77 --- /dev/null +++ b/v0.16.1/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v0.16.1/assets/themeswap.js b/v0.16.1/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v0.16.1/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v0.16.1/assets/warner.js b/v0.16.1/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v0.16.1/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v0.16.1/contributing/index.html b/v0.16.1/contributing/index.html new file mode 100644 index 00000000..f5432cd7 --- /dev/null +++ b/v0.16.1/contributing/index.html @@ -0,0 +1,3 @@ + +Contributor's guide · GeophysicalFlows.jl

    Contributors' Guide

    This is a short guide for potential GeophysicalFlows.jl contributors.

    Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.

    We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.

    What can I do?

    • Tackle an existing issue.

    • Try to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!

    • Write up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.

    • Improve documentation, docstrings, or comments if you found something is hard to use.

    • Implement a new feature (e.g., a new diagnostic into a module).

    • Implement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.

    If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.

    Ground Rules

    • Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.
    • Do not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).
    • Be willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.
    • Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.

    Reporting a bug

    The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.

    • Head over to the issues page.
    • Search to see if your issue already exists or has even been solved previously.
    • If you indeed have a new issue or request, click the "New Issue" button.
    • Please be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.

    Setting up your development environment

    • Install Julia on your system.
    • Install git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).
    • Login to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the "Fork" button.
    • Clone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.
      git clone https://github.com/your-user-name/GeophysicalFlows.jl.git
    • Navigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.
    • Connect your repository to the upstream (main project).
      git remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git
    • Create the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.
    • You can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.

    Your development environment is now ready!

    Pull Requests

    Changes and contributions should be made via GitHub pull requests against the main branch.

    When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.

    When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.

    Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source".

    Documentation

    All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.

    We encourage using unicode characters when writing docstrings, e.g., use α instead of \alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.

    You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call

    julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    +julia --project=docs/ docs/make.jl

    and then open docs/build/index.html in your favorite browser.

    Credits

    This contributor's guide is heavily based on the MetPy contributor's guide and on its "cover" made by Oceananigans.jl.

    diff --git a/v0.16.1/gpu/index.html b/v0.16.1/gpu/index.html new file mode 100644 index 00000000..c75d2cab --- /dev/null +++ b/v0.16.1/gpu/index.html @@ -0,0 +1,10 @@ + +GPU · GeophysicalFlows.jl

    GPU

    GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .

    All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,

    julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())
    +Problem
    +  ├─────────── grid: grid (on GPU)
    +  ├───── parameters: params
    +  ├────── variables: vars
    +  ├─── state vector: sol
    +  ├─────── equation: eqn
    +  ├────────── clock: clock
    +  └──── timestepper: RK4TimeStepper

    Selecting GPU device

    FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.

    diff --git a/v0.16.1/index.html b/v0.16.1/index.html new file mode 100644 index 00000000..f228dc0b --- /dev/null +++ b/v0.16.1/index.html @@ -0,0 +1,13 @@ + +Home · GeophysicalFlows.jl

    GeophysicalFlows.jl Documentation

    Overview

    GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.

    Examples

    Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!

    Fourier transforms normalization

    Fourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., $\hat{u}$, to be the Fourier transform of $u$ like, e.g.,

    \[u(x) = \sum_{k_x} \hat{u}(k_x) \, e^{i k_x x} .\]

    The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply "hat"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as $\hat{u}$ above. Instead,

    \[\hat{u}(k_x) = \frac{𝚞𝚑}{n_x e^{i k_x x_0}} ,\]

    where $n_x$ is the total number of grid points in $x$ and $x_0$ is the left-most point of our $x$-grid.

    Read more in the FourierFlows.jl Documentation; see Grids section.

    Unicode

    Oftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \psi or \partial followed by the tab key.

    Read more about Unicode symbols in the Julia Documentation.

    Developers

    The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.

    Citing

    If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:

    Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.

    The bibtex entry for the paper is:

    @article{GeophysicalFlowsJOSS,
    +  doi = {10.21105/joss.03053},
    +  url = {https://doi.org/10.21105/joss.03053},
    +  year = {2021},
    +  publisher = {The Open Journal},
    +  volume = {6},
    +  number = {60},
    +  pages = {3053},
    +  author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},
    +  title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \& GPUs},
    +  journal = {Journal of Open Source Software}
    +}

    Papers using GeophysicalFlows.jl

    1. Parfenyev, V. (2024) Statistical analysis of vortex condensate motion in two-dimensional turbulence. Physics of Fluids, 36, 015148, doi:10.1063/5.0187030.

    2. LaCasce, J. H., Palóczy, A., and Trodahl, M. (2024). Vortices over bathymetry. Journal of Fluid Mechanics, 979, A32, doi:10.1017/jfm.2023.1084.

    3. Drivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surveys in Mathematical Sciences, 10(1), 1–100, doi:10.4171/emss/66.

    4. Shokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.

    5. Bischoff, T. and Deck, K. (2023) Unpaired downscaling of fluid flows with diffusion bridges. arXiv preprint arXiv:2305.01822, doi:10.48550/arXiv.2305.01822.

    6. Siegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.

    7. Bisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.

    8. Parfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.

    9. Siegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.

    10. Dolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.

    11. Palóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.

    12. Karrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.

    diff --git a/v0.16.1/installation_instructions/index.html b/v0.16.1/installation_instructions/index.html new file mode 100644 index 00000000..519be99b --- /dev/null +++ b/v0.16.1/installation_instructions/index.html @@ -0,0 +1,4 @@ + +Installation instructions · GeophysicalFlows.jl

    Installation instructions

    You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies

    julia> ]
    +(v1.6) pkg> add GeophysicalFlows
    +(v1.6) pkg> instantiate

    We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing

    (v1.6) pkg> update GeophysicalFlows

    Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.

    Use Julia 1.6 or newer

    The latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).

    Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1

    diff --git a/v0.16.1/lib/functions/index.html b/v0.16.1/lib/functions/index.html new file mode 100644 index 00000000..9e5b1706 --- /dev/null +++ b/v0.16.1/lib/functions/index.html @@ -0,0 +1,88 @@ + +Functions · GeophysicalFlows.jl

    Functions

    GeophysicalFlows

    GeophysicalFlows.GeophysicalFlowsModule

    Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.

    source

    Exported functions

    GeophysicalFlows.lambdipoleFunction
    lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))

    Return the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.

    source
    GeophysicalFlows.peakedisotropicspectrumFunction
    peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)

    Generate a random two-dimensional relative vorticity field $q(x, y)$ with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.

    source

    TwoDNavierStokes

    Exported functions

    GeophysicalFlows.TwoDNavierStokes.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                  μ = 0,
    +                 nμ = 0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a two-dimensional Navier-Stokes problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Large-scale (hypo)-viscosity coefficient.
    • : (Hypo)-viscosity order, $≤ 0$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.TwoDNavierStokes.energy_workFunction
    energy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of energy by the forcing $F$,

    \[- \int ψ F \frac{𝖽x 𝖽y}{L_x L_y} = - \sum_{𝐤} ψ̂ F̂^* .\]

    where $ψ$ is the stream flow.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_workFunction
    enstrophy_work(prob)

    Return the problem's (prob) domain-averaged rate of work of enstrophy by the forcing $F$,

    \[\int ζ F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} ζ̂ F̂^* ,\]

    where $ζ$ is the relative vorticity.

    source
    GeophysicalFlows.TwoDNavierStokes.palinstrophyFunction
    palinstrophy(prob)

    Return the problem's (prob) domain-averaged palinstrophy,

    \[\int \frac1{2} |{\bf ∇} ζ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Private functions

    GeophysicalFlows.TwoDNavierStokes.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, ζ)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)ζ] - ∂_y[(∂_x ψ)ζ]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, ζ)} = - i k_x \widehat{u ζ} - i k_y \widehat{v ζ} .\]

    source
    GeophysicalFlows.TwoDNavierStokes.energy_dissipationFunction
    energy_dissipation(prob, ξ, νξ)

    Return the domain-averaged energy dissipation rate done by the viscous term,

    \[- ξ (-1)^{n_ξ+1} \int ψ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2(n_ξ-1)} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipationFunction
    enstrophy_dissipation(prob, ξ, νξ)

    Return the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,

    \[ξ (-1)^{n_ξ+1} \int ζ ∇^{2n_ξ} ζ \frac{𝖽x 𝖽y}{L_x L_y} = - ξ \sum_{𝐤} |𝐤|^{2n_ξ} |ζ̂|² ,\]

    where $ξ$ and $nξ$ could be either the (hyper)-viscosity coefficient $ν$ and its order $n_ν$, or the hypo-viscocity coefficient $μ$ and its order $n_μ$.

    source

    SingleLayerQG

    Exported functions

    GeophysicalFlows.SingleLayerQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    + deformation_radius = Inf,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a single-layer quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • deformation_radius: Rossby radius of deformation; set Inf for purely barotropic.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    GeophysicalFlows.SingleLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, q+η)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)(q+η)] - ∂_y[(∂_x ψ)(q+η)]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, q + η)} = - i k_x \widehat{u (q + η)} - i k_y \widehat{v (q + η)} .\]

    source

    MultiLayerQG

    Exported functions

    GeophysicalFlows.MultiLayerQG.ProblemFunction
    Problem(nlayers :: Int,
    +                    dev = CPU();
    +                     nx = 128,
    +                     ny = nx,
    +                     Lx = 2π,
    +                     Ly = Lx,
    +                     f₀ = 1.0,
    +                      β = 0.0,
    +                      U = zeros(nlayers),
    +                      H = 1/nlayers * ones(nlayers),
    +                      b = -(1 .+ 1/nlayers * Array{Float64}(0:nlayers-1)),
    +                    eta = nothing,
    +topographic_pv_gradient = (0, 0),
    +                      μ = 0,
    +                      ν = 0,
    +                     nν = 1,
    +                     dt = 0.01,
    +                stepper = "RK4",
    +                 calcFq = nothingfunction,
    +             stochastic = false,
    +                 linear = false,
    +       aliased_fraction = 1/3,
    +                      T = Float64)

    Construct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.

    Arguments

    • nlayers: (required) Number of fluid layers.
    • dev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • f₀: Constant planetary vorticity.
    • β: Planetary vorticity $y$-gradient.
    • U: The imposed constant zonal flow $U(y)$ in each fluid layer.
    • H: Rest height of each fluid layer.
    • b: Boussinesq buoyancy of each fluid layer.
    • eta: Periodic component of the topographic potential vorticity.
    • topographic_pv_gradient: The $(x, y)$ components of the topographic PV large-scale gradient.
    • μ: Linear bottom drag coefficient.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.
    • linear: true or false (default); boolean denoting whether the linearized equations of motions are used.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64 (default); floating point type used for problem data.
    source
    GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!Function
    streamfunctionfrompv!(ψh, qh, params, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.

    source
    streamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $ψ̂ = - k⁻² q̂$.

    source
    streamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)

    Invert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[ψ̂₁ = - [k² q̂₁ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    \[ψ̂₂ = - [k² q̂₂ + (f₀² / g′) (q̂₁ / H₂ + q̂₂ / H₁)] / Δ ,\]

    where $Δ = k² [k² + f₀² (H₁ + H₂) / (g′ H₁ H₂)]$.

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source
    GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!Function
    pvfromstreamfunction!(qh, ψh, params, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.

    source
    pvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, $q̂ = - k² ψ̂$.

    source
    pvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)

    Obtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,

    \[q̂₁ = - k² ψ̂₁ + f₀² / (g′ H₁) (ψ̂₂ - ψ̂₁) ,\]

    \[q̂₂ = - k² ψ̂₂ + f₀² / (g′ H₂) (ψ̂₁ - ψ̂₂) .\]

    (Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)

    source

    Private functions

    GeophysicalFlows.MultiLayerQG.LinearEquationFunction
    LinearEquation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcNlinear!.

    source
    GeophysicalFlows.MultiLayerQG.calcS!Function
    calcS!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊$, which consists of nlayer x nlayer static arrays $𝕊_𝐤$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $q̂_𝐤 = 𝕊_𝐤 ψ̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcS⁻¹!Function
    calcS⁻¹!(S, Fp, Fm, nlayers, grid)

    Construct the array $𝕊⁻¹$, which consists of nlayer x nlayer static arrays $(𝕊_𝐤)⁻¹$ that relate the $q̂_j$'s and $ψ̂_j$'s for every wavenumber: $ψ̂_𝐤 = (𝕊_𝐤)⁻¹ q̂_𝐤$.

    source
    GeophysicalFlows.MultiLayerQG.calcNlinear!Function
    calcNlinear!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term of the linearized equations:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + \widehat{(∂_y ψ_j)(∂_x Q_j)} +- \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_advection!Function
    calcN_advection!(N, sol, vars, params, grid)

    Compute the advection term and stores it in N:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source
    GeophysicalFlows.MultiLayerQG.calcN_linearadvection!Function
    calcN_linearadvection!(N, sol, vars, params, grid)

    Compute the advection term of the linearized equations and stores it in N:

    \[N_j = - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} .\]

    source

    SurfaceQG

    Exported functions

    GeophysicalFlows.SurfaceQG.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 Lx = 2π,
    +                 ny = nx,
    +                 Ly = Lx,
    +                  ν = 0,
    +                 nν = 1,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a surface quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source
    GeophysicalFlows.SurfaceQG.buoyancy_dissipationFunction
    buoyancy_dissipation(prob)

    Return the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,

    \[2 ν (-1)^{n_ν} \int b ∇^{2n_ν} b \frac{𝖽x 𝖽y}{L_x L_y} = - 2 ν \sum_{𝐤} |𝐤|^{2n_ν} |b̂|² ,\]

    where $ν$ the (hyper)-viscosity coefficient $ν$ and $nν$ the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation

    source
    GeophysicalFlows.SurfaceQG.buoyancy_workFunction
    buoyancy_work(prob)
    +buoyancy_work(sol, vars, grid)

    Return the domain-averaged rate of work of buoyancy variance by the forcing,

    \[\int 2 b F \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} 2 b̂ F̂^* .\]

    source

    Private functions

    GeophysicalFlows.SurfaceQG.calcN_advection!Function
    calcN_advection!(N, sol, t, clock, vars, params, grid)

    Calculate the Fourier transform of the advection term, $- 𝖩(ψ, b)$ in conservative form, i.e., $- ∂_x[(∂_y ψ)b] - ∂_y[(∂_x ψ)b]$ and store it in N:

    \[N = - \widehat{𝖩(ψ, b)} = - i k_x \widehat{u b} - i k_y \widehat{v b} .\]

    source

    BarotropicQGQL

    Exported functions

    GeophysicalFlows.BarotropicQGQL.ProblemFunction
    Problem(dev::Device = CPU();
    +                 nx = 256,
    +                 ny = nx,
    +                 Lx = 2π,
    +                 Ly = Lx,
    +                  β = 0.0,
    +                eta = nothing,
    +                  ν = 0.0,
    +                 nν = 1,
    +                  μ = 0.0,
    +                 dt = 0.01,
    +            stepper = "RK4",
    +              calcF = nothingfunction,
    +         stochastic = false,
    +   aliased_fraction = 1/3,
    +                  T = Float64)

    Construct a quasi-linear barotropic quasi-geostrophic problem on device dev.

    Arguments

    • dev: (required) CPU() or GPU(); computer architecture used to time-step problem.

    Keyword arguments

    • nx: Number of grid points in $x$-domain.
    • ny: Number of grid points in $y$-domain.
    • Lx: Extent of the $x$-domain.
    • Ly: Extent of the $y$-domain.
    • β: Planetary vorticity $y$-gradient.
    • eta: Topographic potential vorticity.
    • ν: Small-scale (hyper)-viscosity coefficient.
    • : (Hyper)-viscosity order, $≥ 1$.
    • μ: Linear drag coefficient.
    • dt: Time-step.
    • stepper: Time-stepping method.
    • calcF: Function that calculates the Fourier transform of the forcing, $F̂$.
    • stochastic: true or false; boolean denoting whether calcF is temporally stochastic.
    • aliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().
    • T: Float32 or Float64; floating point type used for problem data.
    source

    Private functions

    diff --git a/v0.16.1/lib/types/index.html b/v0.16.1/lib/types/index.html new file mode 100644 index 00000000..4a96d5b8 --- /dev/null +++ b/v0.16.1/lib/types/index.html @@ -0,0 +1,2 @@ + +Private types · GeophysicalFlows.jl

    Private types

    TwoDNavierStokes

    GeophysicalFlows.TwoDNavierStokes.ParamsType
    struct Params{T} <: AbstractParams

    The parameters for a two-dimensional Navier-Stokes problem:

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • μ::Any: large-scale (hypo)-viscosity coefficient

    • nμ::Int64: (hypo)-viscosity order, $≤ 0$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.TwoDNavierStokes.VarsType
    struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars

    The variables for two-dimensional Navier-Stokes problem:

    • ζ: relative vorticity

    • u: x-component of velocity

    • v: y-component of velocity

    • ζh: Fourier transform of relative vorticity

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SingleLayerQG

    GeophysicalFlows.SingleLayerQG.ParamsType
    struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams

    The parameters for the SingleLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • deformation_radius::Any: Rossby radius of deformation

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SingleLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars

    The variables for SingleLayer QG:

    • q: relative vorticity (+ vortex stretching)

    • ψ: streamfunction

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • qh: Fourier transform of relative vorticity (+ vortex stretching)

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    MultiLayerQG

    GeophysicalFlows.MultiLayerQG.ParamsType
    struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams

    The parameters for the MultiLayerQG problem.

    • nlayers::Int64: number of fluid layers

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • b::Tuple: array with Boussinesq buoyancy of each fluid layer

    • H::Tuple: array with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Tuple: array with the reduced gravity constants for each fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to eta in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • S::Any: array containing coeffients for getting PV from streamfunction

    • S⁻¹::Any: array containing coeffients for inverting PV to streamfunction

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.SingleLayerParamsType
    struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a single-layer MultiLayerQG problem.

    • β::Any: planetary vorticity $y$-gradient

    • U::Any: array with imposed constant zonal flow $U(y)$

    • eta::Any: array containing the periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.TwoLayerParamsType
    struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams

    The parameters for the a two-layer MultiLayerQG problem.

    • f₀::Any: constant planetary vorticity

    • β::Any: planetary vorticity $y$-gradient

    • b::Tuple: array with Boussinesq buoyancy of each fluid layer

    • H::Tuple: tuple with rest height of each fluid layer

    • U::Any: array with imposed constant zonal flow $U(y)$ in each fluid layer

    • eta::Any: array containing periodic component of the topographic PV

    • topographic_pv_gradient::Tuple{T, T} where T: tuple containing the $(x, y)$ components of topographic PV large-scale gradient

    • μ::Any: linear bottom drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcFq!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    • g′::Any: the reduced gravity constants for the fluid interface

    • Qx::Any: array containing $x$-gradient of PV due to topographic PV in each fluid layer

    • Qy::Any: array containing $y$-gradient of PV due to $β$, $U$, and topographic PV in each fluid layer

    • rfftplan::Any: rfft plan for FFTs

    source
    GeophysicalFlows.MultiLayerQG.VarsType
    struct Vars{Aphys, Atrans, F, P} <: AbstractVars

    The variables for multi-layer QG problem.

    • q: relative vorticity + vortex stretching

    • ψ: streamfunction

    • u: x-component of velocity

    • v: y-component of velocity

    • qh: Fourier transform of relative vorticity + vortex stretching

    • ψh: Fourier transform of streamfunction

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fqh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    SurfaceQG

    GeophysicalFlows.SurfaceQG.ParamsType
    Params{T}(ν, nν, calcF!)

    A struct containing the parameters for Surface QG dynamics. Included are:

    • ν::Any: buoyancy (hyper)-viscosity coefficient

    • nν::Int64: buoyancy (hyper)-viscosity order

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.SurfaceQG.VarsType
    Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)

    The variables for surface QG problem:

    • b: buoyancy

    • u: $x$-component of velocity

    • v: $y$-component of velocity

    • bh: Fourier transform of buoyancy

    • uh: Fourier transform of $x$-component of velocity

    • vh: Fourier transform of $y$-component of velocity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source

    BarotropicQGQL

    GeophysicalFlows.BarotropicQGQL.ParamsType
    Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)

    A struct containing the parameters for a barotropic QL QG problem. Included are:

    • β::Any: planetary vorticity $y$-gradient

    • eta::Any: topographic potential vorticity

    • etah::Any: Fourier transform of topographic potential vorticity

    • μ::Any: linear drag coefficient

    • ν::Any: small-scale (hyper)-viscosity coefficient

    • nν::Int64: (hyper)-viscosity order, $≥ 1$

    • calcF!::Function: function that calculates the Fourier transform of the forcing, $F̂$

    source
    GeophysicalFlows.BarotropicQGQL.VarsType
    Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)

    The variables for barotropic QL QG:

    • u: $x$-component of small-scale velocity

    • v: $y$-component of small-scale velocity

    • U: $x$-component of large-scale velocity

    • uzeta: small-scale $u′ζ′$

    • vzeta: small-scale $v′ζ′$

    • zeta: small-scale relative vorticity

    • Zeta: large-scale relative vorticity

    • psi: small-scale streamfunction

    • Psi: large-scale streamfunction

    • Nz: small-scale nonlinear term

    • NZ: large-scale nonlinear term

    • uh: Fourier transform of $x$-component of small-scale velocity

    • vh: Fourier transform of $y$-component of small-scale velocity

    • Uh: Fourier transform of $x$-component of large-scale velocity

    • zetah: Fourier transform of small-scale relative vorticity

    • Zetah: Fourier transform of large-scale relative vorticity

    • psih: Fourier transform of small-scale relative vorticity

    • Psih: Fourier transform of large-scale relative vorticity

    • Fh: Fourier transform of forcing

    • prevsol: sol at previous time-step

    source
    diff --git a/v0.16.1/literated/barotropicqgql_betaforced-24.png b/v0.16.1/literated/barotropicqgql_betaforced-24.png new file mode 100644 index 00000000..46f9c19c Binary files /dev/null and b/v0.16.1/literated/barotropicqgql_betaforced-24.png differ diff --git a/v0.16.1/literated/barotropicqgql_betaforced.mp4 b/v0.16.1/literated/barotropicqgql_betaforced.mp4 new file mode 100644 index 00000000..11437bfd Binary files /dev/null and b/v0.16.1/literated/barotropicqgql_betaforced.mp4 differ diff --git a/v0.16.1/literated/barotropicqgql_betaforced/index.html b/v0.16.1/literated/barotropicqgql_betaforced/index.html new file mode 100644 index 00000000..656a243f --- /dev/null +++ b/v0.16.1/literated/barotropicqgql_betaforced/index.html @@ -0,0 +1,169 @@ + +Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +using Statistics: mean
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n^2
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

    function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  randn!(Fh)
    +  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                              calcF=calcF!, stochastic=true, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x, grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics – energy and enstrophy are functions imported at the top.

    E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)
    +Z = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)

    We can also define our custom diagnostics via functions.

    zetaMean(prob) = prob.sol[1, :]
    +
    +zMean = Diagnostic(zetaMean, prob; nsteps, freq=10)  # the zonal-mean vorticity

    We combile all diags in a list.

    diags = [E, Z, zMean] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaQLturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "forcedbetaQLturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  grid, vars = prob.grid, prob.vars
    +
    +  @. vars.uh = im * grid.l  * grid.invKrsq * sol
    +  ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))
    +
    +  return  vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    Output
    +  ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}
    +  ├──── path: ./forcedbetaQLturb.jld2
    +  └── fields: Dict{Symbol, Function}(:sol => Main.var"##246".get_sol, :u => Main.var"##246".get_u)

    Visualizing the simulation

    We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.

    title_ζ = Observable(@sprintf("vorticity, μt = %.2f", μ * clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axζ̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean ζ",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.05)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 5)))
    +
    +ζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta
    +ζ = Observable(Array(@. ζ̄ + ζ′))
    +ψ̄, ψ′= prob.vars.Psi,  prob.vars.psi
    +ψ = Observable(Array(@. ψ̄ + ψ′))
    +ζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))
    +ūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))
    +
    +μt = Observable(μ * E.t[1:1])
    +energy = Observable(E.data[1:1])
    +enstrophy = Observable(Z.data[1:1])
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +heatmap!(axψ, x, y, ψ;
    +         colormap = :viridis, colorrange = (-0.22, 0.22))
    +
    +lines!(axζ̄, ζ̄ₘ, y; linewidth = 3)
    +lines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, μt, energy; linewidth = 3)
    +lines!(axZ, μt, enstrophy; linewidth = 3, color = :red)
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "barotropicqgql_betaforced.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],
    +      (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = @. ζ̄ + ζ′
    +  ψ[] = @. ψ̄ + ψ′
    +  ζ̄ₘ[] = vec(mean(ζ̄, dims=1))
    +  ūₘ[] = vec(mean(prob.vars.U, dims=1))
    +
    +  μt.val = μ * E.t[1:E.i]
    +  energy[] = E.data[1:E.i]
    +  enstrophy[] = Z.data[1:E.i]
    +
    +  title_ζ[] = @sprintf("vorticity, μt = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  BarotropicQGQL.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.67, E: 0.0319, Q: 4.6924, walltime: 0.13 min
    +step: 2000, t: 100, cfl: 0.81, E: 0.0410, Q: 4.1952, walltime: 0.23 min
    +step: 3000, t: 150, cfl: 0.80, E: 0.0453, Q: 4.0640, walltime: 0.33 min
    +step: 4000, t: 200, cfl: 0.96, E: 0.0458, Q: 4.1056, walltime: 0.44 min
    +step: 5000, t: 250, cfl: 0.87, E: 0.0474, Q: 4.3665, walltime: 0.55 min
    +step: 6000, t: 300, cfl: 0.79, E: 0.0495, Q: 4.6566, walltime: 0.67 min
    +step: 7000, t: 350, cfl: 0.79, E: 0.0484, Q: 4.2472, walltime: 0.80 min
    +step: 8000, t: 400, cfl: 0.92, E: 0.0479, Q: 3.8324, walltime: 0.93 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/multilayerqg_2layer-31.png b/v0.16.1/literated/multilayerqg_2layer-31.png new file mode 100644 index 00000000..890c434c Binary files /dev/null and b/v0.16.1/literated/multilayerqg_2layer-31.png differ diff --git a/v0.16.1/literated/multilayerqg_2layer.mp4 b/v0.16.1/literated/multilayerqg_2layer.mp4 new file mode 100644 index 00000000..5b7d72e6 Binary files /dev/null and b/v0.16.1/literated/multilayerqg_2layer.mp4 differ diff --git a/v0.16.1/literated/multilayerqg_2layer/index.html b/v0.16.1/literated/multilayerqg_2layer/index.html new file mode 100644 index 00000000..95110965 --- /dev/null +++ b/v0.16.1/literated/multilayerqg_2layer/index.html @@ -0,0 +1,181 @@ + +Phillips model of Baroclinic Instability · GeophysicalFlows.jl

    Phillips model of Baroclinic Instability

    A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference $\Delta U$ in the imposed, domain-averaged, zonal flow at each layer.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf
    +
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

    n = 128                  # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 2.5e-3         # timestep
    + nsteps = 20000          # total number of time-steps
    + nsubs  = 50             # number of time-steps for plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π                   # domain size
    +μ = 5e-2                 # bottom drag
    +β = 5                    # the y-gradient of planetary PV
    +
    +nlayers = 2              # number of layers
    +f₀ = 1                   # Coriolis parameter
    +H = [0.2, 0.8]           # the rest depths of each layer
    +b = [-1.0, -1.2]         # Boussinesq buoyancy of each layer
    +
    +U = zeros(nlayers)       # the imposed mean zonal flow in each layer
    +U[1] = 1.0
    +U[2] = 0.0

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, H, b, U, μ, β,
    +                            dt, stepper, aliased_fraction=0)

    and define some shortcuts.

    sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.

    device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    seed!(1234) # reset of the random number generator for reproducibility
    +q₀  = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))
    +q₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft  only in dims=1, 2
    +q₀  = irfft(q₀h, grid.nx, (1, 2))                 # apply irfft only in dims=1, 2
    +
    +MultiLayerQG.set_q!(prob, q₀)

    Diagnostics

    Create Diagnostics – energies function is imported at the top.

    E = Diagnostic(MultiLayerQG.energies, prob; nsteps)
    +diags = [E] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_2layer"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "2layer.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid
    +
    +  @. vars.qh = sol
    +  streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +  @. vars.uh = -im * grid.l * vars.ψh
    +  invtransform!(vars.u, vars.uh, params)
    +
    +  return vars.u
    +end
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_KE = Observable(@sprintf("μt = %.2f", μ * clock.t))
    +
    +q₁ = Observable(Array(vars.q[:, :, 1]))
    +ψ₁ = Observable(Array(vars.ψ[:, :, 1]))
    +q₂ = Observable(Array(vars.q[:, :, 2]))
    +ψ₂ = Observable(Array(vars.ψ[:, :, 2]))
    +
    +function compute_levels(maxf, nlevels=8)
    +  # -max(|f|):...:max(|f|)
    +  levelsf  = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))
    +
    +  # only positive
    +  levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))
    +
    +  # only negative
    +  levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))
    +
    +  return levelsf, levelsf⁺, levelsf⁻
    +end
    +
    +maxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))
    +maxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))
    +
    +levelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)
    +levelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)
    +
    +KE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])
    +KE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])
    +PE  = Observable(Point2f[(μ * E.t[1], E.data[1][2])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq₁ = Axis(fig[1, 1]; title = "q₁", axis_kwargs...)
    +
    +axψ₁ = Axis(fig[2, 1]; title = "ψ₁", axis_kwargs...)
    +
    +axq₂ = Axis(fig[1, 2]; title = "q₂", axis_kwargs...)
    +
    +axψ₂ = Axis(fig[2, 2]; title = "ψ₂", axis_kwargs...)
    +
    +axKE = Axis(fig[1, 3],
    +            xlabel = "μ t",
    +            ylabel = "KE",
    +            title = title_KE,
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +axPE = Axis(fig[2, 3],
    +            xlabel = "μ t",
    +            ylabel = "PE",
    +            yscale = log10,
    +            limits = ((-0.1, 2.6), (1e-9, 5)))
    +
    +heatmap!(axq₁, x, y, q₁; colormap = :balance)
    +
    +heatmap!(axq₂, x, y, q₂; colormap = :balance)
    +
    +contourf!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁺, color=:black)
    + contour!(axψ₁, x, y, ψ₁;
    +          levels = levelsψ₁⁻, color=:black, linestyle = :dash)
    +
    +contourf!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁺, color=:black)
    + contour!(axψ₂, x, y, ψ₂;
    +          levels = levelsψ₂⁻, color=:black, linestyle = :dash)
    +
    +ke₁ = lines!(axKE, KE₁; linewidth = 3)
    +ke₂ = lines!(axKE, KE₂; linewidth = 3)
    +Legend(fig[1, 4], [ke₁, ke₂,], ["KE₁", "KE₂"])
    +
    +lines!(axPE, PE; linewidth = 3)
    +
    +fig

    Time-stepping the Problem forward

    Finally, we time-step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "multilayerqg_2layer.mp4", frames, framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min",
    +                   clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q₁[] = vars.q[:, :, 1]
    +  ψ₁[] = vars.ψ[:, :, 1]
    +  q₂[] = vars.q[:, :, 2]
    +  ψ₂[] = vars.ψ[:, :, 2]
    +
    +  maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])
    +  maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])
    +
    +  KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))
    +  KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))
    +  PE[]  = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))
    +
    +  title_KE[] = @sprintf("μ t = %.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  MultiLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min
    +step: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.31 min
    +step: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.44 min
    +step: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.57 min
    +step: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.70 min
    +step: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.83 min
    +step: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.97 min
    +step: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.12 min
    +step: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.27 min
    +step: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.41 min
    +step: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.55 min
    +step: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.70 min
    +step: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.84 min
    +step: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 1.96 min
    +step: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.09 min
    +step: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.21 min
    +step: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.34 min
    +step: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.45 min
    +step: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.56 min
    +step: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.68 min
    +step: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.79 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 b/v0.16.1/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 new file mode 100644 index 00000000..b179cb38 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_barotropic_equivalentbarotropic.mp4 differ diff --git a/v0.16.1/literated/singlelayerqg_betadecay-20.png b/v0.16.1/literated/singlelayerqg_betadecay-20.png new file mode 100644 index 00000000..941ac868 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_betadecay-20.png differ diff --git a/v0.16.1/literated/singlelayerqg_betadecay-33.png b/v0.16.1/literated/singlelayerqg_betadecay-33.png new file mode 100644 index 00000000..c5f81adc Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_betadecay-33.png differ diff --git a/v0.16.1/literated/singlelayerqg_betadecay.mp4 b/v0.16.1/literated/singlelayerqg_betadecay.mp4 new file mode 100644 index 00000000..6aee0c68 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_betadecay.mp4 differ diff --git a/v0.16.1/literated/singlelayerqg_betadecay/index.html b/v0.16.1/literated/singlelayerqg_betadecay/index.html new file mode 100644 index 00000000..61165f65 --- /dev/null +++ b/v0.16.1/literated/singlelayerqg_betadecay/index.html @@ -0,0 +1,131 @@ + +Decaying barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Decaying barotropic QG beta-plane turbulence

    An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.04           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.0       # bottom drag

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x, y = grid.x, grid.y

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 10$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.08 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                          # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +q₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. q₀h = ifelse(K < 6  * 2π/L, 0, q₀h)
    +@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)
    +@. q₀h[1, :] = 0    # remove any power from zonal wavenumber k=0
    +q₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀
    +q₀ = irfft(q₀h, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, q₀)

    Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (800, 360))
    +
    +axq = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial vorticity ∂v/∂x-∂u/∂y",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +axψ = Axis(fig[1, 2];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = "initial streamfunction ψ",
    +           aspect = 1,
    +           limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))
    +           )
    +
    +heatmap!(axq, x, y, Array(vars.q); colormap = :balance)
    +
    +contourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We plot the vorticity and streamfunction and their corresponding zonal mean structure.

    Lx, Ly = grid.Lx, grid.Ly
    +
    +title_q = Observable(@sprintf("vorticity, t = %.2f", clock.t))
    +title_ψ = "streamfunction ψ"
    +
    +fig = Figure(resolution=(800, 720))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +q  = Observable(Array(vars.q))
    +ψ  = Observable(Array(vars.ψ))
    +q̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))
    +ūₘ = Observable(Array(vec(mean(vars.u, dims=1))))
    +
    +heatmap!(axq, x, y, q;
    +         colormap = :balance, colorrange = (-12, 12))
    +
    +levels = collect(range(-0.7, stop=0.7, length=20))
    +
    +contourf!(axψ, x, y, ψ;
    +         levels, colormap = :viridis, colorrange = (-0.35, 0.35))
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₘ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)
    +
    +lines!(axū, ūₘ, y; linewidth = 3)
    +lines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +frames = 0:round(Int, nsteps / nsubs)
    +
    +record(fig, "singlelayerqg_betadecay.mp4", frames, framerate = 12) do j
    +  if j % round(Int, nsteps/nsubs / 4) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +  q̄ₘ[] = vec(mean(vars.q, dims=1))
    +  ūₘ[] = vec(mean(vars.u, dims=1))
    +
    +  title_q[] = @sprintf("vorticity, t = %.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min
    +step: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.16 min
    +step: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.28 min
    +step: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.40 min
    +step: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.51 min
    +

    Save

    Finally, we can save, e.g., the last snapshot via

    savename = @sprintf("%s_%09d.png", joinpath(plotpath, plotname), clock.step)
    +savefig(savename)

    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/singlelayerqg_betaforced-23.png b/v0.16.1/literated/singlelayerqg_betaforced-23.png new file mode 100644 index 00000000..46f9c19c Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_betaforced-23.png differ diff --git a/v0.16.1/literated/singlelayerqg_betaforced-48.png b/v0.16.1/literated/singlelayerqg_betaforced-48.png new file mode 100644 index 00000000..83303a8a Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_betaforced-48.png differ diff --git a/v0.16.1/literated/singlelayerqg_betaforced.mp4 b/v0.16.1/literated/singlelayerqg_betaforced.mp4 new file mode 100644 index 00000000..e4810073 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_betaforced.mp4 differ diff --git a/v0.16.1/literated/singlelayerqg_betaforced/index.html b/v0.16.1/literated/singlelayerqg_betaforced/index.html new file mode 100644 index 00000000..82c0ddca --- /dev/null +++ b/v0.16.1/literated/singlelayerqg_betaforced/index.html @@ -0,0 +1,196 @@ + +Forced-dissipative barotropic QG beta-plane turbulence · GeophysicalFlows.jl

    Forced-dissipative barotropic QG beta-plane turbulence

    A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf
    +
    +using Statistics: mean
    +using LinearAlgebra: ldiv!
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution: n² grid points
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 8000          # total number of timesteps
    + save_substeps = 10      # number of timesteps after which output is saved
    +

    Physical parameters

    L = 2π        # domain size
    +β = 10.0      # planetary PV gradient
    +μ = 0.01      # bottom drag

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.001                         # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)            # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0       # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

    function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  randn!(Fh)
    +  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,
    +                             calcF=calcF!, stochastic=true)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +fig

    Setting initial conditions

    Our initial condition is simply fluid at rest.

    SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostic – energy and enstrophy are functions imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_forcedbetaturb"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "singlelayerqg_forcedbeta.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    and then create Output.

    get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution
    +
    +function get_u(prob)
    +  vars, grid, sol = prob.vars, prob.grid, prob.sol
    +
    +  @. vars.qh = sol
    +
    +  SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)
    +
    +  ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)
    +
    +  return Array(vars.u)
    +end
    +
    +output = Output(prob, filename, (:qh, get_sol), (:u, get_u))

    We first save the problem's grid and other parameters so we can use them later.

    saveproblem(output)

    and then call saveoutput(output) once to save the initial state.

    saveoutput(output)

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +while clock.step <= nsteps
    +  if clock.step % 50save_substeps == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +    clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  stepforward!(prob, diags, save_substeps)
    +  SingleLayerQG.updatevars!(prob)
    +
    +  if clock.step % save_substeps == 0
    +    saveoutput(output)
    +  end
    +end
    +
    +savediagnostic(E, "energy", output.path)
    +savediagnostic(Z, "enstrophy", output.path)
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min
    +step: 0500, t: 25, cfl: 0.55, E: 0.0182, Q: 2.6371, walltime: 0.04 min
    +step: 1000, t: 50, cfl: 0.61, E: 0.0293, Q: 2.8787, walltime: 0.06 min
    +step: 1500, t: 75, cfl: 0.67, E: 0.0364, Q: 2.8105, walltime: 0.08 min
    +step: 2000, t: 100, cfl: 0.87, E: 0.0403, Q: 2.6290, walltime: 0.10 min
    +step: 2500, t: 125, cfl: 0.83, E: 0.0433, Q: 2.7528, walltime: 0.12 min
    +step: 3000, t: 150, cfl: 0.91, E: 0.0446, Q: 2.6793, walltime: 0.14 min
    +step: 3500, t: 175, cfl: 0.77, E: 0.0455, Q: 2.6078, walltime: 0.16 min
    +step: 4000, t: 200, cfl: 0.71, E: 0.0455, Q: 2.6548, walltime: 0.18 min
    +step: 4500, t: 225, cfl: 0.78, E: 0.0458, Q: 2.6460, walltime: 0.19 min
    +step: 5000, t: 250, cfl: 0.89, E: 0.0473, Q: 2.7878, walltime: 0.21 min
    +step: 5500, t: 275, cfl: 0.90, E: 0.0480, Q: 2.7345, walltime: 0.23 min
    +step: 6000, t: 300, cfl: 0.87, E: 0.0482, Q: 2.8067, walltime: 0.25 min
    +step: 6500, t: 325, cfl: 0.74, E: 0.0478, Q: 2.7029, walltime: 0.27 min
    +step: 7000, t: 350, cfl: 0.86, E: 0.0461, Q: 2.5248, walltime: 0.29 min
    +step: 7500, t: 375, cfl: 0.78, E: 0.0465, Q: 2.6692, walltime: 0.31 min
    +step: 8000, t: 400, cfl: 0.74, E: 0.0456, Q: 2.5986, walltime: 0.33 min
    +

    Load saved output and visualize

    We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.

    file = jldopen(output.path)
    +
    +iterations = parse.(Int, keys(file["snapshots/t"]))
    +t = [file["snapshots/t/$i"] for i ∈ iterations]
    +
    +qh = [file["snapshots/qh/$i"] for i ∈ iterations]
    +u  = [file["snapshots/u/$i"] for i ∈ iterations]
    +
    +E_t = file["diagnostics/energy/t"]
    +Z_t = file["diagnostics/enstrophy/t"]
    +E_data = file["diagnostics/energy/data"]
    +Z_data = file["diagnostics/enstrophy/data"]
    +
    +x,  y  = file["grid/x"],  file["grid/y"]
    +nx, ny = file["grid/nx"], file["grid/ny"]
    +Lx, Ly = file["grid/Lx"], file["grid/Ly"]
    +
    +close(file)

    We create a figure using Makie's Observables

    n = Observable(1)
    +
    +qₙ = @lift irfft(qh[$n], nx)
    +ψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)
    +q̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))
    +ūₙ = @lift vec(mean(u[$n], dims=1))
    +
    +title_q = @lift @sprintf("vorticity, μt = %.2f", μ * t[$n])
    +
    +energy    = Observable([Point2f(E_t[1], E_data[1])])
    +enstrophy = Observable([Point2f(Z_t[1], Z_data[1])])
    +
    +fig = Figure(resolution=(1000, 600))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +axψ = Axis(fig[2, 1]; title = "streamfunction ψ", axis_kwargs...)
    +
    +axq̄ = Axis(fig[1, 2],
    +           xlabel = "zonal mean vorticity",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-3, 3), (-Ly/2, Ly/2)))
    +
    +axū = Axis(fig[2, 2],
    +           xlabel = "zonal mean u",
    +           ylabel = "y",
    +           aspect = 1,
    +           limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 3],
    +           xlabel = "μ t",
    +           ylabel = "energy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 0.055)))
    +
    +axZ = Axis(fig[2, 3],
    +           xlabel = "μ t",
    +           ylabel = "enstrophy",
    +           aspect = 1,
    +           limits = ((-0.1, 4.1), (0, 3.1)))
    +
    +heatmap!(axq, x, y, qₙ;
    +         colormap = :balance, colorrange = (-8, 8))
    +
    +levels = collect(-0.32:0.04:0.32)
    +
    +contourf!(axψ, x, y, ψₙ;
    +          levels, colormap = :viridis, colorrange = (-0.22, 0.22))
    +contour!(axψ, x, y, ψₙ;
    +         levels, color = :black)
    +
    +lines!(axq̄, q̄ₙ, y; linewidth = 3)
    +lines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axū, ūₙ, y; linewidth = 3)
    +lines!(axū, 0y, y; linewidth = 1, linestyle=:dash)
    +
    +lines!(axE, energy; linewidth = 3)
    +lines!(axZ, enstrophy; linewidth = 3, color = :red)
    +
    +fig

    We are now ready to animate all saved output.

    frames = 1:length(t)
    +record(fig, "singlelayerqg_betaforced.mp4", frames, framerate = 16) do i
    +  n[] = i
    +
    +  energy[]    = push!(energy[],    Point2f(μ * E_t[i], E_data[i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))
    +end


    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png b/v0.16.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png new file mode 100644 index 00000000..bc7e32cb Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic-23.png differ diff --git a/v0.16.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html b/v0.16.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html new file mode 100644 index 00000000..b2956ec0 --- /dev/null +++ b/v0.16.1/literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/index.html @@ -0,0 +1,93 @@ + +SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation · GeophysicalFlows.jl

    SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation

    We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, Printf, Random, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using GeophysicalFlows: peakedisotropicspectrum
    +using LinearAlgebra: ldiv!
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length
    +deformation_radius = 0.35   # the deformation radius
    +
    +# Then we pick the time-stepper parameters
    +    dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.

    For both problems we use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    stepper="FilteredRK4"
    +
    +prob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)
    +prob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)

    Setting initial conditions

    For initial condition we construct a relative vorticity with energy most energy around total wavenumber $k_0$.

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)

    SingleLayerQG allows us to set up the initial $q$ for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.

    ∇²ψ₀h = rfft(∇²ψ₀)
    +ψ₀h = @. 0 * ∇²ψ₀h
    +SingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)

    and then use the streamfunction to compute the corresponding $q_0$ for each problem,

    q₀_bqg   = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)
    +q₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)

    Now we can initialize our problems with the same flow.

    SingleLayerQG.set_q!(prob_bqg, q₀_bqg)
    +SingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)

    Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    function relativevorticity(prob)
    +  vars, grid = prob.vars, prob.grid
    +
    +  ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)
    +
    +  return vars.q
    +end
    +
    +x,  y  = prob_bqg.grid.x,  prob_bqg.grid.y
    +Lx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +t_bqg = Observable(prob_bqg.clock.t)
    +t_eqbqg = Observable(prob_eqbqg.clock.t)
    +
    +title_bqg = @lift "barotropic\n ∇²ψ, t=" * @sprintf("%.2f", $t_bqg)
    +title_eqbqg = @lift "equivalent barotropic; deformation radius: " * @sprintf("%.2f", prob_eqbqg.params.deformation_radius) * "\n ∇²ψ, t=" * @sprintf("%.2f", $t_eqbqg)
    +
    +ax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)
    +ax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)
    +
    +ζ_bqg = Observable(Array(relativevorticity(prob_bqg)))
    +ζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))
    +
    +heatmap!(ax1, x, y, ζ_bqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +heatmap!(ax2, x, y, ζ_eqbqg;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Time-stepping the Problem forward

    Now we time-step both problems forward and animate the relative vorticity in each case.

    startwalltime = time()
    +
    +cfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])
    +
    +record(fig, "singlelayerqg_barotropic_equivalentbarotropic.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    log_bqg = @sprintf("barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)
    +    println(log_bqg)
    +
    +    log_eqbqg = @sprintf("equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min",
    +        prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)
    +    println(log_eqbqg)
    +  end
    +
    +  stepforward!(prob_bqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_bqg)
    +
    +  stepforward!(prob_eqbqg, nsubs)
    +  SingleLayerQG.updatevars!(prob_eqbqg)
    +
    +  t_bqg[] = prob_bqg.clock.t
    +  t_eqbqg[] = prob_eqbqg.clock.t
    +  ζ_bqg[] = relativevorticity(prob_bqg)
    +  ζ_eqbqg[] = relativevorticity(prob_eqbqg)
    +end
    barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +equivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min
    +barotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.08 min
    +equivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.08 min
    +barotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.16 min
    +equivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.16 min
    +barotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.22 min
    +equivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.22 min
    +barotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.29 min
    +equivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.29 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/singlelayerqg_decaying_topography-19.png b/v0.16.1/literated/singlelayerqg_decaying_topography-19.png new file mode 100644 index 00000000..b0a7e4a1 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_decaying_topography-19.png differ diff --git a/v0.16.1/literated/singlelayerqg_decaying_topography-24.png b/v0.16.1/literated/singlelayerqg_decaying_topography-24.png new file mode 100644 index 00000000..a07aa345 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_decaying_topography-24.png differ diff --git a/v0.16.1/literated/singlelayerqg_decaying_topography.mp4 b/v0.16.1/literated/singlelayerqg_decaying_topography.mp4 new file mode 100644 index 00000000..a0e9be10 Binary files /dev/null and b/v0.16.1/literated/singlelayerqg_decaying_topography.mp4 differ diff --git a/v0.16.1/literated/singlelayerqg_decaying_topography/index.html b/v0.16.1/literated/singlelayerqg_decaying_topography/index.html new file mode 100644 index 00000000..7741173d --- /dev/null +++ b/v0.16.1/literated/singlelayerqg_decaying_topography/index.html @@ -0,0 +1,102 @@ + +Decaying barotropic QG turbulence over topography · GeophysicalFlows.jl

    Decaying barotropic QG turbulence over topography

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 128            # 2D resolution = n²
    +stepper = "FilteredRK4"  # timestepper
    +     dt = 0.05           # timestep
    + nsteps = 2000           # total number of time-steps
    + nsubs  = 10             # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

    L = 2π        # domain size

    Define the topographic potential vorticity, $\eta = f_0 h(x, y)/H$. The topography here is an elliptical mount at $(x, y) = (1, 1)$, and an elliptical depression at $(x, y) = (-1, -1)$.

    σx, σy = 0.4, 0.8
    +topographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.

    The topophic PV is prescribed via keyword argument eta.

    prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,
    +                             dt, stepper, aliased_fraction=0)

    and define some shortcuts

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    η = Array(params.eta)
    +
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "topographic PV η=f₀h/H",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +contourf!(ax, x, y, η;
    +          levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))
    +
    +fig

    Setting initial conditions

    Our initial condition consist of a flow that has power only at wavenumbers with $6 < \frac{L}{2\pi} \sqrt{k_x^2 + k_y^2} < 12$ and initial energy $E_0$. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().

    E₀ = 0.04 # energy of initial condition
    +
    +K = @. sqrt(grid.Krsq)                             # a 2D array with the total wavenumber
    +
    +Random.seed!(1234)
    +qih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))
    +@. qih = ifelse(K < 6  * 2π/L, 0, qih)
    +@. qih = ifelse(K > 12 * 2π/L, 0, qih)
    +qih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid))  # normalize qi to have energy E₀
    +qi = irfft(qih, grid.nx)
    +
    +SingleLayerQG.set_q!(prob, qi)

    Let's plot the initial vorticity and streamfunction.

    q = Observable(Array(vars.q))
    +ψ = Observable(Array(vars.ψ))
    +
    +fig = Figure(resolution=(800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +title_q = Observable("initial vorticity ∂v/∂x-∂u/∂y")
    +axq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)
    +
    +title_ψ = Observable("initial streamfunction ψ")
    +axψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)
    +
    +hm = heatmap!(axq, x, y, q;
    +              colormap = :balance, colorrange = (-8, 8))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +levels = collect(range(-0.28, stop=0.28, length=11))
    +
    +hc = contourf!(axψ, x, y, ψ;
    +               levels, colormap = :viridis, colorrange = (-0.28, 0.28),
    +               extendlow = :auto, extendhigh = :auto)
    +contour!(axψ, x, y, ψ;
    +         levels, color = :black)
    +
    +Colorbar(fig[1, 4], hc)
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(SingleLayerQG.energy, prob; nsteps)
    +Z = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files.

    filepath = "."
    +filename = joinpath(filepath, "decayingbetaturb.jld2")

    Do some basic file management,

    if isfile(filename); rm(filename); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +out = Output(prob, filename, (:sol, get_sol))

    Visualizing the simulation

    We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.

    contour!(axq, x, y, η;
    +         levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))
    +
    +contour!(axq, x, y, η;
    +         levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)
    +
    +title_q[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +title_ψ[] = "streamfunction ψ"
    +

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "singlelayerqg_decaying_topography.mp4", 0:round(Int, nsteps/nsubs), framerate = 12) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min",
    +      clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  q[] = vars.q
    +  ψ[] = vars.ψ
    +
    +  title_q[] = "vorticity, t="*@sprintf("%.2f", clock.t)
    +  title_ψ[] = "streamfunction ψ"
    +
    +  stepforward!(prob, diags, nsubs)
    +  SingleLayerQG.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min
    +step: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.24 min
    +step: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.46 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/sqg_ellipticalvortex.mp4 b/v0.16.1/literated/sqg_ellipticalvortex.mp4 new file mode 100644 index 00000000..8e168d95 Binary files /dev/null and b/v0.16.1/literated/sqg_ellipticalvortex.mp4 differ diff --git a/v0.16.1/literated/surfaceqg_decaying-19.png b/v0.16.1/literated/surfaceqg_decaying-19.png new file mode 100644 index 00000000..3ba5674a Binary files /dev/null and b/v0.16.1/literated/surfaceqg_decaying-19.png differ diff --git a/v0.16.1/literated/surfaceqg_decaying-34.png b/v0.16.1/literated/surfaceqg_decaying-34.png new file mode 100644 index 00000000..861be2c3 Binary files /dev/null and b/v0.16.1/literated/surfaceqg_decaying-34.png differ diff --git a/v0.16.1/literated/surfaceqg_decaying-39.png b/v0.16.1/literated/surfaceqg_decaying-39.png new file mode 100644 index 00000000..b16b665b Binary files /dev/null and b/v0.16.1/literated/surfaceqg_decaying-39.png differ diff --git a/v0.16.1/literated/surfaceqg_decaying/index.html b/v0.16.1/literated/surfaceqg_decaying/index.html new file mode 100644 index 00000000..4f7bec2e --- /dev/null +++ b/v0.16.1/literated/surfaceqg_decaying/index.html @@ -0,0 +1,133 @@ + +Decaying Surface QG turbulence · GeophysicalFlows.jl

    Decaying Surface QG turbulence

    A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).

    An example of decaying barotropic quasi-geostrophic turbulence over topography.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CairoMakie, Printf, Random
    +
    +using Statistics: mean
    +using Random: seed!

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical parameters and time-stepping parameters

          n = 256                       # 2D resolution = n²
    +stepper = "FilteredETDRK4"          # timestepper
    +     dt = 0.03                      # timestep
    +     tf = 60                        # length of time for simulation
    + nsteps = Int(tf / dt)              # total number of time-steps
    + nsubs  = round(Int, nsteps/100)    # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)

    Physical parameters

     L = 2π        # domain size
    + ν = 1e-19     # hyper-viscosity coefficient
    +nν = 4         # hyper-viscosity order

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)

    Let's define some shortcuts.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    We initialize the buoyancy equation with an elliptical vortex.

    X, Y = gridpoints(grid)
    +b₀ = @. exp(-(X^2 + 4Y^2))
    +
    +SurfaceQG.set_b!(prob, b₀)

    Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure(resolution = (500, 500))
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "buoyancy bₛ",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +hm = heatmap!(ax, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[1, 2], hm)
    +
    +fig

    Diagnostics

    Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.

    B  = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)
    +KE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)
    +Dᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)
    +diags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs

    base_filename = string("SurfaceQG_decaying_n_", n)
    "SurfaceQG_decaying_n_256"

    We choose folder for outputing .jld2 files and snapshots (.png files).

    datapath = "./"
    +plotpath = "./"
    +
    +dataname = joinpath(datapath, base_filename)
    +plotname = joinpath(plotpath, base_filename)

    Do some basic file management,

    if !isdir(plotpath); mkdir(plotpath); end
    +if !isdir(datapath); mkdir(datapath); end

    and then create Output.

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, dataname, (:sol, get_sol), (:u, get_u))

    Visualizing the simulation

    We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.

    b = Observable(Array(vars.b))
    +
    +ke = Observable([Point2f(KE.t[1], KE.data[1])])
    +b² = Observable([Point2f(B.t[1], B.data[1])])
    +
    +title_b = Observable("buoyancy, t=" * @sprintf("%.2f", clock.t))
    +
    +fig = Figure(resolution = (900, 600))
    +
    +axb = Axis(fig[1:2, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_b,
    +           aspect = 1,
    +           limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axE = Axis(fig[1, 2];
    +           xlabel = "t",
    +           limits = ((0, tf), (0, 2e-2)))
    +
    +heatmap!(axb, x, y, b;
    +         colormap = :deep, colorrange = (0, 1))
    +
    +hE  = lines!(axE, ke; linewidth = 3)
    +hb² = lines!(axE, b²; linewidth = 3)
    +
    +Legend(fig[2, 2], [hE, hb²], ["kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²", "buoyancy variance ∫bₛ²dxdy/L²"])
    +
    +fig

    Time-stepping the Problem forward and create animation by updating the plot.

    startwalltime = time()
    +
    +record(fig, "sqg_ellipticalvortex.mp4", 0:round(Int, nsteps/nsubs), framerate = 14) do j
    +  if j % (500 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log1 = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, (time()-startwalltime)/60)
    +
    +    log2 = @sprintf("buoyancy variance: %.2e, buoyancy variance dissipation: %.2e",
    +              B.data[B.i], Dᵇ.data[Dᵇ.i])
    +
    +    println(log1)
    +
    +    println(log2)
    +  end
    +
    +  b[] = vars.b
    +
    +  ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))
    +  b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))
    +
    +  title_b[] = "buoyancy, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  SurfaceQG.updatevars!(prob)
    +end
    step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16
    +step: 0500, t: 15.0, cfl: 0.588, walltime: 0.08 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11
    +step: 1000, t: 30.0, cfl: 0.571, walltime: 0.13 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09
    +step: 1500, t: 45.0, cfl: 0.577, walltime: 0.18 min
    +buoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08
    +step: 2000, t: 60.0, cfl: 0.574, walltime: 0.22 min
    +buoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08
    +

    Let's see how all flow fields look like at the end of the simulation.

    fig = Figure(resolution = (800, 380))
    +
    +axis_kwargs = (xlabel = "x",
    +               ylabel = "y",
    +               aspect = 1,
    +               limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +axb = Axis(fig[1, 1]; title = "bₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axu = Axis(fig[1, 2]; title = "uₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +axv = Axis(fig[1, 3]; title = "vₛ(x, y, t=" * @sprintf("%.2f", clock.t) * ")", axis_kwargs...)
    +
    +hb = heatmap!(axb, x, y, Array(vars.b);
    +              colormap = :deep, colorrange = (0, 1))
    +
    +Colorbar(fig[2, 1], hb, vertical = false)
    +
    +hu = heatmap!(axu, x, y, Array(vars.u);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))
    +
    +Colorbar(fig[2, 2], hu, vertical = false)
    +
    +hv = heatmap!(axv, x, y, Array(vars.v);
    +              colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))
    +
    +Colorbar(fig[2, 3], hv, vertical = false)
    +
    +fig

    Save

    We can save the output at the end of the simulation by calling

    saveoutput(out)

    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/twodnavierstokes_decaying-20.png b/v0.16.1/literated/twodnavierstokes_decaying-20.png new file mode 100644 index 00000000..ce91dd5b Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_decaying-20.png differ diff --git a/v0.16.1/literated/twodnavierstokes_decaying-33.png b/v0.16.1/literated/twodnavierstokes_decaying-33.png new file mode 100644 index 00000000..acb4feb3 Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_decaying-33.png differ diff --git a/v0.16.1/literated/twodnavierstokes_decaying-42.png b/v0.16.1/literated/twodnavierstokes_decaying-42.png new file mode 100644 index 00000000..0da1a370 Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_decaying-42.png differ diff --git a/v0.16.1/literated/twodnavierstokes_decaying/index.html b/v0.16.1/literated/twodnavierstokes_decaying/index.html new file mode 100644 index 00000000..577e8051 --- /dev/null +++ b/v0.16.1/literated/twodnavierstokes_decaying/index.html @@ -0,0 +1,97 @@ + +2D decaying turbulence · GeophysicalFlows.jl

    2D decaying turbulence

    A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, Printf, Random, CairoMakie
    +
    +using Random: seed!
    +using GeophysicalFlows: peakedisotropicspectrum

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

    n, L  = 128, 2π             # grid resolution and domain length

    Then we pick the time-stepper parameters

        dt = 1e-2  # timestep
    +nsteps = 4000  # total number of steps
    + nsubs = 20    # number of steps between each plot

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. We use stepper = "FilteredRK4". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper="FilteredRK4")

    Next we define some shortcuts for convenience.

    sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    Setting initial conditions

    Our initial condition tries to reproduce the initial condition used by McWilliams (1984).

    seed!(1234)
    +k₀, E₀ = 6, 0.5
    +ζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)
    +TwoDNavierStokes.set_ζ!(prob, ζ₀)

    Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.

    fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "initial vorticity",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ');
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +fig

    Diagnostics

    Create Diagnostics – energy and enstrophy functions are imported at the top.

    E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)
    +Z = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)
    +diags = [E, Z] # A list of Diagnostics types passed to "stepforward!" will  be updated every timestep.

    Output

    We choose folder for outputing .jld2 files and snapshots (.png files).

    filepath = "."
    +plotpath = "./plots_decayingTwoDNavierStokes"
    +plotname = "snapshots"
    +filename = joinpath(filepath, "decayingTwoDNavierStokes.jld2")

    Do some basic file management

    if isfile(filename); rm(filename); end
    +if !isdir(plotpath); mkdir(plotpath); end

    And then create Output

    get_sol(prob) = prob.sol # extracts the Fourier-transformed solution
    +get_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)
    +
    +out = Output(prob, filename, (:sol, get_sol), (:u, get_u))
    +saveproblem(out)

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, t=" * @sprintf("%.2f", clock.t))
    +
    +energy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])
    +enstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "t",
    +           limits = ((-0.5, 40.5), (0, 1.05)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["E(t)/E(0)", "Z(t)/Z(0)"])
    +
    +fig

    Time-stepping the Problem forward

    We time-step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb.mp4", 0:Int(nsteps/nsubs), framerate = 18) do j
    +  if j % (1000 / nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min",
    +        clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)
    +
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))
    +  enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))
    +
    +  title_ζ[] = "vorticity, t=" * @sprintf("%.2f", clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min
    +step: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.10 min
    +step: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.14 min
    +step: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.18 min
    +step: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.22 min
    +

    Radial energy spectrum

    After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,

    E  = @. 0.5 * (vars.u^2 + vars.v^2)  # energy density
    +Eh = rfft(E)                         # Fourier transform of energy density
    +
    +# compute radial specturm of `Eh`
    +kr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)

    and we plot it.

    lines(kr, vec(abs.(Ehr));
    +      linewidth = 2,
    +      axis = (xlabel = L"k_r",
    +              ylabel = L"\int |\hat{E}| k_r \mathrm{d}k_\theta",
    +              xscale = log10,
    +              yscale = log10,
    +              title = "Radial energy spectrum",
    +              limits = ((0.3, 1e2), (1e0, 1e5))))


    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing-23.png b/v0.16.1/literated/twodnavierstokes_stochasticforcing-23.png new file mode 100644 index 00000000..340422ac Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_stochasticforcing-23.png differ diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing-32.png b/v0.16.1/literated/twodnavierstokes_stochasticforcing-32.png new file mode 100644 index 00000000..95e1529d Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_stochasticforcing-32.png differ diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing/index.html b/v0.16.1/literated/twodnavierstokes_stochasticforcing/index.html new file mode 100644 index 00000000..b4bc488d --- /dev/null +++ b/v0.16.1/literated/twodnavierstokes_stochasticforcing/index.html @@ -0,0 +1,97 @@ + +2D forced-dissipative turbulence · GeophysicalFlows.jl

    2D forced-dissipative turbulence

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π             # grid resolution and domain length
    + ν, nν = 2e-7, 2             # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0             # linear drag coefficient
    +    dt = 0.005               # timestep
    +nsteps = 4000                # total number of steps
    + nsubs = 20                  # number of steps between each plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

    function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  randn!(Fh)
    +  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x, y = grid.x, grid.y

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy budget.

    E  = Diagnostic(TwoDNavierStokes.energy,    prob; nsteps) # energy
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy
    +diags = [E, Z] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Visualizing the simulation

    We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with $k_f^2$.

    ζ = Observable(Array(vars.ζ))
    +title_ζ = Observable("vorticity, μ t=" * @sprintf("%.2f", μ * clock.t))
    +
    +energy = Observable(Point2f[(μ * E.t[1], E.data[1])])
    +enstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])
    +
    +fig = Figure(resolution = (800, 360))
    +
    +axζ = Axis(fig[1, 1];
    +           xlabel = "x",
    +           ylabel = "y",
    +           title = title_ζ,
    +           aspect = 1,
    +           limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +ax2 = Axis(fig[1, 2],
    +           xlabel = "μ t",
    +           limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))
    +
    +heatmap!(axζ, x, y, ζ;
    +         colormap = :balance, colorrange = (-40, 40))
    +
    +hE = lines!(ax2, energy; linewidth = 3)
    +hZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)
    +Legend(fig[1, 3], [hE, hZ], ["energy E(t)", "enstrophy Z(t) / k_f²"])
    +
    +fig

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +
    +record(fig, "twodturb_forced.mp4", 0:round(Int, nsteps / nsubs), framerate = 18) do j
    +  if j % (1000/nsubs) == 0
    +    cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +    log = @sprintf("step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min",
    +          clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)
    +    println(log)
    +  end
    +
    +  ζ[] = vars.ζ
    +
    +  energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))
    +  enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))
    +
    +  title_ζ[] = "vorticity, μ t=" * @sprintf("%.2f", μ * clock.t)
    +
    +  stepforward!(prob, diags, nsubs)
    +  TwoDNavierStokes.updatevars!(prob)
    +end
    step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min
    +step: 1000, t: 5, cfl: 0.43, E: 0.2881, Z: 34.9014, walltime: 0.14 min
    +step: 2000, t: 10, cfl: 0.53, E: 0.3803, Z: 33.7438, walltime: 0.23 min
    +step: 3000, t: 15, cfl: 0.48, E: 0.4326, Z: 36.7366, walltime: 0.33 min
    +step: 4000, t: 20, cfl: 0.53, E: 0.4520, Z: 34.9454, walltime: 0.43 min
    +


    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-22.png b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-22.png new file mode 100644 index 00000000..340422ac Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-22.png differ diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-33.png b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-33.png new file mode 100644 index 00000000..0fd45594 Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-33.png differ diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-35.png b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-35.png new file mode 100644 index 00000000..3686719c Binary files /dev/null and b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets-35.png differ diff --git a/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets/index.html b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets/index.html new file mode 100644 index 00000000..fab8d0ee --- /dev/null +++ b/v0.16.1/literated/twodnavierstokes_stochasticforcing_budgets/index.html @@ -0,0 +1,158 @@ + +2D forced-dissipative turbulence budgets · GeophysicalFlows.jl

    2D forced-dissipative turbulence budgets

    A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.

    Install dependencies

    First let's make sure we have all required packages installed.

    using Pkg
    +pkg"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie"

    Let's begin

    Let's load GeophysicalFlows.jl and some other packages we need.

    using GeophysicalFlows, CUDA, Random, Printf, CairoMakie
    +
    +parsevalsum = FourierFlows.parsevalsum
    +record = CairoMakie.record                # disambiguate between CairoMakie.record and CUDA.record

    Choosing a device: CPU or GPU

    dev = CPU()     # Device (CPU/GPU)

    Numerical, domain, and simulation parameters

    First, we pick some numerical and physical parameters for our model.

     n, L  = 256, 2π              # grid resolution and domain length
    + ν, nν = 2e-7, 2              # hyperviscosity coefficient and hyperviscosity order
    + μ, nμ = 1e-1, 0              # linear drag coefficient
    +dt, tf = 0.005, 0.2 / μ       # timestep and final time
    +    nt = round(Int, tf / dt)  # total timesteps
    +    ns = 4                    # how many intermediate times we want to plot

    Forcing

    We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius $k_f$ (forcing_wavenumber) and width $δ_f$ (forcing_bandwidth), and it injects energy per unit area and per unit time equal to $\varepsilon$. That is, the forcing covariance spectrum is proportional to $\exp{[-(|\bm{k}| - k_f)^2 / (2 δ_f^2)]}$.

    forcing_wavenumber = 14.0 * 2π/L  # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space
    +forcing_bandwidth  = 1.5  * 2π/L  # the width of the forcing spectrum, `δ_f`
    +ε = 0.1                           # energy input rate by the forcing
    +
    +grid = TwoDGrid(dev; nx=n, Lx=L)
    +
    +K = @. sqrt(grid.Krsq)             # a 2D array with the total wavenumber
    +
    +forcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))
    +@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average
    +
    +ε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)
    +@. forcing_spectrum *= ε/ε0        # normalize forcing to inject energy at rate ε

    We reset of the random number generator for reproducibility

    if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end

    Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.

    function calcF!(Fh, sol, t, clock, vars, params, grid)
    +  randn!(Fh)
    +  @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)
    +  return nothing
    +end

    Problem setup

    We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.

    prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper="ETDRK4",
    +                                calcF=calcF!, stochastic=true)

    Define some shortcuts for convenience.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +x,  y  = grid.x,  grid.y
    +Lx, Ly = grid.Lx, grid.Ly

    First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.

    Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.

    calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)
    +
    +fig = Figure()
    +
    +ax = Axis(fig[1, 1],
    +          xlabel = "x",
    +          ylabel = "y",
    +          aspect = 1,
    +          title = "a forcing realization",
    +          limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))
    +
    +heatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));
    +         colormap = :balance, colorrange = (-200, 200))
    +
    +fig

    Setting initial conditions

    Our initial condition is a fluid at rest.

    TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))

    Diagnostics

    Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.

    E  = Diagnostic(TwoDNavierStokes.energy,                               prob, nsteps=nt) # energy
    +Rᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity,     prob, nsteps=nt) # energy dissipation by drag μ
    +Dᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity,    prob, nsteps=nt) # energy dissipation by drag μ
    +Wᵋ = Diagnostic(TwoDNavierStokes.energy_work,                          prob, nsteps=nt) # energy work input by forcing
    +Z  = Diagnostic(TwoDNavierStokes.enstrophy,                            prob, nsteps=nt) # enstrophy
    +Rᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity,  prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Dᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ
    +Wᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work,                       prob, nsteps=nt) # enstrophy work input by forcing
    +diags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will  be updated every timestep.

    Time-stepping the Problem forward

    We step the Problem forward in time.

    startwalltime = time()
    +for i = 1:ns
    +  stepforward!(prob, diags, round(Int, nt/ns))
    +
    +  TwoDNavierStokes.updatevars!(prob)
    +
    +  cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])
    +
    +  log = @sprintf("step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min", clock.step, clock.t,
    +        cfl, (time()-startwalltime)/60)
    +
    +  println(log)
    +end
    step: 0100, t: 0.5, cfl: 0.172, walltime: 0.01 min
    +step: 0200, t: 1.0, cfl: 0.214, walltime: 0.03 min
    +step: 0300, t: 1.5, cfl: 0.269, walltime: 0.04 min
    +step: 0400, t: 2.0, cfl: 0.355, walltime: 0.05 min
    +

    Plot

    Now let's see the final snapshot of the vorticity.

    fig = Figure(resolution = (400, 400))
    +
    +ax = Axis(fig[1, 1];
    +          xlabel = "x",
    +          ylabel = "y",
    +          title = "∇²ψ(x, y, μt=" * @sprintf("%.2f", μ * clock.t) * ")",
    +          aspect = 1,
    +          limits = ((-L/2, L/2), (-L/2, L/2)))
    +
    +heatmap!(ax, x, y, Array(vars.ζ);
    +         colormap = :viridis, colorrange = (-25, 25))
    +
    +fig

    And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., $\mathrm{d}E/\mathrm{d}t = W^\varepsilon - R^\varepsilon - D^\varepsilon$.

    sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid
    +
    +TwoDNavierStokes.updatevars!(prob)
    +
    +E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags
    +
    +clocktime = round(μ * clock.t, digits=2)
    +
    +dEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency
    +dZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency
    +
    +dEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]
    +dZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]
    +
    +residual_E = dEdt_computed - dEdt_numerical
    +residual_Z = dZdt_computed - dZdt_numerical
    +
    +εᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)
    +
    +t = E.t[2:E.i]
    +
    +fig = Figure(resolution = (800, 1100))
    +
    +axis_kwargs = (xlabel = "μ t", )
    +
    +ax1E = Axis(fig[1, 1]; ylabel = "energy sources/sinks", axis_kwargs...)
    +ax2E = Axis(fig[3, 1]; ylabel = "dE/dt", axis_kwargs...)
    +ax3E = Axis(fig[5, 1]; axis_kwargs...)
    +
    +ax1Z = Axis(fig[1, 2]; axis_kwargs...)
    +ax2Z = Axis(fig[3, 2]; axis_kwargs...)
    +ax3Z = Axis(fig[5, 2]; axis_kwargs...)
    +
    +hWᵋ = lines!(ax1E, t, Wᵋ[2:E.i];   linestyle = :solid)
    +hε  = lines!(ax1E, t, ε .+ 0t;     linestyle = :dash)
    +hDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)
    +hRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 1],
    +       [hWᵋ, hε, hDᵋ, hRᵋ],
    +       ["energy work, Wᵋ", "ensemble mean energy work, <Wᵋ>", "dissipation, Dᵋ", "drag, Rᵋ = - 2μE"])
    +
    +hc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)
    +hn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 1],
    +       [hc, hn],
    +       ["computed Wᵋ-Dᵋ", "numerical dE/dt"])
    +
    +hr = lines!(ax3E, t, residual_E)
    +
    +Legend(fig[6, 1],
    +       [hr],
    +       ["residual"])
    +
    +hWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i];  linestyle = :solid)
    +hεᶻ = lines!(ax1Z, t, εᶻ .+ 0t;    linestyle = :dash)
    +hDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)
    +hRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)
    +
    +Legend(fig[2, 2],
    +       [hWᶻ, hεᶻ, hDᶻ, hRᶻ],
    +       ["enstrophy work, Wᶻ", "ensemble mean enstophy work, <Wᶻ>", "dissipation, Dᶻ", "drag, Rᶻ = - 2μZ"])
    +
    +hcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)
    +hnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)
    +
    +Legend(fig[4, 2],
    +       [hcᶻ, hnᶻ],
    +       ["computed Wᶻ-Dᶻ", "numerical dZ/dt"])
    +
    +hrᶻ = lines!(ax3Z, t, residual_Z)
    +
    +Legend(fig[6, 2],
    +       [hr],
    +       ["residual"])
    +
    +fig


    This page was generated using Literate.jl.

    diff --git a/v0.16.1/literated/twodturb.mp4 b/v0.16.1/literated/twodturb.mp4 new file mode 100644 index 00000000..50500cd5 Binary files /dev/null and b/v0.16.1/literated/twodturb.mp4 differ diff --git a/v0.16.1/literated/twodturb_forced.mp4 b/v0.16.1/literated/twodturb_forced.mp4 new file mode 100644 index 00000000..d27878ad Binary files /dev/null and b/v0.16.1/literated/twodturb_forced.mp4 differ diff --git a/v0.16.1/modules/barotropicqgql/index.html b/v0.16.1/modules/barotropicqgql/index.html new file mode 100644 index 00000000..6815d373 --- /dev/null +++ b/v0.16.1/modules/barotropicqgql/index.html @@ -0,0 +1,12 @@ + +BarotropicQGQL · GeophysicalFlows.jl

    BarotropicQGQL

    Basic Equations

    This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g.,

    \[\phi(x, y, t) = \overline{\phi}(y, t) + \phi'(x, y, t) ,\]

    where overline above denotes a zonal mean, $\overline{\phi}(y, t) = \int \phi(x, y, t) \, 𝖽x / L_x$, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).

    As in the SingleLayerQG module, the flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is

    \[\underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} .\]

    The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, $\zeta \equiv \partial_x v - \partial_y u = \nabla^2 \psi$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:

    \[\begin{aligned} + \partial_t \overline{\zeta} + \mathsf{J}(\overline{\psi}, \overline{\zeta} + \overline{\eta}) + \overline{\mathsf{J}(\psi', \zeta' + \eta')} & = \underbrace{- \left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} + \right] \overline{\zeta} }_{\textrm{dissipation}} , \\ + \partial_t \zeta' + \mathsf{J}(\psi', \overline{\zeta} + \overline{\eta}) + \mathsf{J}(\overline{\psi}, \zeta' + \eta') + & \underbrace{\mathsf{J}(\psi', \zeta' + \eta') - \overline{\mathsf{J}(\psi', \zeta' + \eta')}}_{\textrm{EENL}} + \beta \partial_x \psi' = \\ + & = \underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] \zeta'}_{\textrm{dissipation}} + F . +\end{aligned}\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b) - (\partial_y a)(\partial_x b)$. On the right hand side, $F(x, y, t)$ is forcing (which is assumed to have zero zonal mean, $\overline{F} = 0$), $\mu$ is linear drag, and $\nu$ is hyperviscosity. Plain old viscosity corresponds to $n_{\nu} = 1$.

    Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta + \eta)}^{\textrm{QL}} + \beta \frac{i k_x}{|𝐤|^2} \widehat{\zeta} - \left ( \mu + \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x [ (\partial_y f) g]$. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.

    The linear operator is constructed in Equation

    GeophysicalFlows.BarotropicQGQL.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    Nonlinear term is computed via calcN! function.

    source

    and the nonlinear terms are computed via

    GeophysicalFlows.BarotropicQGQL.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, ζ + η)}^{\mathrm{QL}} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    The kinetic energy of the fluid is obtained via:

    while the enstrophy via:

    Other diagnostic include: dissipation, drag, and work.

    Examples

    • examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius $k_f$ in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.
    diff --git a/v0.16.1/modules/multilayerqg/index.html b/v0.16.1/modules/multilayerqg/index.html new file mode 100644 index 00000000..7bccb650 --- /dev/null +++ b/v0.16.1/modules/multilayerqg/index.html @@ -0,0 +1,27 @@ + +MultiLayerQG · GeophysicalFlows.jl

    MultiLayerQG

    Basic Equations

    This module solves the layered Boussinesq quasi-geostrophic equations on a beta plane of variable fluid depth $H - h(x, y)$. The flow in each layer is obtained through a streamfunction $\psi_j$ as $(u_j, v_j) = (-\partial_y \psi_j, \partial_x \psi_j)$, $j = 1, \dots, n$, where $n$ is the number of fluid layers.

    The QGPV in each layer is

    \[\mathrm{QGPV}_j = q_j + \underbrace{f_0 + \beta y}_{\textrm{planetary PV}} + \delta_{j, n} \underbrace{\frac{f_0 h}{H_n}}_{\textrm{topographic PV}}, \quad j = 1, \dots, n .\]

    where $q_j$ incorporates the relative vorticity in each layer $\nabla^2 \psi_j$ and the vortex stretching terms:

    \[\begin{aligned} +q_1 &= \nabla^2 \psi_1 + F_{3/2, 1} (\psi_2 - \psi_1) ,\\ +q_j &= \nabla^2 \psi_j + F_{j-1/2, j} (\psi_{j-1} - \psi_j) + F_{j+1/2, j} (\psi_{j+1} - \psi_j) , \quad j = 2, \dots, n-1 ,\\ +q_n &= \nabla^2 \psi_n + F_{n-1/2, n} (\psi_{n-1} - \psi_n) . +\end{aligned}\]

    with

    \[F_{j+1/2, k} = \frac{f_0^2}{g'_{j+1/2} H_k} \quad \text{and} \quad +g'_{j+1/2} = b_j - b_{j+1} ,\]

    where

    \[b_{j} = - g \frac{\delta \rho_j}{\rho_0}\]

    is the Boussinesq buoyancy in each layer, with $\rho = \rho_0 + \delta \rho$ the total density, $\rho_0$ a constant reference density, and $|\delta \rho| \ll \rho_0$ the perturbation density.

    In view of the relationships above, when we convert to Fourier space $q$'s and $\psi$'s are related via the matrix equation

    \[\begin{pmatrix} \widehat{q}_{𝐤, 1}\\\vdots\\\widehat{q}_{𝐤, n} \end{pmatrix} = +\underbrace{\left(-|𝐤|^2 \mathbb{1} + \mathbb{F} \right)}_{\equiv \mathbb{S}_{𝐤}} +\begin{pmatrix} \widehat{\psi}_{𝐤, 1}\\\vdots\\\widehat{\psi}_{𝐤, n} \end{pmatrix}\]

    where

    \[\mathbb{F} \equiv \begin{pmatrix} + -F_{3/2, 1} & F_{3/2, 1} & 0 & \cdots & 0\\ + F_{3/2, 2} & -(F_{3/2, 2}+F_{5/2, 2}) & F_{5/2, 2} & & \vdots\\ + 0 & \ddots & \ddots & \ddots & \\ + \vdots & & & & 0 \\ + 0 & \cdots & 0 & F_{n-1/2, n} & -F_{n-1/2, n} +\end{pmatrix} .\]

    Including an imposed zonal flow $U_j(y)$ in each layer, the equations of motion are:

    \[\partial_t q_j + \mathsf{J}(\psi_j, q_j ) + (U_j - \partial_y\psi_j) \partial_x Q_j + U_j \partial_x q_j + (\partial_y Q_j)(\partial_x \psi_j) = -\delta_{j, n} \mu \nabla^2 \psi_n - \nu (-1)^{n_\nu} \nabla^{2 n_\nu} q_j ,\]

    with

    \[\begin{aligned} +\partial_y Q_j &\equiv \beta - \partial_y^2 U_j - (1-\delta_{j,1}) F_{j-1/2, j} (U_{j-1} - U_j) - (1 - \delta_{j,n}) F_{j+1/2, j} (U_{j+1} - U_j) + \delta_{j,n} \partial_y \eta , \\ +\partial_x Q_j &\equiv \delta_{j, n} \partial_x \eta . +\end{aligned}\]

    Implementation

    Matrices $\mathbb{S}_{𝐤}$ as well as $\mathbb{S}^{-1}_{𝐤}$ are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients $\partial_x Q$ and $\partial_y Q$ are also included in the params as params.Qx and params.Qy.

    One can get the $\widehat{\psi}_j$ from $\widehat{q}_j$ via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain $\widehat{q}_j$ from $\widehat{\psi}_j$, is done via pvfromstreamfunction!(qh, psih, params, grid).

    The equations of motion are time-stepped forward in Fourier space:

    \[\partial_t \widehat{q}_j = - \widehat{\mathsf{J}(\psi_j, q_j)} - \widehat{U_j \partial_x Q_j} - \widehat{U_j \partial_x q_j} ++ \widehat{(\partial_y \psi_j) \partial_x Q_j} - \widehat{(\partial_x \psi_j)(\partial_y Q_j)} + \delta_{j, n} \mu |𝐤|^{2} \widehat{\psi}_n - \nu |𝐤|^{2n_\nu} \widehat{q}_j .\]

    In doing so the Jacobian is computed in the conservative form: $\mathsf{J}(f,g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The state variable sol consists of the Fourier transforms of $q_j$ at each layer, i.e., qh.

    The linear operator is constructed in Equation

    GeophysicalFlows.MultiLayerQG.EquationFunction
    Equation(params, grid)

    Return the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor $L$ includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).

    The nonlinear term is computed via function calcN!.

    source
    GeophysicalFlows.MultiLayerQG.hyperviscosityFunction
    hyperviscosity(params, grid)

    Return the linear operator L that corresponds to (hyper)-viscosity of order $n_ν$ with coefficient $ν$ for $n$ fluid layers.

    \[L_j = - ν |𝐤|^{2 n_ν}, \ j = 1, ...,n .\]

    source

    The nonlinear terms are computed via

    GeophysicalFlows.MultiLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Compute the nonlinear term, that is the advection term, the bottom drag, and the forcing:

    \[N_j = - \widehat{𝖩(ψ_j, q_j)} - \widehat{U_j ∂_x Q_j} - \widehat{U_j ∂_x q_j} + + \widehat{(∂_y ψ_j)(∂_x Q_j)} - \widehat{(∂_x ψ_j)(∂_y Q_j)} + δ_{j, n} μ |𝐤|^2 ψ̂_n + F̂_j .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Linearized MultiLayerQG dynamics

    The MultiLayerQG module includes also a linearized version of the dynamics about a base flow $U_j(y)$, $j = 1, \dots, n$; see LinearEquation, calcNlinear!, and calcN_linearadvection!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F=0$), vars can be constructed with DecayingVars. For the forced case ($F \ne 0$) the vars struct is with ForcedVars or StochasticForcedVars.

    Helper functions

    GeophysicalFlows.MultiLayerQG.set_ψ!Function
    set_ψ!(params, vars, grid, sol, ψ)
    +set_ψ!(prob, ψ)

    Set the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.

    source

    Diagnostics

    The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:

    GeophysicalFlows.MultiLayerQG.energiesFunction
    energies(vars, params, grid, sol)
    +energies(prob)

    Return the kinetic energy of each fluid layer KE$_1, ...,$ KE$_{n}$, and the potential energy of each fluid interface PE$_{3/2}, ...,$ PE$_{n-1/2}$, where $n$ is the number of layers in the fluid. (When $n=1$, only the kinetic energy is returned.)

    The kinetic energy at the $j$-th fluid layer is

    \[𝖪𝖤_j = \frac{H_j}{H} \int \frac1{2} |{\bf ∇} ψ_j|^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{H_j}{H} \sum_{𝐤} |𝐤|² |ψ̂_j|², \ j = 1, ..., n ,\]

    while the potential energy that corresponds to the interface $j+1/2$ (i.e., the interface between the $j$-th and $(j+1)$-th fluid layer) is

    \[𝖯𝖤_{j+1/2} = \int \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} (ψ_j - ψ_{j+1})^2 \frac{𝖽x 𝖽y}{L_x L_y} = \frac1{2} \frac{f₀^2}{g'_{j+1/2} H} \sum_{𝐤} |ψ̂_j - ψ̂_{j+1}|², \ j = 1, ..., n-1 .\]

    source

    The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:

    GeophysicalFlows.MultiLayerQG.fluxesFunction
    fluxes(vars, params, grid, sol)
    +fluxes(prob)

    Return the lateral eddy fluxes within each fluid layer, lateralfluxes$_1,...,$lateralfluxes$_n$ and also the vertical eddy fluxes at each fluid interface, verticalfluxes$_{3/2},...,$verticalfluxes$_{n-1/2}$, where $n$ is the total number of layers in the fluid. (When $n=1$, only the lateral fluxes are returned.)

    The lateral eddy fluxes within the $j$-th fluid layer are

    \[\textrm{lateralfluxes}_j = \frac{H_j}{H} \int U_j v_j ∂_y u_j +\frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n ,\]

    while the vertical eddy fluxes at the $j+1/2$-th fluid interface (i.e., interface between the $j$-th and $(j+1)$-th fluid layer) are

    \[\textrm{verticalfluxes}_{j+1/2} = \int \frac{f₀²}{g'_{j+1/2} H} (U_j - U_{j+1}) \, +v_{j+1} ψ_{j} \frac{𝖽x 𝖽y}{L_x L_y} , \ j = 1, ..., n-1.\]

    source

    Examples

    diff --git a/v0.16.1/modules/singlelayerqg/index.html b/v0.16.1/modules/singlelayerqg/index.html new file mode 100644 index 00000000..aa76ef5b --- /dev/null +++ b/v0.16.1/modules/singlelayerqg/index.html @@ -0,0 +1,6 @@ + +SingleLayerQG · GeophysicalFlows.jl

    SingleLayerQG

    Basic Equations

    This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth $H - h(x, y)$. The flow is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is

    \[ \underbrace{f_0 + \beta y}_{\text{planetary PV}} + \underbrace{\partial_x v + - \partial_y u}_{\text{relative vorticity}} + \underbrace{ - \frac{1}{\ell^2} \psi}_{\text{vortex stretching}} + + \underbrace{\frac{f_0 h}{H}}_{\text{topographic PV}} ,\]

    where $\ell$ is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation ($\ell = \infty$), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with $q \equiv \nabla^2 \psi - \psi / \ell^2$. Also, we denote the topographic PV with $\eta \equiv f_0 h / H$.

    The dynamical variable is $q$. Thus, the equation solved by the module is:

    \[\partial_t q + \mathsf{J}(\psi, q + \eta) + \beta \partial_x \psi = +\underbrace{-\left[\mu + \nu(-1)^{n_\nu} \nabla^{2n_\nu} \right] q}_{\textrm{dissipation}} + F .\]

    where $\mathsf{J}(a, b) = (\partial_x a)(\partial_y b)-(\partial_y a)(\partial_x b)$ is the two-dimensional Jacobian. On the right hand side, $F(x, y, t)$ is forcing, $\mu$ is linear drag, and $\nu$ is hyperviscosity of order $n_\nu$. Plain old viscosity corresponds to $n_\nu = 1$.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{q} = - \widehat{\mathsf{J}(\psi, q + \eta)} + \beta \frac{i k_x}{|𝐤|^2 + 1/\ell^2} \widehat{q} - \left(\mu + \nu |𝐤|^{2n_\nu} \right) \widehat{q} + \widehat{F} .\]

    The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] - \partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SingleLayerQG.EquationFunction
    Equation(params::BarotropicQGParams, grid)

    Return the equation for a barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = - μ - ν |𝐤|^{2 n_ν} + i β k_x / |𝐤|² .\]

    The nonlinear term is computed via calcN! function.

    source
    Equation(params::EquivalentBarotropicQGParams, grid)

    Return the equation for an equivalent-barotropic QG problem with params and grid. Linear operator $L$ includes bottom drag $μ$, (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and the $β$ term:

    \[L = -μ - ν |𝐤|^{2 n_ν} + i β k_x / (|𝐤|² + 1/ℓ²) .\]

    The nonlinear term is computed via calcN! function.

    source

    The nonlinear terms are computed via

    GeophysicalFlows.SingleLayerQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, q + η)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    The kinetic energy of the fluid is computed via:

    GeophysicalFlows.SingleLayerQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the problem's (prob) domain-averaged kinetic energy of the fluid. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    source

    while the potential energy, for an equivalent barotropic fluid, is computed via:

    GeophysicalFlows.SingleLayerQG.potential_energyFunction
    potential_energy(prob)

    Return the problem's (prob) domain-averaged potential energy of the fluid,

    \[\int \frac1{2} \frac{ψ²}{ℓ²} \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} \frac{|ψ̂|²}{ℓ²} .\]

    source

    The total energy is:

    GeophysicalFlows.SingleLayerQG.energyFunction
    energy(prob)

    Return the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.

    source

    Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.

    Examples

    diff --git a/v0.16.1/modules/surfaceqg/index.html b/v0.16.1/modules/surfaceqg/index.html new file mode 100644 index 00000000..77053f5b --- /dev/null +++ b/v0.16.1/modules/surfaceqg/index.html @@ -0,0 +1,2 @@ + +SurfaceQG · GeophysicalFlows.jl

    SurfaceQG

    Basic Equations

    This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy $b_s = b(x, y, z=0)$, as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction $\psi$ via:

    \[(u_s, v_s, b_s) = (-\partial_y \psi, \partial_x \psi, -\partial_z \psi) .\]

    The SQG model evolves the surface buoyancy,

    \[\partial_t b_s + \mathsf{J}(\psi, b_s) = \underbrace{-\nu(-1)^{n_\nu} \nabla^{2n_\nu} b_s}_{\textrm{buoyancy diffusion}} + \underbrace{F}_{\textrm{forcing}} .\]

    Above, $\mathsf{J}(\psi, b) = (\partial_x \psi)(\partial_y b) - (\partial_y \psi)(\partial_x b)$ is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but $b_s$ is a function of the vertical gradient of $\psi$. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,

    \[\underbrace{\left(\partial_x^2 + \partial_y^2 \right) \psi}_{\textrm{relative vorticity}} + \underbrace{\partial_z^2 \psi}_{\textrm{stretching term}} = 0 ,\]

    with the boundary conditions $b_s = - \partial_z \psi|_{z=0}$ and $\psi \rightarrow 0$ as $z \rightarrow -\infty$. (We take here the oceanographic convention: $z \le 0$.)

    These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal ($x$ and $y$), the streamfunction-buoyancy relation is:

    \[\widehat{\psi}(k_x, k_y, z, t) = - \frac{\widehat{b_s}}{|𝐤|} \, e^{|𝐤|z} , \]

    where $|𝐤| = \sqrt{k_x^2 + k_y^2}$ is the total horizontal wavenumber.

    Implementation

    The buoyancy equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{b_s} = - \widehat{\mathsf{J}(\psi, b_s)} - \nu |𝐤|^{2 n_\nu} \widehat{b_s} + \widehat{F} .\]

    The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(f, g) = \partial_y [ (\partial_x f) g] -\partial_x[ (\partial_y f) g]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.SurfaceQG.EquationFunction
    Equation(params, grid)

    Return the equation for surface QG dynamics with params and grid. The linear opeartor $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$,

    \[L = - ν |𝐤|^{2 n_ν} .\]

    Plain old viscocity corresponds to $n_ν=1$.

    The nonlinear term is computed via function calcN!().

    source

    while the nonlinear terms via

    GeophysicalFlows.SurfaceQG.calcN!Function
    calcN!(N, sol, t, clock, vars, params, grid)

    Calculate the nonlinear term, that is the advection term and the forcing,

    \[N = - \widehat{𝖩(ψ, b)} + F̂ .\]

    source

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Diagnostics

    Some useful diagnostics are kinetic energy and buoyancy variance.

    GeophysicalFlows.SurfaceQG.kinetic_energyFunction
    kinetic_energy(prob)

    Return the domain-averaged surface kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, we get

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² .\]

    In SQG, this is identical to half the domain-averaged surface buoyancy variance.

    source
    GeophysicalFlows.SurfaceQG.buoyancy_varianceFunction
    buoyancy_variance(prob)

    Return the buoyancy variance,

    \[\int b² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} |b̂|² .\]

    In SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).

    source

    Other diagnostic include: buoyancy_dissipation and buoyancy_work.

    Examples

    diff --git a/v0.16.1/modules/twodnavierstokes/index.html b/v0.16.1/modules/twodnavierstokes/index.html new file mode 100644 index 00000000..1a1a7a29 --- /dev/null +++ b/v0.16.1/modules/twodnavierstokes/index.html @@ -0,0 +1,4 @@ + +TwoDNavierStokes · GeophysicalFlows.jl

    TwoDNavierStokes

    Basic Equations

    This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow $\bm{u} = (u, v)$ is obtained through a streamfunction $\psi$ as $(u, v) = (-\partial_y \psi, \partial_x \psi)$. The only non-zero component of vorticity is that normal to the plane of motion, $\partial_x v - \partial_y u = \nabla^2 \psi$. The module solves the two-dimensional vorticity equation:

    \[\partial_t \zeta + \mathsf{J}(\psi, \zeta) = \underbrace{-\left [ \mu (-\nabla^2)^{n_\mu} ++ \nu (-\nabla^2)^{n_\nu} \right ] \zeta}_{\textrm{dissipation}} + F ,\]

    where $\mathsf{J}(\psi, \zeta) = (\partial_x \psi)(\partial_y \zeta) - (\partial_y \psi)(\partial_x \zeta)$ is the two-dimensional Jacobian and $F(x, y, t)$ is forcing. The Jacobian term is the advection of relative vorticity, $\mathsf{J}(ψ, ζ) = \bm{u \cdot \nabla} \zeta$. Both $ν$ and $μ$ terms are viscosities; typically the former is chosen to act at small scales ($n_ν ≥ 1$), while the latter at large scales ($n_ν ≤ 0$). Plain old viscocity corresponds to $n_ν=1$ while $n_μ=0$ corresponds to linear drag. Values of $n_ν ≥ 2$ or $n_μ ≤ -1$ are referred to as hyper- or hypo-viscosities, respectively.

    Implementation

    The equation is time-stepped forward in Fourier space:

    \[\partial_t \widehat{\zeta} = - \widehat{\mathsf{J}(\psi, \zeta)} - \left ( \mu |𝐤|^{2n_\mu} ++ \nu |𝐤|^{2n_\nu} \right ) \widehat{\zeta} + \widehat{F} .\]

    The state variable sol is the Fourier transform of vorticity, ζh.

    The Jacobian is computed in the conservative form: $\mathsf{J}(a, b) = \partial_y [(\partial_x a) b] - \partial_x[(\partial_y a) b]$.

    The linear operator is constructed in Equation

    GeophysicalFlows.TwoDNavierStokes.EquationFunction
    Equation(params, grid)

    Return the equation for two-dimensional Navier-Stokes with params and grid. The linear operator $L$ includes (hyper)-viscosity of order $n_ν$ with coefficient $ν$ and hypo-viscocity of order $n_μ$ with coefficient $μ$,

    \[L = - ν |𝐤|^{2 n_ν} - μ |𝐤|^{2 n_μ} .\]

    Plain-old viscocity corresponds to $n_ν = 1$ while $n_μ = 0$ corresponds to linear drag.

    The nonlinear term is computed via the function calcN!.

    source

    The nonlinear terms are computed via calcN!,

    which in turn calls calcN_advection! and addforcing!.

    Parameters and Variables

    All required parameters are included inside Params and all module variables are included inside Vars.

    For the decaying case (no forcing, $F = 0$), variables are constructed with Vars. For the forced case ($F \ne 0$) variables are constructed with either ForcedVars or StochasticForcedVars.

    Helper functions

    Some helper functions included in the module are:

    Diagnostics

    Some useful diagnostics are:

    GeophysicalFlows.TwoDNavierStokes.energyFunction
    energy(prob)

    Return the domain-averaged kinetic energy. Since $u² + v² = |{\bf ∇} ψ|²$, the domain-averaged kinetic energy is

    \[\int \frac1{2} |{\bf ∇} ψ|² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |𝐤|² |ψ̂|² ,\]

    where $ψ$ is the streamfunction.

    source
    GeophysicalFlows.TwoDNavierStokes.enstrophyFunction
    enstrophy(prob)

    Return the problem's (prob) domain-averaged enstrophy,

    \[\int \frac1{2} ζ² \frac{𝖽x 𝖽y}{L_x L_y} = \sum_{𝐤} \frac1{2} |ζ̂|² ,\]

    where $ζ$ is the relative vorticity.

    source

    Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.

    Examples

    diff --git a/v0.16.1/objects.inv b/v0.16.1/objects.inv new file mode 100644 index 00000000..a6c820d1 Binary files /dev/null and b/v0.16.1/objects.inv differ diff --git a/v0.16.1/references.bib b/v0.16.1/references.bib new file mode 100644 index 00000000..4007e7ac --- /dev/null +++ b/v0.16.1/references.bib @@ -0,0 +1,81 @@ +@article{Held-etal-1995, + title={Surface quasi-geostrophic dynamics}, + author={Held, Isaac M. and Pierrehumbert, Raymond T. and Garner, Stephen T. and Swanson, Kyle L.}, + journal={Journal of Fluid Mechanics}, + volume={282}, + pages={1--20}, + year={1995}, + doi={10.1017/S0022112095000012} +} + +@article{Capet-etal-2008, + title={Surface kinetic energy transfer in surface quasi-geostrophic flows}, + author={Capet, Xavier and Klein, Patrice and Hua, Bach Lien and Lapeyre, Guillaume and Mcwilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={604}, + pages={165--174}, + year={2008}, + doi={10.1017/S0022112008001110} +} + +@article{McWilliams-1984, + title={The emergence of isolated coherent vortices in turbulent flow}, + author={McWilliams, James C.}, + journal={Journal of Fluid Mechanics}, + volume={146}, + pages={21--43}, + year={1984}, + doi={10.1017/S0022112084001750} +} + +@article{Farrell-Ioannou-2003, + title = {Structural stability of turbulent jets}, + author = {Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + pages = {2101--2118}, + volume = 60, + year = 2003, + doi = {10.1175/1520-0469(2003)060<2101:SSOTJ>2.0.CO;2}, +} + +@article{Constantinou-etal-2014, + title = {Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory}, + author = {Constantinou, Navid C. and Farrell, Brian F. and Ioannou, Petros J.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {71}, + number = {5}, + pages = {1818--1842}, + year = {2014}, + doi = {10.1175/JAS-D-13-076.1}, +} + +@article{Srinivasan-Young-2012, + title = {Zonostrophic instability}, + author = {Srinivasan, Kaushik and Young, William R.}, + journal = {Journal of the Atmospheric Sciences}, + volume = {69}, + number = {5}, + pages = {1633--1656}, + year = {2012}, + doi = {10.1175/JAS-D-11-0200.1}, +} + +@article{vanKampen-1981, + title={Itô versus Stratonovich}, + author={Van Kampen, Nicolaas G}, + journal={Journal of Statistical Physics}, + volume={24}, + pages={175--187}, + year={1981}, + doi={10.1007/BF01007642} +} + +@phdthesis{Constantinou-2015-phd, + title = {Formation of large-scale structures by turbulence in rotating planets}, + author = {Constantinou, N. C.}, + school = {National and Kapodistrian University of Athens}, + address = {Athens}, + url = {http://www.didaktorika.gr/eadd/handle/10442/35501?locale=en}, + year = {2015}, + note = {(also available at arXiv:1503.07644)} +} diff --git a/v0.16.1/references/index.html b/v0.16.1/references/index.html new file mode 100644 index 00000000..f4a34358 --- /dev/null +++ b/v0.16.1/references/index.html @@ -0,0 +1,2 @@ + +References · GeophysicalFlows.jl

    References

    diff --git a/v0.16.1/search_index.js b/v0.16.1/search_index.js new file mode 100644 index 00000000..98ce30fa --- /dev/null +++ b/v0.16.1/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_decaying.jl\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#twodnavierstokes_decaying_example","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"A simulation of decaying two-dimensional turbulence closely following the paper by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Install-dependencies","page":"2D decaying turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Let's-begin","page":"2D decaying turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing Random: seed!\nusing GeophysicalFlows: peakedisotropicspectrum","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Choosing-a-device:-CPU-or-GPU","page":"2D decaying turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Numerical,-domain,-and-simulation-parameters","page":"2D decaying turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"n, L = 128, 2π # grid resolution and domain length","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Then we pick the time-stepper parameters","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":" dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Problem-setup","page":"2D decaying turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ny=n, Ly=L, dt, stepper=\"FilteredRK4\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Next we define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"sol, clock, vars, grid = prob.sol, prob.clock, prob.vars, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Setting-initial-conditions","page":"2D decaying turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Our initial condition tries to reproduce the initial condition used by McWilliams (1984).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\nζ₀ = peakedisotropicspectrum(grid, k₀, E₀, mask=prob.timestepper.filter)\nTwoDNavierStokes.set_ζ!(prob, ζ₀)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Let's plot the initial vorticity field. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"fig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ');\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Diagnostics","page":"2D decaying turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps)\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Output","page":"2D decaying turbulence","title":"Output","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingTwoDNavierStokes\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingTwoDNavierStokes.jld2\")","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"Do some basic file management","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"And then create Output","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* prob.grid.invKrsq .* prob.sol, prob.grid.nx)\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))\nsaveproblem(out)","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Visualizing-the-simulation","page":"2D decaying turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, t=\" * @sprintf(\"%.2f\", clock.t))\n\nenergy = Observable(Point2f[(E.t[1], E.data[1] / E.data[1])])\nenstrophy = Observable(Point2f[(Z.t[1], Z.data[1] / Z.data[1])])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"t\",\n limits = ((-0.5, 40.5), (0, 1.05)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"E(t)/E(0)\", \"Z(t)/Z(0)\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Time-stepping-the-Problem-forward","page":"2D decaying turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, ΔE: %.4f, ΔZ: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i]/E.data[1], Z.data[Z.i]/Z.data[1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(E.t[E.i], E.data[E.i] / E.data[1]))\n enstrophy[] = push!(enstrophy[], Point2f(Z.t[E.i], Z.data[Z.i] / Z.data[1]))\n\n title_ζ[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"step: 0000, t: 0, cfl: 0.53, ΔE: 1.0000, ΔZ: 1.0000, walltime: 0.02 min\nstep: 1000, t: 10, cfl: 0.44, ΔE: 0.9633, ΔZ: 0.1954, walltime: 0.10 min\nstep: 2000, t: 20, cfl: 0.60, ΔE: 0.9593, ΔZ: 0.1088, walltime: 0.14 min\nstep: 3000, t: 30, cfl: 0.55, ΔE: 0.9577, ΔZ: 0.0762, walltime: 0.18 min\nstep: 4000, t: 40, cfl: 0.49, ΔE: 0.9571, ΔZ: 0.0627, walltime: 0.22 min\n","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/#Radial-energy-spectrum","page":"2D decaying turbulence","title":"Radial energy spectrum","text":"","category":"section"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"After the simulation is done we plot the instantaneous radial energy spectrum to illustrate how FourierFlows.radialspectrum can be used,","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"E = @. 0.5 * (vars.u^2 + vars.v^2) # energy density\nEh = rfft(E) # Fourier transform of energy density\n\n# compute radial specturm of `Eh`\nkr, Ehr = FourierFlows.radialspectrum(Eh, grid, refinement = 1)","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"and we plot it.","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"lines(kr, vec(abs.(Ehr));\n linewidth = 2,\n axis = (xlabel = L\"k_r\",\n ylabel = L\"\\int |\\hat{E}| k_r \\mathrm{d}k_\\theta\",\n xscale = log10,\n yscale = log10,\n title = \"Radial energy spectrum\",\n limits = ((0.3, 1e2), (1e0, 1e5))))","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_decaying/","page":"2D decaying turbulence","title":"2D decaying turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"Capet, X.; Klein, P.; Hua, B. L.; Lapeyre, G. and Mcwilliams, J. C. (2008). Surface kinetic energy transfer in surface quasi-geostrophic flows. Journal of Fluid Mechanics 604, 165–174.\n\n\n\nConstantinou, N. C. (2015). Formation of large-scale structures by turbulence in rotating planets. Ph.D. Thesis, National and Kapodistrian University of Athens (Athens) (also available at arXiv:1503.07644).\n\n\n\nConstantinou, N. C.; Farrell, B. F. and Ioannou, P. J. (2014). Emergence and equilibration of jets in beta-plane turbulence: applications of Stochastic Structural Stability Theory. Journal of the Atmospheric Sciences 71, 1818–1842.\n\n\n\nFarrell, B. F. and Ioannou, P. J. (2003). Structural stability of turbulent jets. Journal of the Atmospheric Sciences 60, 2101–2118.\n\n\n\nHeld, I. M.; Pierrehumbert, R. T.; Garner, S. T. and Swanson, K. L. (1995). Surface quasi-geostrophic dynamics. Journal of Fluid Mechanics 282, 1–20.\n\n\n\nMcWilliams, J. C. (1984). The emergence of isolated coherent vortices in turbulent flow. Journal of Fluid Mechanics 146, 21–43.\n\n\n\nSrinivasan, K. and Young, W. R. (2012). Zonostrophic instability. Journal of the Atmospheric Sciences 69, 1633–1656.\n\n\n\nVan Kampen, N. G. (1981). Itô versus Stratonovich. Journal of Statistical Physics 24, 175–187.\n\n\n\n","category":"page"},{"location":"modules/multilayerqg/#MultiLayerQG","page":"MultiLayerQG","title":"MultiLayerQG","text":"","category":"section"},{"location":"modules/multilayerqg/#Basic-Equations","page":"MultiLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"This module solves the layered Boussinesq quasi-geostrophic equations on a beta plane of variable fluid depth H - h(x y). The flow in each layer is obtained through a streamfunction psi_j as (u_j v_j) = (-partial_y psi_j partial_x psi_j), j = 1 dots n, where n is the number of fluid layers.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The QGPV in each layer is","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathrmQGPV_j = q_j + underbracef_0 + beta y_textrmplanetary PV + delta_j n underbracefracf_0 hH_n_textrmtopographic PV quad j = 1 dots n ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where q_j incorporates the relative vorticity in each layer nabla^2 psi_j and the vortex stretching terms:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\nq_1 = nabla^2 psi_1 + F_32 1 (psi_2 - psi_1) \nq_j = nabla^2 psi_j + F_j-12 j (psi_j-1 - psi_j) + F_j+12 j (psi_j+1 - psi_j) quad j = 2 dots n-1 \nq_n = nabla^2 psi_n + F_n-12 n (psi_n-1 - psi_n) \nendaligned","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"F_j+12 k = fracf_0^2g_j+12 H_k quad textand quad\ng_j+12 = b_j - b_j+1 ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"b_j = - g fracdelta rho_jrho_0","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"is the Boussinesq buoyancy in each layer, with rho = rho_0 + delta rho the total density, rho_0 a constant reference density, and delta rho ll rho_0 the perturbation density.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In view of the relationships above, when we convert to Fourier space q's and psi's are related via the matrix equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginpmatrix widehatq_𝐤 1vdotswidehatq_𝐤 n endpmatrix =\nunderbraceleft(-𝐤^2 mathbb1 + mathbbF right)_equiv mathbbS_𝐤\nbeginpmatrix widehatpsi_𝐤 1vdotswidehatpsi_𝐤 n endpmatrix","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"where","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"mathbbF equiv beginpmatrix\n -F_32 1 F_32 1 0 cdots 0\n F_32 2 -(F_32 2+F_52 2) F_52 2 vdots\n 0 ddots ddots ddots \n vdots 0 \n 0 cdots 0 F_n-12 n -F_n-12 n\nendpmatrix ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Including an imposed zonal flow U_j(y) in each layer, the equations of motion are:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t q_j + mathsfJ(psi_j q_j ) + (U_j - partial_ypsi_j) partial_x Q_j + U_j partial_x q_j + (partial_y Q_j)(partial_x psi_j) = -delta_j n mu nabla^2 psi_n - nu (-1)^n_nu nabla^2 n_nu q_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"with","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"beginaligned\npartial_y Q_j equiv beta - partial_y^2 U_j - (1-delta_j1) F_j-12 j (U_j-1 - U_j) - (1 - delta_jn) F_j+12 j (U_j+1 - U_j) + delta_jn partial_y eta \npartial_x Q_j equiv delta_j n partial_x eta \nendaligned","category":"page"},{"location":"modules/multilayerqg/#Implementation","page":"MultiLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"Matrices mathbbS_𝐤 as well as mathbbS^-1_𝐤 are included in params as params.S and params.S⁻¹ respectively. Additionally, the background PV gradients partial_x Q and partial_y Q are also included in the params as params.Qx and params.Qy.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"One can get the widehatpsi_j from widehatq_j via streamfunctionfrompv!(psih, qh, params, grid), while the inverse, i.e. obtain widehatq_j from widehatpsi_j, is done via pvfromstreamfunction!(qh, psih, params, grid).","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The equations of motion are time-stepped forward in Fourier space:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"partial_t widehatq_j = - widehatmathsfJ(psi_j q_j) - widehatU_j partial_x Q_j - widehatU_j partial_x q_j\n+ widehat(partial_y psi_j) partial_x Q_j - widehat(partial_x psi_j)(partial_y Q_j) + delta_j n mu 𝐤^2 widehatpsi_n - nu 𝐤^2n_nu widehatq_j ","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"In doing so the Jacobian is computed in the conservative form: mathsfJ(fg) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The state variable sol consists of the Fourier transforms of q_j at each layer, i.e., qh.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.Equation\nGeophysicalFlows.MultiLayerQG.hyperviscosity","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.Equation","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.hyperviscosity","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.hyperviscosity","text":"hyperviscosity(params, grid)\n\nReturn the linear operator L that corresponds to (hyper)-viscosity of order n_ν with coefficient ν for n fluid layers.\n\nL_j = - ν 𝐤^2 n_ν j = 1 n \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.calcN!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.calcN!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term, that is the advection term, the bottom drag, and the forcing:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"tip: Linearized MultiLayerQG dynamics\nThe MultiLayerQG module includes also a linearized version of the dynamics about a base flow U_j(y), j = 1 dots n; see LinearEquation, calcNlinear!, and calcN_linearadvection!.","category":"page"},{"location":"modules/multilayerqg/#Parameters-and-Variables","page":"MultiLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"For the decaying case (no forcing, F=0), vars can be constructed with DecayingVars. For the forced case (F ne 0) the vars struct is with ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/multilayerqg/#Helper-functions","page":"MultiLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.set_q!\nGeophysicalFlows.MultiLayerQG.set_ψ!\nGeophysicalFlows.MultiLayerQG.updatevars!","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_q!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_q!","text":"set_q!(sol, params, vars, grid, q)\nset_q!(prob, q)\n\nSet the solution prob.sol as the transform of q and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.set_ψ!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.set_ψ!","text":"set_ψ!(params, vars, grid, sol, ψ)\nset_ψ!(prob, ψ)\n\nSet the solution prob.sol to the transform qh that corresponds to streamfunction ψ and update variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.updatevars!","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.updatevars!","text":"updatevars!(vars, params, grid, sol)\nupdatevars!(prob)\n\nUpdate all problem variables using sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Diagnostics","page":"MultiLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The eddy kinetic energy in each layer and the eddy potential energy that corresponds to each fluid interface is computed via energies:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.energies","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.energies","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.energies","text":"energies(vars, params, grid, sol)\nenergies(prob)\n\nReturn the kinetic energy of each fluid layer KE_1 KE_n, and the potential energy of each fluid interface PE_32 PE_n-12, where n is the number of layers in the fluid. (When n=1, only the kinetic energy is returned.)\n\nThe kinetic energy at the j-th fluid layer is\n\n𝖪𝖤_j = fracH_jH int frac12 bf ψ_j^2 frac𝖽x 𝖽yL_x L_y = frac12 fracH_jH sum_𝐤 𝐤² ψ_j² j = 1 n \n\nwhile the potential energy that corresponds to the interface j+12 (i.e., the interface between the j-th and (j+1)-th fluid layer) is\n\n𝖯𝖤_j+12 = int frac12 fracf₀^2g_j+12 H (ψ_j - ψ_j+1)^2 frac𝖽x 𝖽yL_x L_y = frac12 fracf₀^2g_j+12 H sum_𝐤 ψ_j - ψ_j+1² j = 1 n-1 \n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"The lateral eddy fluxes in each layer and the vertical fluxes across fluid interfaces are computed via fluxes:","category":"page"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"GeophysicalFlows.MultiLayerQG.fluxes","category":"page"},{"location":"modules/multilayerqg/#GeophysicalFlows.MultiLayerQG.fluxes","page":"MultiLayerQG","title":"GeophysicalFlows.MultiLayerQG.fluxes","text":"fluxes(vars, params, grid, sol)\nfluxes(prob)\n\nReturn the lateral eddy fluxes within each fluid layer, lateralfluxes_1lateralfluxes_n and also the vertical eddy fluxes at each fluid interface, verticalfluxes_32verticalfluxes_n-12, where n is the total number of layers in the fluid. (When n=1, only the lateral fluxes are returned.)\n\nThe lateral eddy fluxes within the j-th fluid layer are\n\ntextrmlateralfluxes_j = fracH_jH int U_j v_j _y u_j\nfrac𝖽x 𝖽yL_x L_y j = 1 n \n\nwhile the vertical eddy fluxes at the j+12-th fluid interface (i.e., interface between the j-th and (j+1)-th fluid layer) are\n\ntextrmverticalfluxes_j+12 = int fracf₀²g_j+12 H (U_j - U_j+1) \nv_j+1 ψ_j frac𝖽x 𝖽yL_x L_y j = 1 n-1\n\n\n\n\n\n","category":"function"},{"location":"modules/multilayerqg/#Examples","page":"MultiLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/multilayerqg/","page":"MultiLayerQG","title":"MultiLayerQG","text":"examples/multilayerqg_2layer.jl: Simulate the growth and equilibration of baroclinic eddy turbulence in the Phillips 2-layer model.","category":"page"},{"location":"modules/surfaceqg/#SurfaceQG","page":"SurfaceQG","title":"SurfaceQG","text":"","category":"section"},{"location":"modules/surfaceqg/#Basic-Equations","page":"SurfaceQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"This module solves the non-dimensional surface quasi-geostrophic (SQG) equation for surface buoyancy b_s = b(x y z=0), as described by Capet et al. (2008). The buoyancy and the fluid velocity at the surface are related through a streamfunction psi via:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"(u_s v_s b_s) = (-partial_y psi partial_x psi -partial_z psi) ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The SQG model evolves the surface buoyancy,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t b_s + mathsfJ(psi b_s) = underbrace-nu(-1)^n_nu nabla^2n_nu b_s_textrmbuoyancy diffusion + underbraceF_textrmforcing ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Above, mathsfJ(psi b) = (partial_x psi)(partial_y b) - (partial_y psi)(partial_x b) is the two-dimensional Jacobian. The evolution of buoyancy is only solved for the surface layer, but b_s is a function of the vertical gradient of psi. In the SQG system, the potential vorticity in the interior of the flow is identically zero. That is, relative vorticity is equal and opposite to the vertical stretching of the buoyancy layers,","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"underbraceleft(partial_x^2 + partial_y^2 right) psi_textrmrelative vorticity + underbracepartial_z^2 psi_textrmstretching term = 0 ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"with the boundary conditions b_s = - partial_z psi_z=0 and psi rightarrow 0 as z rightarrow -infty. (We take here the oceanographic convention: z le 0.)","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"These equations describe a system where the streamfunction (and hence the dynamics) at all depths is prescribed entirely by the surface buoyancy. By taking the Fourier transform in the horizontal (x and y), the streamfunction-buoyancy relation is:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"widehatpsi(k_x k_y z t) = - fracwidehatb_s𝐤 e^𝐤z ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"where 𝐤 = sqrtk_x^2 + k_y^2 is the total horizontal wavenumber.","category":"page"},{"location":"modules/surfaceqg/#Implementation","page":"SurfaceQG","title":"Implementation","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The buoyancy equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"partial_t widehatb_s = - widehatmathsfJ(psi b_s) - nu 𝐤^2 n_nu widehatb_s + widehatF ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The surface buoyancy is b. The state variable sol is the Fourier transform of the surface buoyancy, bh.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g -partial_x (partial_y f) g.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.Equation","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.Equation","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.Equation","text":"Equation(params, grid)\n\nReturn the equation for surface QG dynamics with params and grid. The linear opeartor L includes (hyper)-viscosity of order n_ν with coefficient ν,\n\nL = - ν 𝐤^2 n_ν \n\nPlain old viscocity corresponds to n_ν=1.\n\nThe nonlinear term is computed via function calcN!().\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"while the nonlinear terms via ","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.calcN!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.calcN!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ b) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/surfaceqg/#Parameters-and-Variables","page":"SurfaceQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/surfaceqg/#Helper-functions","page":"SurfaceQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.updatevars!\nGeophysicalFlows.SurfaceQG.set_b!","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.updatevars!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.updatevars!","text":"updatevars!(prob)\n\nUpdate variables in vars with solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.set_b!","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.set_b!","text":"set_b!(prob, b)\n\nSet the solution sol as the transform of b and update all variables.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#Diagnostics","page":"SurfaceQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Some useful diagnostics are kinetic energy and buoyancy variance.","category":"page"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"GeophysicalFlows.SurfaceQG.kinetic_energy\nGeophysicalFlows.SurfaceQG.buoyancy_variance","category":"page"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.kinetic_energy","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the domain-averaged surface kinetic energy. Since u² + v² = bf ψ², we get\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nIn SQG, this is identical to half the domain-averaged surface buoyancy variance.\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/#GeophysicalFlows.SurfaceQG.buoyancy_variance","page":"SurfaceQG","title":"GeophysicalFlows.SurfaceQG.buoyancy_variance","text":"buoyancy_variance(prob)\n\nReturn the buoyancy variance,\n\nint b² frac𝖽x 𝖽yL_x L_y = sum_𝐤 b² \n\nIn SQG, this is identical to the velocity variance (i.e., twice the domain-averaged kinetic energy).\n\n\n\n\n\n","category":"function"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"Other diagnostic include: buoyancy_dissipation and buoyancy_work.","category":"page"},{"location":"modules/surfaceqg/#Examples","page":"SurfaceQG","title":"Examples","text":"","category":"section"},{"location":"modules/surfaceqg/","page":"SurfaceQG","title":"SurfaceQG","text":"examples/surfaceqg_decaying.jl: Simulate decaying surface quasi-geostrophic flow with a prescribed initial buoyancy field.","category":"page"},{"location":"contributing/#Contributors'-Guide","page":"Contributor's guide","title":"Contributors' Guide","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This is a short guide for potential GeophysicalFlows.jl contributors.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Please feel free to ask us questions and chat, either by raising an issue or starting a discussion.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We follow the ColPrac guide for collaborative practices. New contributors should make sure to read that guide.","category":"page"},{"location":"contributing/#What-can-I-do?","page":"Contributor's guide","title":"What can I do?","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Tackle an existing issue.\nTry to run your favorite GeophysicalFlows.jl module and play around with it to simulate your favorite setup. If you run into any problems or find it difficult to use, modify, or understand, please open an issue!\nWrite up an example or tutorial on how to do something useful with one of the current modules in GeophysicalFlows.jl, like how to set up a new physical configuration.\nImprove documentation, docstrings, or comments if you found something is hard to use.\nImplement a new feature (e.g., a new diagnostic into a module).\nImplement a new module from scratch to solve your favorite partial differential equation with periodic boundary conditions.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"If you're interested in working on something, let us know by commenting on an existing issue or by opening a new issue. This is to make sure no one else is working on the same issue and so we can help and guide you in case there is anything you need to know beforehand.","category":"page"},{"location":"contributing/#Ground-Rules","page":"Contributor's guide","title":"Ground Rules","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Each pull request should consist of a logical collection of changes. You can include multiple bug fixes in a single pull request, but they should be related. For unrelated changes, please submit multiple pull requests.\nDo not commit changes to files that are irrelevant to your feature or bugfix (e.g., .gitignore).\nBe willing to accept criticism and work on improving your code; we don't want to break other users' code, so care must be taken not to introduce bugs. We discuss pull requests and keep working on them until we believe we've done a good job.\nBe aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.","category":"page"},{"location":"contributing/#Reporting-a-bug","page":"Contributor's guide","title":"Reporting a bug","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"The easiest way to get involved is to report issues you encounter when using GeophysicalFlows.jl or by requesting something you think is missing.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Head over to the issues page.\nSearch to see if your issue already exists or has even been solved previously.\nIf you indeed have a new issue or request, click the \"New Issue\" button.\nPlease be as specific as possible. Include the version of the code you were using, as well as what operating system you are running. The output of Julia's versioninfo() and ] status is helpful to include. If possible, include complete, minimal example code that reproduces the problem.","category":"page"},{"location":"contributing/#Setting-up-your-development-environment","page":"Contributor's guide","title":"Setting up your development environment","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Install Julia on your system.\nInstall git on your system if it is not already there (install XCode command line tools on a Mac or git bash on Windows).\nLogin to your GitHub account and make a fork of the GeophysicalFlows.jl repository by clicking the \"Fork\" button.\nClone your fork of the GeophysicalFlows.jl repository (in terminal on Mac/Linux or git shell/ GUI on Windows) in the location you'd like to keep it.\ngit clone https://github.com/your-user-name/GeophysicalFlows.jl.git\nNavigate to that folder in the terminal or in Anaconda Prompt if you're on Windows.\nConnect your repository to the upstream (main project).\ngit remote add geophysicalflows https://github.com/FourierFlows/GeophysicalFlows.jl.git\nCreate the development environment by opening Julia via julia --project then typing in ] instantiate. This will install all the dependencies in the Project.toml file.\nYou can test to make sure GeophysicalFlows.jl works by typing in ] test which will run all the tests (this can take a while). In an ideal world you should run the tests on a machine with a GPU capability but if that's not a possibility that is available to you then don't worry – simply comment in a PR that you didn't test on GPU.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Your development environment is now ready!","category":"page"},{"location":"contributing/#Pull-Requests","page":"Contributor's guide","title":"Pull Requests","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Changes and contributions should be made via GitHub pull requests against the main branch.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you're done making changes, commit the changes you made. Chris Beams has written a guide on how to write good commit messages.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"When you think your changes are ready to be merged into the main repository, push to your fork and submit a pull request.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"Working on your first Pull Request? You can learn how from this free video series How to Contribute to an Open Source Project on GitHub, Aaron Meurer's tutorial on the git workflow, or the guide “How to Contribute to Open Source\".","category":"page"},{"location":"contributing/#Documentation","page":"Contributor's guide","title":"Documentation","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"All PRs that introduce new features or new modules should be accompanied with appropriate docstrings and documentation. Writing documentation strings is really important to make sure others use your functionality properly. Didn't write new functions? That's fine, but be sure that the documentation for the code you touched is still in great shape. It is not uncommon to find some strange wording or clarification that you can take care of while you are here.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"We encourage using unicode characters when writing docstrings, e.g., use α instead of \\alpha. This makes the rendering of the docstrings in the Documentation and in the Julia REPL's help?> mode as similar as possible.","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"You can preview how the Documentation will look like after merging by building the documentation locally. To do that, from the main directory of your local repository call","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs/ docs/make.jl","category":"page"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"and then open docs/build/index.html in your favorite browser.","category":"page"},{"location":"contributing/#Credits","page":"Contributor's guide","title":"Credits","text":"","category":"section"},{"location":"contributing/","page":"Contributor's guide","title":"Contributor's guide","text":"This contributor's guide is heavily based on the MetPy contributor's guide and on its \"cover\" made by Oceananigans.jl.","category":"page"},{"location":"aliasing/#Aliasing","page":"Aliasing","title":"Aliasing","text":"","category":"section"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"In pseudospectral methods, computing nonlinear terms results in aliasing errors. (Read more about aliasing errors in the FourierFlows.jl Documentation.) To avoid aliasing errors, we need to apply some dealiasing to our fields in Fourier space before transforming to physical space to compute nonlinear terms.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"info: De-aliasing scheme\nFourierFlows.jl currently implements dealiasing by zeroing out the highest-aliased_fraction wavenumber components on a grid. By default in FourierFlows.jl, aliased_fraction=1/3. Users can construct a grid with different aliased_fraction viajulia> grid = OneDGrid(; nx=64, Lx=2π, aliased_fraction=1/2)\n\njulia> OneDimensionalGrid\n ├─────────── Device: CPU\n ├──────── FloatType: Float64\n ├────────── size Lx: 6.283185307179586\n ├──── resolution nx: 64\n ├── grid spacing dx: 0.09817477042468103\n ├─────────── domain: x ∈ [-3.141592653589793, 3.0434178831651124]\n └─ aliased fraction: 0.5or provide the keyword argument aliased_fraction to the Problem() constructor of each module, e.g.,julia> prob = GeophysicalFlows.TwoDNavierStokes.Problem(; aliased_fraction=1/2)\nProblem\n ├─────────── grid: grid (on CPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper\n \njulia> prob.grid.aliased_fraction\n0.5","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"Currently, all nonlinearities in all modules included in GeophysicalFlows.jl modules are quadratic nonlinearities. Therefore, the default aliased_fraction of 1/3 is appropriate.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"All modules apply de-aliasing by calling, e.g., dealias!(prob.sol, prob.grid) both before computing any nonlinear terms and also during updating all variable, i.e., within updatevars!.","category":"page"},{"location":"aliasing/","page":"Aliasing","title":"Aliasing","text":"To disable de-aliasing you need to create a problem with a grid that has been constructed with the keyword aliased_fraction=0.","category":"page"},{"location":"installation_instructions/#Installation-instructions","page":"Installation instructions","title":"Installation instructions","text":"","category":"section"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"You can install the latest version of GeophysicalFlows.jl via the built-in package manager (accessed by pressing ] in the Julia REPL command prompt) to add the package and also to instantiate/build all the required dependencies","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"julia> ]\n(v1.6) pkg> add GeophysicalFlows\n(v1.6) pkg> instantiate","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"We recommend installing GeophysicalFlows.jl with the built-in Julia package manager, because this installs a stable, tagged release. Later on, you can update GeophysicalFlows.jl to the latest tagged release again via the package manager by typing","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"(v1.6) pkg> update GeophysicalFlows","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"Note that some releases might induce breaking changes to certain modules. If after anything happens or your code stops working, please open an issue or start a discussion. We're more than happy to help with getting your simulations up and running.","category":"page"},{"location":"installation_instructions/","page":"Installation instructions","title":"Installation instructions","text":"warn: Use Julia 1.6 or newer\nThe latest GeophysicalFlows.jl requires at least Julia v1.6 to run. Installing GeophysicalFlows with an older version of Julia will install an older version of GeophysicalFlows.jl (the latest version compatible with your version of Julia).Last version compatible with Julia v1.5: GeophysicalFlows.jl v0.13.1","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/barotropicqgql_betaforced.jl\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#barotropicqgql_betaforced_example","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane under the quasi-linear approximation. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Install-dependencies","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Let's-begin","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nusing Statistics: mean\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution = n^2\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Physical-parameters","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Forcing","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Problem-setup","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"prob = BarotropicQGQL.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true, aliased_fraction=0)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and define some shortcuts.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Setting-initial-conditions","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"BarotropicQGQL.set_zeta!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Diagnostics","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(BarotropicQGQL.energy, prob; nsteps)\nZ = Diagnostic(BarotropicQGQL.enstrophy, prob; nsteps)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We can also define our custom diagnostics via functions.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"zetaMean(prob) = prob.sol[1, :]\n\nzMean = Diagnostic(zetaMean, prob; nsteps, freq=10) # the zonal-mean vorticity","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We combile all diags in a list.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"diags = [E, Z, zMean] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Output","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaQLturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"forcedbetaQLturb.jld2\")","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n grid, vars = prob.grid, prob.vars\n\n @. vars.uh = im * grid.l * grid.invKrsq * sol\n ldiv!(vars.u, grid.rfftplan, deepcopy(vars.uh))\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Output\n ├──── prob: FourierFlows.Problem{DataType, Matrix{ComplexF64}, Float64, Matrix{ComplexF64}}\n ├──── path: ./forcedbetaQLturb.jld2\n └── fields: Dict{Symbol, Function}(:sol => Main.var\"##246\".get_sol, :u => Main.var\"##246\".get_u)","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Visualizing-the-simulation","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We define a function that plots the vorticity and streamfunction fields, the corresponding zonal-mean vorticity and zonal-mean zonal velocity and timeseries of energy and enstrophy.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"title_ζ = Observable(@sprintf(\"vorticity, μt = %.2f\", μ * clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxζ = Axis(fig[1, 1]; title = title_ζ, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxζ̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean ζ\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.05)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 5)))\n\nζ̄, ζ′= prob.vars.Zeta, prob.vars.zeta\nζ = Observable(Array(@. ζ̄ + ζ′))\nψ̄, ψ′= prob.vars.Psi, prob.vars.psi\nψ = Observable(Array(@. ψ̄ + ψ′))\nζ̄ₘ = Observable(Array(vec(mean(ζ̄, dims=1))))\nūₘ = Observable(Array(vec(mean(prob.vars.U, dims=1))))\n\nμt = Observable(μ * E.t[1:1])\nenergy = Observable(E.data[1:1])\nenstrophy = Observable(Z.data[1:1])\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-8, 8))\n\nheatmap!(axψ, x, y, ψ;\n colormap = :viridis, colorrange = (-0.22, 0.22))\n\nlines!(axζ̄, ζ̄ₘ, y; linewidth = 3)\nlines!(axζ̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, μt, energy; linewidth = 3)\nlines!(axZ, μt, enstrophy; linewidth = 3, color = :red)\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Time-stepping-the-Problem-forward","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"barotropicqgql_betaforced.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u .+ vars.U) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i],\n (time()-startwalltime)/60)\n\n println(log)\n end\n\n ζ[] = @. ζ̄ + ζ′\n ψ[] = @. ψ̄ + ψ′\n ζ̄ₘ[] = vec(mean(ζ̄, dims=1))\n ūₘ[] = vec(mean(prob.vars.U, dims=1))\n\n μt.val = μ * E.t[1:E.i]\n energy[] = E.data[1:E.i]\n enstrophy[] = Z.data[1:E.i]\n\n title_ζ[] = @sprintf(\"vorticity, μt = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n BarotropicQGQL.updatevars!(prob)\nend","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0319, Q: 4.6924, walltime: 0.13 min\nstep: 2000, t: 100, cfl: 0.81, E: 0.0410, Q: 4.1952, walltime: 0.23 min\nstep: 3000, t: 150, cfl: 0.80, E: 0.0453, Q: 4.0640, walltime: 0.33 min\nstep: 4000, t: 200, cfl: 0.96, E: 0.0458, Q: 4.1056, walltime: 0.44 min\nstep: 5000, t: 250, cfl: 0.87, E: 0.0474, Q: 4.3665, walltime: 0.55 min\nstep: 6000, t: 300, cfl: 0.79, E: 0.0495, Q: 4.6566, walltime: 0.67 min\nstep: 7000, t: 350, cfl: 0.79, E: 0.0484, Q: 4.2472, walltime: 0.80 min\nstep: 8000, t: 400, cfl: 0.92, E: 0.0479, Q: 3.8324, walltime: 0.93 min\n","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/barotropicqgql_betaforced/#Save","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/barotropicqgql_betaforced/","page":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","title":"Quasi-Linear forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Forcing","page":"Stochastic forcing","title":"Stochastic Forcing","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"note: Itô or Stratonovich in GeophysicalFlows.jl?\nAll modules included in GeophysicalFlows.jl use Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus \"works the same\" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really \"care\" whether the user implement deterministic or stochastic forcing.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.","category":"page"},{"location":"stochastic_forcing/#Stochastic-Differential-Equations-(SDEs)","page":"Stochastic forcing","title":"Stochastic Differential Equations (SDEs)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A differential equation:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tfracmathrmd xmathrmd t = f(x) quad x(t_0) = 0","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"can also be equivalently written in an integral form:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"In a similar manner, a stochastic differential equation (SDE),","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tmathrmd x = f(x) mathrmd t + g(x) mathrmd W_t quad x(t_0) = 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with W_t a Brownian motion or Wiener process, can be written in an integral form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx(t) = int_t_0^t f(x(s)) mathrmd s + int_t_0^t g(x(s)) mathrmd W_s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Wiener process\nA Wiener process is a random variable W_t that depends continuously on t ge 0 and satisfies the following properties:Independence. For 0 le s le t the increment W_t - W_s is independent of any prior values, i.e., independent of all W_tau, tau le s.\nStationarity. The statistical distribution of the increment W_t+s W_s does not depend on s (and so is identical in distribution to W_t).\nGaussianity. W_t is a Gaussian process with mean langle W_t rangle = 0 and covariance langle W_t W_s rangle = min(t s).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"tip: Notation\nIt's common to use notation x_t to denote explicit t-dependence of variable x. Not to be confused with the other common usage of subscripts for denoting partial differentiation.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, mathrmd W_t). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreenint_t_0^t g(x(s)) mathrmd W_s approx sum_j g left ( x(t_j) right )(W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta int_t_0^t g(x(s)) mathrmd W_s approx sum_j g left (x left (tfrac12(t_j + t_j+1) right ) right)(W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The difference in the two calculi above lies in the point at which we choose to evaluate g(x): we take the start of the time-interval for colorGreen textItô t_j, while we use the mid-point for colorMagentatextStratonovich tfrac12(t_j+t_j+1). In the case the stochastic noise is additive, i.e., its prefactor g does not depend on the state x_t, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., g=g(x(t)), then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"An SDE can be written also in differential form. Because we cannot formally form the derivative mathrmd W mathrmd t, since W is nowhere differentiable, we write an SDE in differential form as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd x_t = f(x_t) mathrmd t + g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd x_t = f(x_t) mathrmd t + g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The circle in the term colorMagentag(x_t) circ mathrmd W_t is used to differentiate between Itô and Stratonovich calculus.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's now assume we perform a variable change y = G(x). It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreentextItô colorGreenmathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 mathrmd t = left fracmathrmd Gmathrmd x f(x_t) + frac12 g(x_t)^2 fracmathrmd^2 Gmathrmd x^2 right mathrmd t + fracmathrmd Gmathrmd x g(x_t) mathrmd W_t \ncolorMagentatextStratonovich colorMagentamathrmd y_t = fracmathrmd Gmathrmd x mathrmd x_t = fracmathrmd Gmathrmd x f(x_t) mathrmd t + fracmathrmd Gmathrmd x g(x_t) circ mathrmd W_t \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above are the so-called stochastic chain rules. All derivatives of G are evaluated at x_t. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the \"drift-term\": colorGreentfrac12 g^2 mathrmd^2G mathrmd x^2.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with g which is evaluated at a time instance before the action of the noise; g and mathrmd W are uncorrelated and thus:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen left langle g(x_t) mathrmd W_t right rangle = 0 quad textwhile quad colorMagenta left langle g(x_t) circ mathrmd W_t right rangle ne 0 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The above is demonstrated by evaluating the simple stochastic integral:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen left langle int_t_0^t W_s mathrmd W_s right rangle approx sum_j left langle W_j (W_j+1 - W_j) right rangle \n hspace73em colorGreen = sum_j left langle W_j W_j+1 right rangle - left langle W_j W_j right rangle sim sum_j t_j - t_j = 0 \ncolorMagentatextStratonovich colorMagentaleft langle int_t_0^t W_s circ mathrmd W_s right rangle approx sum_j left langle frac12(W_j + W_j+1) (W_j+1 - W_j)right rangle \n hspace73em colorMagenta = frac12 sum_j left langle W_j+1 W_j+1 right rangle - left langle W_j W_j right rangle sim frac12 sum_j t_j+1 - t_j = fract2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Differential-Equation:-the-Ornstein–Uhlenbeck-process","page":"Stochastic forcing","title":"A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = - int_t_0^t mu x(s) mathrmd s + int_t_0^t sqrtsigma mathrmd W_s tag1","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Note that in differential form (1) is written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd x_t = - mu x_t mathrmd t + sqrtsigma mathrmd W_t tag2","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since g is independent of x(t). But note that often this is not the case; that g is independent of x(t) is only a fortuitous coincident for this particular SDE.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration tau, i.e., t_j = (j-1) tau, j=1 2 dots. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote x_j equiv x(t_j). Then the Euler–Mayorama time-stepping scheme for (2) is","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tx_j+1 = x_j + (-mu x_j) tau + sqrtsigma (W_j+1 - W_j) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the \"energy\", defined as E equiv tfrac12 x^2, then how does the noise term attribute in the growth of E? To answer that we first have to find the SDE that energy E obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, E evolves according to:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace335em colorGreen textItô colorGreen mathrmd E_t = left ( -2 mu E_t + tfrac12 sigma right ) mathrmd t + x_t sqrtsigma mathrmd W_t tag3","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"hspace-335em colorMagenta textStratonovich colorMagenta mathrmd E_t = -2 mu E_t mathrmd t + x_t circ sqrtsigma mathrmd W_t tag4","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The term -2 mu E_t in both cases is the dissipation of energy by the mu term; the rest of the terms involve the noise. How do we compute the work P done by the noise? Well, it follows that:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ncolorGreen textItô colorGreen P_t = tfrac12 sigma mathrmd t + sqrtsigma x_t mathrmd W_t approx tfrac12 sigma mathrmdt + sqrtsigma x_j (W_j+1 - W_j) \ncolorMagenta textStratonovich colorMagenta P_t = x_t circ sqrtsigma mathrmd W_t approx sqrtsigma x left ( tfrac12 (t_j + t_j+1) right ) (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the tfrac12 sigma term. We can compute the Itô's drift-term using the fact that it is exactly equal to langle x_t circ sqrtsigma mathrmd W_t rangle; and for the latter we can use the \"usual\" calculus. That is, we rewrite (1) as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"dotx = -mu x + xi tag5","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where xi(t) is understood to be the \"continuous\" version of the white-noise process (which is formally only understood in terms of distributions). The forcing xi has the properties:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"left langle xi(t) right rangle = 0 quad textand quad left langle xi(t) xi(t) right rangle = sigma delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus we need to compute langle P_t rangle = langle x(t) xi(t) rangle. But (5) formally has the solution:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"x(t) = e^-mu t x(0) + int_0^t e^-mu (t - s) xi(s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and using this solution we get","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle P_t rangle = langle x(t) xi(t) rangle = e^-mu t underbracelangle x(0) xi(t) rangle_=0 + int_0^t e^-mu (t - s) langle xi(t) xi(s) rangle mathrmd s = sigma int_0^t e^- mu (t - s) delta(t - s) mathrmd s = fracsigma2 ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Above we used that int_0^t delta(t - s) mathrmd s = tfrac12, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.","category":"page"},{"location":"stochastic_forcing/#Numerical-implementation","page":"Stochastic forcing","title":"Numerical implementation","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"How do we time-step the equation for E? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"\tE_j+1 = E_j + left ( -2 mu E_j + fracsigma2 right ) tau + sqrtsigma x_j (W_j+1 - W_j)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves \"Itô\"-thinking. To time-step (4) we have to approximate g in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nwidetildeE_j+1 = E_j + (- 2mu E_j) tau + sqrtsigma x_j (W_j+1 - W_j) \nE_j+1 = E_j + left( -2 mu fracE_j + widetildeE_j + 12 right)tau + sqrtsigmafracx_j + x_j+12 (W_j+1 - W_j) \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing E a posteriori. ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Figure below compares the energy evolution as predicted by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"direct computation from the x_t time-series: tfrac12 x_t^2,\ntime-integration of (3) using Euler–Maruyama, and\ntime-integration of (4) using Euler–Heun.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"using CairoMakie\nusing Statistics: mean\nusing Random: randn, seed!\nseed!(1234) # for reproducing the same plots\n\n μ = 0.2\n σ = 0.2 # noise strength\n dt = 0.01 # timestep\n nsteps = 2001 # total timesteps\n n_realizations = 1000 # how many forcing realizations\nsome_realizations = 20 # used for plotting to illustrate convergence\n\nt = 0:dt:(nsteps-1)*dt \t# time\n\nΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise\n\n# Numerical calculation\nx = zeros(size(ΔW))\nE_ito = zeros(size(ΔW))\nE_str = zeros(size(ΔW))\nE_numerical = zeros(size(ΔW))\n\nfor j = 2:nsteps # time step the equations\n\t\n # time-step dx = - μ x dt + √σ dW\n @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n\n # time-step dE = (- 2μ E + ½σ) dt + √σ x dW\n @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]\n\t + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n\n # time-step dE = - 2μ E dt + √σ x ∘ dW\n xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]\n Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]\n @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]\n\t\t+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]\nend\n\n# direct computation of E from x\n@. E_numerical = 0.5 * x^2\n\n# compare the three E(t) solutions\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"comparison of E(t) for single realization\")\n\nhl1 = lines!(ax, μ * t, E_numerical[:, 1];\n linewidth = 3, linestyle = :solid)\nhl2 = lines!(ax, μ * t, E_ito[:, 1];\n linewidth = 2, linestyle = :dash)\nhl3 = lines!(ax, μ * t, E_str[:, 1];\n linewidth = 1, linestyle = :dashdot)\n\nLegend(fig[1, 2], [hl1, hl2, hl3], [\"½ xₜ²\", \"Eₜ (Ito)\", \"Eₜ (Stratonovich)\"])\n\nsave(\"assets/energy_comparison.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_comparison)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Now we can further compute the \"energy\" budgets, i.e., the work done by the noise versus the energy loss by the μ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# theoretical results for ⟨E⟩ and d⟨E⟩/dt\n E_theory = @. σ/4μ * (1 - exp(-2μ * t))\ndEdt_theory = @. σ/2 * exp(-2μ * t)\n\n# compute d⟨E⟩/dt numerically\ndEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)\ndiss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))\n\n# Ensemble mean energy budgets from the Itô integration\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Ito.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Ito)","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"# compute d⟨E⟩/dt numerically\ndEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt\n\n# compute the work and dissipation\nwork_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)\ndiss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))\n\nfig = Figure()\n\nax1 = Axis(fig[1, 1];\n xlabel = \"μ t\",\n ylabel = \"E\",\n title = \"Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ\")\n\nhl1 = lines!(ax1, μ * t, E_theory;\n linewidth = 3)\nhl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));\n linewidth = 2)\nhl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),\n linewidth = 1)\n\nLegend(fig[1, 2], [hl1, hl2, hl3],\n [\"theoretical ⟨E⟩\", \"⟨E⟩ from $some_realizations ensemble members\", \"⟨E⟩ from $n_realizations ensemble members\"])\n\nax2 = Axis(fig[2, 1];\n xlabel = \"μ t\",\n ylabel = \"dE/dt\")\n\nhl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);\n linewidth = 2, linestyle = :dash)\nhl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);\n linewidth = 1, linestyle = :dashdot)\nhl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];\n linewidth = 3, linestyle = :solid)\n\nLegend(fig[2, 2], [hl1, hl2, hl3],\n [\"numerical 𝖽⟨E⟩/𝖽t\", \"⟨work - dissipation⟩\", \"theoretical 𝖽⟨E⟩/𝖽t\"])\n\nsave(\"assets/energy_budgets_Stratonovich.svg\", fig); nothing #hide","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"(Image: energy_budgets_Stratonovich)","category":"page"},{"location":"stochastic_forcing/#A-simple-Stochastic-Partial-Differential-Equation-(SPDE)","page":"Stochastic forcing","title":"A simple Stochastic Partial Differential Equation (SPDE)","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag6","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"with periodic boundary conditions in both x and y. SPDE (6) is also equivalently written as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd nabla^2 psi_t(bmx) = - mu nabla^2 psi_t (bmx) mathrmd t + sqrtsigma mathrmd W_t (bmx) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The forcing xi obeys:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle xi(bmx t) rangle = 0 quad textand quad langle xi(bmx t) xi(bmx t) rangle = Q(bmx - bmx) delta(t - t) ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function Q which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Equation (6) above describes the vorticity evolution of a two-dimensional fluid nabla^2 psi that is stochastically forced while dissipated by linear drag mu. The energy of the fluid is:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"E = tfrac12 overlinebmnabla psi^2^x y = -tfrac12 overlinepsi nabla^2 psi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"where the overbar denotes average over x and y and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with -psi and average over the whole domain. Thus, the work done by the forcing is given by:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"P = - overlinepsi xi^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Numerically, the work done by the forcing at the j-th timestep can be obtained Stratonovich-wise via:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1) ^xy \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"or Itô-wise as","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\nP_j = - overline psi(bmx t_j) xi(bmx t_j+1) ^xy + textdrift \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"textrmIto drift= - overlinelangle underbracepsi(bmx t) circ xi(bmx t)_textrmStratonovich rangle^x y ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"But again, the above can be computed using the \"formal\" solution of (6):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^-mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"which implies","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"beginaligned\ntextdrift = -overlinee^- mu t underbraceleft langle psi(bmx 0) xi(bmx t) right rangle_=0^x y - int_0^t e^- mu (t - s) overlinenabla^-2 left langle xi(bmx s) xi(bmx t) rightrangle^x y mathrmd s \n = - int_0^t e^-mu(t - s) overlineunderbraceleft nabla^-2 Q (bmx) right big_bmx=0_textindependent of x y delta(t - s)^xy mathrmd s \n = - frac12 nabla^-2 Q(bmx) big_bmx=0 \n = - frac12 left nabla^-2 int fracmathrmd^2 bmk(2pi)^2 widehatQ(bmk) e^i bmk bmcdot bmx right _bmx=0 \n = int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 \nendaligned","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, Q. Let us denote the drift as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"varepsilon equiv int fracmathrmd^2 bmk(2pi)^2 fracwidehatQ(bmk)2 bmk^2 tag7","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Using the above, the work for a single forcing realization at the j-th timestep is numerically computed as:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorGreen textItô colorGreen P_j = -overlinepsi(bmx t_j) xi(bmx t_j+1)^x y + varepsilon tag8","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"colorMagenta textStratonovich colorMagenta P_j = -overlinefracpsi(bmx t_j) + psi(bmx t_j+1)2 xi(bmx t_j+1)^x y tag9","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"Remember, previously the work done by the stochastic forcing was:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"mathrmd P_t = colorGreen fracsigma2mathrmd t + sqrtsigma x_t mathrmd W_t = colorMagenta sqrtsigma x_t circ mathrmd W_t ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"and by sampling over various forcing realizations:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"langle mathrmd P_t rangle = fracsigma2 mathrmd t = langle sqrtsigma x_t circ mathrmd W_t rangle ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.","category":"page"},{"location":"stochastic_forcing/#A-bit-more-elaborate-SPDE","page":"Stochastic forcing","title":"A bit more elaborate SPDE","text":"","category":"section"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"partial_t nabla^2 psi(bmx t) + mathsfJ(psi nabla^2 psi) = - mu nabla^2 psi(bmx t) + xi(bmx t) tag10","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the \"formal\" solution of (10):","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"psi(bmx t) = e^- mu t psi(bmx 0) + int_0^t e^- mu (t - s) nabla^-2 xi(bmx s) mathrmd s - int_0^t nabla^-2 mathsfJ left ( psi(bmx s) nabla^2 psi(bmx s) right ) mathrmd s ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"When multiplied with xi(bmx t) the last term vanishes since its only non-zero contribution comes from the point s = t, which is of measure zero (in the integrated sense). ","category":"page"},{"location":"stochastic_forcing/","page":"Stochastic forcing","title":"Stochastic forcing","text":"A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#twodnavierstokes_stochasticforcing_example","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Install-dependencies","page":"2D forced-dissipative turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Let's-begin","page":"2D forced-dissipative turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\n dt = 0.005 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Forcing","page":"2D forced-dissipative turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Problem-setup","page":"2D forced-dissipative turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Setting-initial-conditions","page":"2D forced-dissipative turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Diagnostics","page":"2D forced-dissipative turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"Create Diagnostics; the diagnostics are aimed to probe the energy budget.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"E = Diagnostic(TwoDNavierStokes.energy, prob; nsteps) # energy\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob; nsteps) # enstrophy\ndiags = [E, Z] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Visualizing-the-simulation","page":"2D forced-dissipative turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We initialize a plot with the vorticity field and the time-series of energy and enstrophy diagnostics. To plot energy and enstrophy on the same axes we scale enstrophy with k_f^2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"ζ = Observable(Array(vars.ζ))\ntitle_ζ = Observable(\"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t))\n\nenergy = Observable(Point2f[(μ * E.t[1], E.data[1])])\nenstrophy = Observable(Point2f[(μ * Z.t[1], Z.data[1] / forcing_wavenumber^2)])\n\nfig = Figure(resolution = (800, 360))\n\naxζ = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_ζ,\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nax2 = Axis(fig[1, 2],\n xlabel = \"μ t\",\n limits = ((0, 1.1 * μ * nsteps * dt), (0, 0.55)))\n\nheatmap!(axζ, x, y, ζ;\n colormap = :balance, colorrange = (-40, 40))\n\nhE = lines!(ax2, energy; linewidth = 3)\nhZ = lines!(ax2, enstrophy; linewidth = 3, color = :red)\nLegend(fig[1, 3], [hE, hZ], [\"energy E(t)\", \"enstrophy Z(t) / k_f²\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"startwalltime = time()\n\nrecord(fig, \"twodturb_forced.mp4\", 0:round(Int, nsteps / nsubs), framerate = 18) do j\n if j % (1000/nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Z: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n println(log)\n end\n\n ζ[] = vars.ζ\n\n energy[] = push!(energy[], Point2f(μ * E.t[E.i], E.data[E.i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z.t[E.i], Z.data[Z.i] / forcing_wavenumber^2))\n\n title_ζ[] = \"vorticity, μ t=\" * @sprintf(\"%.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n TwoDNavierStokes.updatevars!(prob)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Z: 0.0000, walltime: 0.00 min\nstep: 1000, t: 5, cfl: 0.43, E: 0.2881, Z: 34.9014, walltime: 0.14 min\nstep: 2000, t: 10, cfl: 0.53, E: 0.3803, Z: 33.7438, walltime: 0.23 min\nstep: 3000, t: 15, cfl: 0.48, E: 0.4326, Z: 36.7366, walltime: 0.33 min\nstep: 4000, t: 20, cfl: 0.53, E: 0.4520, Z: 34.9454, walltime: 0.43 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing/","page":"2D forced-dissipative turbulence","title":"2D forced-dissipative turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"EditURL = \"../../../examples/multilayerqg_2layer.jl\"","category":"page"},{"location":"literated/multilayerqg_2layer/#multilayerqg_2layer_example","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"A simulation of the growth of barolinic instability in the Phillips 2-layer model when we impose a vertical mean flow shear as a difference Delta U in the imposed, domain-averaged, zonal flow at each layer.","category":"page"},{"location":"literated/multilayerqg_2layer/#Install-dependencies","page":"Phillips model of Baroclinic Instability","title":"Install dependencies","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf\"","category":"page"},{"location":"literated/multilayerqg_2layer/#Let's-begin","page":"Phillips model of Baroclinic Instability","title":"Let's begin","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"using GeophysicalFlows, CairoMakie, Printf\n\nusing Random: seed!","category":"page"},{"location":"literated/multilayerqg_2layer/#Choosing-a-device:-CPU-or-GPU","page":"Phillips model of Baroclinic Instability","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/multilayerqg_2layer/#Numerical-parameters-and-time-stepping-parameters","page":"Phillips model of Baroclinic Instability","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 2.5e-3 # timestep\n nsteps = 20000 # total number of time-steps\n nsubs = 50 # number of time-steps for plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/multilayerqg_2layer/#Physical-parameters","page":"Phillips model of Baroclinic Instability","title":"Physical parameters","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"L = 2π # domain size\nμ = 5e-2 # bottom drag\nβ = 5 # the y-gradient of planetary PV\n\nnlayers = 2 # number of layers\nf₀ = 1 # Coriolis parameter\nH = [0.2, 0.8] # the rest depths of each layer\nb = [-1.0, -1.2] # Boussinesq buoyancy of each layer\n\nU = zeros(nlayers) # the imposed mean zonal flow in each layer\nU[1] = 1.0\nU[2] = 0.0","category":"page"},{"location":"literated/multilayerqg_2layer/#Problem-setup","page":"Phillips model of Baroclinic Instability","title":"Problem setup","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"prob = MultiLayerQG.Problem(nlayers, dev; nx=n, Lx=L, f₀, H, b, U, μ, β,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"and define some shortcuts.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"sol, clock, params, vars, grid = prob.sol, prob.clock, prob.params, prob.vars, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/multilayerqg_2layer/#Setting-initial-conditions","page":"Phillips model of Baroclinic Instability","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Our initial condition is some small-amplitude random noise. We smooth our initial condidtion using the timestepper's high-wavenumber filter.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"seed!(1234) # reset of the random number generator for reproducibility\nq₀ = 1e-2 * device_array(dev)(randn((grid.nx, grid.ny, nlayers)))\nq₀h = prob.timestepper.filter .* rfft(q₀, (1, 2)) # apply rfft only in dims=1, 2\nq₀ = irfft(q₀h, grid.nx, (1, 2)) # apply irfft only in dims=1, 2\n\nMultiLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/multilayerqg_2layer/#Diagnostics","page":"Phillips model of Baroclinic Instability","title":"Diagnostics","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Create Diagnostics – energies function is imported at the top.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"E = Diagnostic(MultiLayerQG.energies, prob; nsteps)\ndiags = [E] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/multilayerqg_2layer/#Output","page":"Phillips model of Baroclinic Instability","title":"Output","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"filepath = \".\"\nplotpath = \"./plots_2layer\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"2layer.jld2\")","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Do some basic file management","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"And then create Output","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n sol, params, vars, grid = prob.sol, prob.params, prob.vars, prob.grid\n\n @. vars.qh = sol\n streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n @. vars.uh = -im * grid.l * vars.ψh\n invtransform!(vars.u, vars.uh, params)\n\n return vars.u\nend\n\nout = Output(prob, filename, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/multilayerqg_2layer/#Visualizing-the-simulation","page":"Phillips model of Baroclinic Instability","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"We create a figure using Makie's Observables that plots the potential vorticity field and the evolution of energy and enstrophy. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_KE = Observable(@sprintf(\"μt = %.2f\", μ * clock.t))\n\nq₁ = Observable(Array(vars.q[:, :, 1]))\nψ₁ = Observable(Array(vars.ψ[:, :, 1]))\nq₂ = Observable(Array(vars.q[:, :, 2]))\nψ₂ = Observable(Array(vars.ψ[:, :, 2]))\n\nfunction compute_levels(maxf, nlevels=8)\n # -max(|f|):...:max(|f|)\n levelsf = @lift collect(range(-$maxf, stop = $maxf, length=nlevels))\n\n # only positive\n levelsf⁺ = @lift collect(range($maxf/(nlevels-1), stop = $maxf, length=Int(nlevels/2)))\n\n # only negative\n levelsf⁻ = @lift collect(range(-$maxf, stop = -$maxf/(nlevels-1), length=Int(nlevels/2)))\n\n return levelsf, levelsf⁺, levelsf⁻\nend\n\nmaxψ₁ = Observable(maximum(abs, vars.ψ[:, :, 1]))\nmaxψ₂ = Observable(maximum(abs, vars.ψ[:, :, 2]))\n\nlevelsψ₁, levelsψ₁⁺, levelsψ₁⁻ = compute_levels(maxψ₁)\nlevelsψ₂, levelsψ₂⁺, levelsψ₂⁻ = compute_levels(maxψ₂)\n\nKE₁ = Observable(Point2f[(μ * E.t[1], E.data[1][1][1])])\nKE₂ = Observable(Point2f[(μ * E.t[1], E.data[1][1][2])])\nPE = Observable(Point2f[(μ * E.t[1], E.data[1][2])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq₁ = Axis(fig[1, 1]; title = \"q₁\", axis_kwargs...)\n\naxψ₁ = Axis(fig[2, 1]; title = \"ψ₁\", axis_kwargs...)\n\naxq₂ = Axis(fig[1, 2]; title = \"q₂\", axis_kwargs...)\n\naxψ₂ = Axis(fig[2, 2]; title = \"ψ₂\", axis_kwargs...)\n\naxKE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"KE\",\n title = title_KE,\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\naxPE = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"PE\",\n yscale = log10,\n limits = ((-0.1, 2.6), (1e-9, 5)))\n\nheatmap!(axq₁, x, y, q₁; colormap = :balance)\n\nheatmap!(axq₂, x, y, q₂; colormap = :balance)\n\ncontourf!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁺, color=:black)\n contour!(axψ₁, x, y, ψ₁;\n levels = levelsψ₁⁻, color=:black, linestyle = :dash)\n\ncontourf!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂, colormap = :viridis, extendlow = :auto, extendhigh = :auto)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁺, color=:black)\n contour!(axψ₂, x, y, ψ₂;\n levels = levelsψ₂⁻, color=:black, linestyle = :dash)\n\nke₁ = lines!(axKE, KE₁; linewidth = 3)\nke₂ = lines!(axKE, KE₂; linewidth = 3)\nLegend(fig[1, 4], [ke₁, ke₂,], [\"KE₁\", \"KE₂\"])\n\nlines!(axPE, PE; linewidth = 3)\n\nfig","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Time-stepping-the-Problem-forward","page":"Phillips model of Baroclinic Instability","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we time-step the Problem forward in time.","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"multilayerqg_2layer.mp4\", frames, framerate = 18) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.2f, KE₁: %.3e, KE₂: %.3e, PE: %.3e, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i][1][1], E.data[E.i][1][2], E.data[E.i][2][1], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q₁[] = vars.q[:, :, 1]\n ψ₁[] = vars.ψ[:, :, 1]\n q₂[] = vars.q[:, :, 2]\n ψ₂[] = vars.ψ[:, :, 2]\n\n maxψ₁[] = maximum(abs, vars.ψ[:, :, 1])\n maxψ₂[] = maximum(abs, vars.ψ[:, :, 2])\n\n KE₁[] = push!(KE₁[], Point2f(μ * E.t[E.i], E.data[E.i][1][1]))\n KE₂[] = push!(KE₂[], Point2f(μ * E.t[E.i], E.data[E.i][1][2]))\n PE[] = push!(PE[] , Point2f(μ * E.t[E.i], E.data[E.i][2]))\n\n title_KE[] = @sprintf(\"μ t = %.2f\", μ * clock.t)\n\n stepforward!(prob, diags, nsubs)\n MultiLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"step: 0000, t: 0.0, cfl: 0.00, KE₁: 1.057e-08, KE₂: 4.999e-08, PE: 3.110e-09, walltime: 0.00 min\nstep: 1000, t: 2.5, cfl: 0.00, KE₁: 4.790e-08, KE₂: 4.955e-08, PE: 6.252e-08, walltime: 0.31 min\nstep: 2000, t: 5.0, cfl: 0.00, KE₁: 1.611e-07, KE₂: 8.767e-08, PE: 1.824e-07, walltime: 0.44 min\nstep: 3000, t: 7.5, cfl: 0.00, KE₁: 6.691e-07, KE₂: 2.782e-07, PE: 7.464e-07, walltime: 0.57 min\nstep: 4000, t: 10.0, cfl: 0.00, KE₁: 3.107e-06, KE₂: 1.241e-06, PE: 3.361e-06, walltime: 0.70 min\nstep: 5000, t: 12.5, cfl: 0.00, KE₁: 1.570e-05, KE₂: 6.251e-06, PE: 1.685e-05, walltime: 0.83 min\nstep: 6000, t: 15.0, cfl: 0.00, KE₁: 8.230e-05, KE₂: 3.282e-05, PE: 8.810e-05, walltime: 0.97 min\nstep: 7000, t: 17.5, cfl: 0.01, KE₁: 4.412e-04, KE₂: 1.760e-04, PE: 4.723e-04, walltime: 1.12 min\nstep: 8000, t: 20.0, cfl: 0.02, KE₁: 2.394e-03, KE₂: 9.554e-04, PE: 2.564e-03, walltime: 1.27 min\nstep: 9000, t: 22.5, cfl: 0.05, KE₁: 1.274e-02, KE₂: 5.083e-03, PE: 1.365e-02, walltime: 1.41 min\nstep: 10000, t: 25.0, cfl: 0.09, KE₁: 5.764e-02, KE₂: 2.314e-02, PE: 6.095e-02, walltime: 1.55 min\nstep: 11000, t: 27.5, cfl: 0.12, KE₁: 1.720e-01, KE₂: 7.441e-02, PE: 1.710e-01, walltime: 1.70 min\nstep: 12000, t: 30.0, cfl: 0.19, KE₁: 3.204e-01, KE₂: 1.522e-01, PE: 3.567e-01, walltime: 1.84 min\nstep: 13000, t: 32.5, cfl: 0.23, KE₁: 3.819e-01, KE₂: 2.204e-01, PE: 3.942e-01, walltime: 1.96 min\nstep: 14000, t: 35.0, cfl: 0.30, KE₁: 4.390e-01, KE₂: 3.152e-01, PE: 4.753e-01, walltime: 2.09 min\nstep: 15000, t: 37.5, cfl: 0.27, KE₁: 5.285e-01, KE₂: 3.980e-01, PE: 6.448e-01, walltime: 2.21 min\nstep: 16000, t: 40.0, cfl: 0.31, KE₁: 5.657e-01, KE₂: 4.813e-01, PE: 6.384e-01, walltime: 2.34 min\nstep: 17000, t: 42.5, cfl: 0.30, KE₁: 5.449e-01, KE₂: 5.176e-01, PE: 5.810e-01, walltime: 2.45 min\nstep: 18000, t: 45.0, cfl: 0.31, KE₁: 5.547e-01, KE₂: 5.822e-01, PE: 5.594e-01, walltime: 2.56 min\nstep: 19000, t: 47.5, cfl: 0.28, KE₁: 5.410e-01, KE₂: 6.639e-01, PE: 5.192e-01, walltime: 2.68 min\nstep: 20000, t: 50.0, cfl: 0.26, KE₁: 5.316e-01, KE₂: 6.543e-01, PE: 5.425e-01, walltime: 2.79 min\n","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"(Image: )","category":"page"},{"location":"literated/multilayerqg_2layer/#Save","page":"Phillips model of Baroclinic Instability","title":"Save","text":"","category":"section"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"","category":"page"},{"location":"literated/multilayerqg_2layer/","page":"Phillips model of Baroclinic Instability","title":"Phillips model of Baroclinic Instability","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/singlelayerqg/#SingleLayerQG","page":"SingleLayerQG","title":"SingleLayerQG","text":"","category":"section"},{"location":"modules/singlelayerqg/#Basic-Equations","page":"SingleLayerQG","title":"Basic Equations","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"This module solves the barotropic or equivalent barotropic quasi-geostrophic vorticity equation on a beta plane of variable fluid depth H - h(x y). The flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here the QGPV is","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"\tunderbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity\n\tunderbrace - frac1ell^2 psi_textvortex stretching + \n\tunderbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where ell is the Rossby radius of deformation. Purely barotropic dynamics corresponds to infinite Rossby radius of deformation (ell = infty), while a flow with a finite Rossby radius follows is said to obey equivalent-barotropic dynamics. We denote the sum of the relative vorticity and the vortex stretching contributions to the QGPV with q equiv nabla^2 psi - psi ell^2. Also, we denote the topographic PV with eta equiv f_0 h H.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The dynamical variable is q. Thus, the equation solved by the module is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t q + mathsfJ(psi q + eta) + beta partial_x psi = \nunderbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right q_textrmdissipation + F ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"where mathsfJ(a b) = (partial_x a)(partial_y b)-(partial_y a)(partial_x b) is the two-dimensional Jacobian. On the right hand side, F(x y t) is forcing, mu is linear drag, and nu is hyperviscosity of order n_nu. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/singlelayerqg/#Implementation","page":"SingleLayerQG","title":"Implementation","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"partial_t widehatq = - widehatmathsfJ(psi q + eta) + beta fraci k_x𝐤^2 + 1ell^2 widehatq - left(mu + nu 𝐤^2n_nu right) widehatq + widehatF ","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The state variable sol is the Fourier transform of the sum of relative vorticity and vortex stretching (when the latter is applicable), qh.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.Equation","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.Equation","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.Equation","text":"Equation(params::BarotropicQGParams, grid)\n\nReturn the equation for a barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\nEquation(params::EquivalentBarotropicQGParams, grid)\n\nReturn the equation for an equivalent-barotropic QG problem with params and grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = -μ - ν 𝐤^2 n_ν + i β k_x (𝐤² + 1ℓ²) \n\nThe nonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The nonlinear terms are computed via","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.calcN!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.calcN!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ q + η) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/singlelayerqg/#Parameters-and-Variables","page":"SingleLayerQG","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/singlelayerqg/#Helper-functions","page":"SingleLayerQG","title":"Helper functions","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.updatevars!\nGeophysicalFlows.SingleLayerQG.set_q!","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.updatevars!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.updatevars!","text":"updatevars!(sol, vars, params, grid)\n\nUpdate the variables in vars with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.set_q!","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.set_q!","text":"set_q!(prob, q)\n\nSet the solution of problem, prob.sol as the transform of q and update variables prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/#Diagnostics","page":"SingleLayerQG","title":"Diagnostics","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The kinetic energy of the fluid is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.kinetic_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.kinetic_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.kinetic_energy","text":"kinetic_energy(prob)\n\nReturn the problem's (prob) domain-averaged kinetic energy of the fluid. Since u² + v² = bf ψ², the domain-averaged kinetic energy is \n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"while the potential energy, for an equivalent barotropic fluid, is computed via:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.potential_energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.potential_energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.potential_energy","text":"potential_energy(prob)\n\nReturn the problem's (prob) domain-averaged potential energy of the fluid,\n\nint frac12 fracψ²ℓ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 fracψ²ℓ² \n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"The total energy is:","category":"page"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"GeophysicalFlows.SingleLayerQG.energy","category":"page"},{"location":"modules/singlelayerqg/#GeophysicalFlows.SingleLayerQG.energy","page":"SingleLayerQG","title":"GeophysicalFlows.SingleLayerQG.energy","text":"energy(prob)\n\nReturn the problem's (prob) domain-averaged total energy of the fluid, that is, the kinetic energy for a pure barotropic flow or the sum of kinetic and potential energies for an equivalent barotropic flow.\n\n\n\n\n\n","category":"function"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"Other diagnostic include: energy_dissipation, energy_drag, energy_work, enstrophy_dissipation, and enstrophy_drag, enstrophy_work.","category":"page"},{"location":"modules/singlelayerqg/#Examples","page":"SingleLayerQG","title":"Examples","text":"","category":"section"},{"location":"modules/singlelayerqg/","page":"SingleLayerQG","title":"SingleLayerQG","text":"examples/singlelayerqg_betadecay.jl: Simulate decaying quasi-geostrophic flow on a beta plane demonstrating zonation.\nexamples/singlelayerqg_betaforced.jl: Simulate forced-dissipative quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated with isotropic spatial structure with power in a narrow annulus in wavenumber space with total wavenumber k_f.\nexamples/singlelayerqg_decay_topography.jl: Simulate two dimensional turbulence (barotropic quasi-geostrophic flow with beta=0) above topography.\nexamples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl: Simulate two dimensional turbulence (beta=0) with both infinite and finite Rossby radius of deformation and compares the evolution of the two.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"EditURL = \"../../../examples/twodnavierstokes_stochasticforcing_budgets.jl\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#twodnavierstokes_stochasticforcing_budgets_example","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"A simulation of forced-dissipative two-dimensional turbulence. We solve the two-dimensional vorticity equation with stochastic excitation and dissipation in the form of linear drag and hyperviscosity. As a demonstration, we compute how each of the forcing and dissipation terms contribute to the energy and the enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Install-dependencies","page":"2D forced-dissipative turbulence budgets","title":"Install dependencies","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, Random, Printf, CairoMakie\"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Let's-begin","page":"2D forced-dissipative turbulence budgets","title":"Let's begin","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"using GeophysicalFlows, CUDA, Random, Printf, CairoMakie\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Choosing-a-device:-CPU-or-GPU","page":"2D forced-dissipative turbulence budgets","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Numerical,-domain,-and-simulation-parameters","page":"2D forced-dissipative turbulence budgets","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":" n, L = 256, 2π # grid resolution and domain length\n ν, nν = 2e-7, 2 # hyperviscosity coefficient and hyperviscosity order\n μ, nμ = 1e-1, 0 # linear drag coefficient\ndt, tf = 0.005, 0.2 / μ # timestep and final time\n nt = round(Int, tf / dt) # total timesteps\n ns = 4 # how many intermediate times we want to plot","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Forcing","page":"2D forced-dissipative turbulence budgets","title":"Forcing","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.1 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Problem-setup","page":"2D forced-dissipative turbulence budgets","title":"Problem setup","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We initialize a Problem by providing a set of keyword arguments. The stepper keyword defines the time-stepper to be used.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"prob = TwoDNavierStokes.Problem(dev; nx=n, Lx=L, ν, nν, μ, nμ, dt, stepper=\"ETDRK4\",\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Define some shortcuts for convenience.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"First let's see how a forcing realization looks like. Function calcF!() computes the forcing in Fourier space and saves it into variable vars.Fh, so we first need to go back to physical space.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-200, 200))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Setting-initial-conditions","page":"2D forced-dissipative turbulence budgets","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Our initial condition is a fluid at rest.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"TwoDNavierStokes.set_ζ!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Diagnostics","page":"2D forced-dissipative turbulence budgets","title":"Diagnostics","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Create Diagnostics; the diagnostics are aimed to probe the energy and enstrophy budgets.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"E = Diagnostic(TwoDNavierStokes.energy, prob, nsteps=nt) # energy\nRᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hypoviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nDᵋ = Diagnostic(TwoDNavierStokes.energy_dissipation_hyperviscosity, prob, nsteps=nt) # energy dissipation by drag μ\nWᵋ = Diagnostic(TwoDNavierStokes.energy_work, prob, nsteps=nt) # energy work input by forcing\nZ = Diagnostic(TwoDNavierStokes.enstrophy, prob, nsteps=nt) # enstrophy\nRᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hypoviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nDᶻ = Diagnostic(TwoDNavierStokes.enstrophy_dissipation_hyperviscosity, prob, nsteps=nt) # enstrophy dissipation by drag μ\nWᶻ = Diagnostic(TwoDNavierStokes.enstrophy_work, prob, nsteps=nt) # enstrophy work input by forcing\ndiags = [E, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ] # a list of Diagnostics passed to `stepforward!` will be updated every timestep.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Time-stepping-the-Problem-forward","page":"2D forced-dissipative turbulence budgets","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"startwalltime = time()\nfor i = 1:ns\n stepforward!(prob, diags, round(Int, nt/ns))\n\n TwoDNavierStokes.updatevars!(prob)\n\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\", clock.step, clock.t,\n cfl, (time()-startwalltime)/60)\n\n println(log)\nend","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"step: 0100, t: 0.5, cfl: 0.172, walltime: 0.01 min\nstep: 0200, t: 1.0, cfl: 0.214, walltime: 0.03 min\nstep: 0300, t: 1.5, cfl: 0.269, walltime: 0.04 min\nstep: 0400, t: 2.0, cfl: 0.355, walltime: 0.05 min\n","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/#Plot","page":"2D forced-dissipative turbulence budgets","title":"Plot","text":"","category":"section"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"Now let's see the final snapshot of the vorticity.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"fig = Figure(resolution = (400, 400))\n\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"∇²ψ(x, y, μt=\" * @sprintf(\"%.2f\", μ * clock.t) * \")\",\n aspect = 1,\n limits = ((-L/2, L/2), (-L/2, L/2)))\n\nheatmap!(ax, x, y, Array(vars.ζ);\n colormap = :viridis, colorrange = (-25, 25))\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"And finally, we plot the evolution of the energy and enstrophy diagnostics and all terms involved in the energy and enstrophy budgets. Last, we also check (by plotting) whether the energy and enstrophy budgets are accurately computed, e.g., mathrmdEmathrmdt = W^varepsilon - R^varepsilon - D^varepsilon.","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\n\nTwoDNavierStokes.updatevars!(prob)\n\nE, Dᵋ, Wᵋ, Rᵋ, Z, Dᶻ, Wᶻ, Rᶻ = diags\n\nclocktime = round(μ * clock.t, digits=2)\n\ndEdt_numerical = (E[2:E.i] - E[1:E.i-1]) / clock.dt # numerical first-order approximation of energy tendency\ndZdt_numerical = (Z[2:Z.i] - Z[1:Z.i-1]) / clock.dt # numerical first-order approximation of enstrophy tendency\n\ndEdt_computed = Wᵋ[2:E.i] + Dᵋ[1:E.i-1] + Rᵋ[1:E.i-1]\ndZdt_computed = Wᶻ[2:Z.i] + Dᶻ[1:Z.i-1] + Rᶻ[1:Z.i-1]\n\nresidual_E = dEdt_computed - dEdt_numerical\nresidual_Z = dZdt_computed - dZdt_numerical\n\nεᶻ = parsevalsum(forcing_spectrum / 2, grid) / (grid.Lx * grid.Ly)\n\nt = E.t[2:E.i]\n\nfig = Figure(resolution = (800, 1100))\n\naxis_kwargs = (xlabel = \"μ t\", )\n\nax1E = Axis(fig[1, 1]; ylabel = \"energy sources/sinks\", axis_kwargs...)\nax2E = Axis(fig[3, 1]; ylabel = \"dE/dt\", axis_kwargs...)\nax3E = Axis(fig[5, 1]; axis_kwargs...)\n\nax1Z = Axis(fig[1, 2]; axis_kwargs...)\nax2Z = Axis(fig[3, 2]; axis_kwargs...)\nax3Z = Axis(fig[5, 2]; axis_kwargs...)\n\nhWᵋ = lines!(ax1E, t, Wᵋ[2:E.i]; linestyle = :solid)\nhε = lines!(ax1E, t, ε .+ 0t; linestyle = :dash)\nhDᵋ = lines!(ax1E, t, Dᵋ[1:E.i-1]; linestyle = :solid)\nhRᵋ = lines!(ax1E, t, Rᵋ[1:E.i-1]; linestyle = :solid)\n\nLegend(fig[2, 1],\n [hWᵋ, hε, hDᵋ, hRᵋ],\n [\"energy work, Wᵋ\", \"ensemble mean energy work, \", \"dissipation, Dᵋ\", \"drag, Rᵋ = - 2μE\"])\n\nhc = lines!(ax2E, t, dEdt_computed; linestyle = :solid)\nhn = lines!(ax2E, t, dEdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 1],\n [hc, hn],\n [\"computed Wᵋ-Dᵋ\", \"numerical dE/dt\"])\n\nhr = lines!(ax3E, t, residual_E)\n\nLegend(fig[6, 1],\n [hr],\n [\"residual\"])\n\nhWᶻ = lines!(ax1Z, t, Wᶻ[2:Z.i]; linestyle = :solid)\nhεᶻ = lines!(ax1Z, t, εᶻ .+ 0t; linestyle = :dash)\nhDᶻ = lines!(ax1Z, t, Dᶻ[1:Z.i-1]; linestyle = :solid)\nhRᶻ = lines!(ax1Z, t, Rᶻ[1:Z.i-1]; linestyle = :solid)\n\nLegend(fig[2, 2],\n [hWᶻ, hεᶻ, hDᶻ, hRᶻ],\n [\"enstrophy work, Wᶻ\", \"ensemble mean enstophy work, \", \"dissipation, Dᶻ\", \"drag, Rᶻ = - 2μZ\"])\n\nhcᶻ = lines!(ax2Z, t, dZdt_computed; linestyle = :solid)\nhnᶻ = lines!(ax2Z, t, dZdt_numerical; linestyle = :dash)\n\nLegend(fig[4, 2],\n [hcᶻ, hnᶻ],\n [\"computed Wᶻ-Dᶻ\", \"numerical dZ/dt\"])\n\nhrᶻ = lines!(ax3Z, t, residual_Z)\n\nLegend(fig[6, 2],\n [hr],\n [\"residual\"])\n\nfig","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"(Image: )","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"","category":"page"},{"location":"literated/twodnavierstokes_stochasticforcing_budgets/","page":"2D forced-dissipative turbulence budgets","title":"2D forced-dissipative turbulence budgets","text":"This page was generated using Literate.jl.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"EditURL = \"../../../examples/singlelayerqg_decaying_barotropic_equivalentbarotropic.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#singlelayerqg_decaying_barotropic_equivalentbarotropic_example","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We use here the SingleLayerQG module to simulate decaying two-dimensional turbulence and investigate how does a finite Rossby radius of deformation affects its evolution.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Install-dependencies","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using Pkg\npkg\"add GeophysicalFlows, Printf, Random, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Let's-begin","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"using GeophysicalFlows, Printf, Random, CairoMakie\n\nusing GeophysicalFlows: peakedisotropicspectrum\nusing LinearAlgebra: ldiv!\nusing Random: seed!","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Choosing-a-device:-CPU-or-GPU","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Numerical,-domain,-and-simulation-parameters","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Numerical, domain, and simulation parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"First, we pick some numerical and physical parameters for our model.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"n, L = 128, 2π # grid resolution and domain length\ndeformation_radius = 0.35 # the deformation radius\n\n# Then we pick the time-stepper parameters\n dt = 1e-2 # timestep\nnsteps = 4000 # total number of steps\n nsubs = 20 # number of steps between each plot","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Problem-setup","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"We initialize two problems by providing a set of keyword arguments to the Problem constructor. The two problems are otherwise the same, except one has an infinite deformation radius, prob_bqg, and the other has finite deformation radius, prob_eqbqg.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For both problems we use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"stepper=\"FilteredRK4\"\n\nprob_bqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, dt, stepper, aliased_fraction=0)\nprob_eqbqg = SingleLayerQG.Problem(dev; nx=n, Lx=L, deformation_radius, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Setting-initial-conditions","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"For initial condition we construct a relative vorticity with energy most energy around total wavenumber k_0.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"seed!(1234)\nk₀, E₀ = 6, 0.5\n∇²ψ₀ = peakedisotropicspectrum(prob_bqg.grid, k₀, E₀, mask=prob_bqg.timestepper.filter)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG allows us to set up the initial q for each problem via set_q!() function. To initialize both prob_bqg and prob_eqbqg with the same flow, we first use function SingleLayerQG.streamfunctionfrompv! to get the streamfunction that corresponds to the relative vorticity we computed above. This works in the purely barotropic problem, prob_bqg since in that case the QGPV is simply the relative vorticity.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"∇²ψ₀h = rfft(∇²ψ₀)\nψ₀h = @. 0 * ∇²ψ₀h\nSingleLayerQG.streamfunctionfrompv!(ψ₀h, ∇²ψ₀h, prob_bqg.params, prob_bqg.grid)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"and then use the streamfunction to compute the corresponding q_0 for each problem,","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"q₀_bqg = irfft(-prob_bqg.grid.Krsq .* ψ₀h, prob_bqg.grid.nx)\nq₀_eqbqg = irfft(-(prob_eqbqg.grid.Krsq .+ 1/prob_eqbqg.params.deformation_radius^2) .* ψ₀h, prob_bqg.grid.nx)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we can initialize our problems with the same flow.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"SingleLayerQG.set_q!(prob_bqg, q₀_bqg)\nSingleLayerQG.set_q!(prob_eqbqg, q₀_eqbqg)","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Let's plot the initial vorticity field for each problem. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"function relativevorticity(prob)\n vars, grid = prob.vars, prob.grid\n\n ldiv!(vars.q, grid.rfftplan, - grid.Krsq .* vars.ψh)\n\n return vars.q\nend\n\nx, y = prob_bqg.grid.x, prob_bqg.grid.y\nLx, Ly = prob_bqg.grid.Lx, prob_bqg.grid.Ly\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nt_bqg = Observable(prob_bqg.clock.t)\nt_eqbqg = Observable(prob_eqbqg.clock.t)\n\ntitle_bqg = @lift \"barotropic\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_bqg)\ntitle_eqbqg = @lift \"equivalent barotropic; deformation radius: \" * @sprintf(\"%.2f\", prob_eqbqg.params.deformation_radius) * \"\\n ∇²ψ, t=\" * @sprintf(\"%.2f\", $t_eqbqg)\n\nax1 = Axis(fig[1, 1]; title = title_bqg, axis_kwargs...)\nax2 = Axis(fig[1, 2]; title = title_eqbqg, axis_kwargs...)\n\nζ_bqg = Observable(Array(relativevorticity(prob_bqg)))\nζ_eqbqg = Observable(Array(relativevorticity(prob_eqbqg)))\n\nheatmap!(ax1, x, y, ζ_bqg;\n colormap = :balance, colorrange = (-40, 40))\n\nheatmap!(ax2, x, y, ζ_eqbqg;\n colormap = :balance, colorrange = (-40, 40))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/#Time-stepping-the-Problem-forward","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"Now we time-step both problems forward and animate the relative vorticity in each case.","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"startwalltime = time()\n\ncfl(prob) = prob.clock.dt * maximum([maximum(prob.vars.u) / prob.grid.dx, maximum(prob.vars.v) / prob.grid.dy])\n\nrecord(fig, \"singlelayerqg_barotropic_equivalentbarotropic.mp4\", 0:Int(nsteps/nsubs), framerate = 18) do j\n if j % (1000 / nsubs) == 0\n log_bqg = @sprintf(\"barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_bqg.clock.step, prob_bqg.clock.t, cfl(prob_bqg), (time()-startwalltime)/60)\n println(log_bqg)\n\n log_eqbqg = @sprintf(\"equivalent barotropic; step: %04d, t: %d, cfl: %.2f, walltime: %.2f min\",\n prob_eqbqg.clock.step, prob_eqbqg.clock.t, cfl(prob_eqbqg), (time()-startwalltime)/60)\n println(log_eqbqg)\n end\n\n stepforward!(prob_bqg, nsubs)\n SingleLayerQG.updatevars!(prob_bqg)\n\n stepforward!(prob_eqbqg, nsubs)\n SingleLayerQG.updatevars!(prob_eqbqg)\n\n t_bqg[] = prob_bqg.clock.t\n t_eqbqg[] = prob_eqbqg.clock.t\n ζ_bqg[] = relativevorticity(prob_bqg)\n ζ_eqbqg[] = relativevorticity(prob_eqbqg)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nequivalent barotropic; step: 0000, t: 0, cfl: 0.53, walltime: 0.00 min\nbarotropic; step: 1000, t: 10, cfl: 0.46, walltime: 0.08 min\nequivalent barotropic; step: 1000, t: 10, cfl: 0.47, walltime: 0.08 min\nbarotropic; step: 2000, t: 20, cfl: 0.48, walltime: 0.16 min\nequivalent barotropic; step: 2000, t: 20, cfl: 0.36, walltime: 0.16 min\nbarotropic; step: 3000, t: 30, cfl: 0.47, walltime: 0.22 min\nequivalent barotropic; step: 3000, t: 30, cfl: 0.35, walltime: 0.22 min\nbarotropic; step: 4000, t: 40, cfl: 0.57, walltime: 0.29 min\nequivalent barotropic; step: 4000, t: 40, cfl: 0.36, walltime: 0.29 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_barotropic_equivalentbarotropic/","page":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","title":"SingleLayerQG decaying 2D turbulence with and without finite Rossby radius of deformation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualize/#Visualize-output","page":"Visualize output","title":"Visualize output","text":"","category":"section"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In the examples we use Makie.jl for plotting.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.","category":"page"},{"location":"visualize/","page":"Visualize output","title":"Visualize output","text":"In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.","category":"page"},{"location":"lib/types/#Private-types","page":"Private types","title":"Private types","text":"","category":"section"},{"location":"lib/types/#TwoDNavierStokes","page":"Private types","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.TwoDNavierStokes.Params\nGeophysicalFlows.TwoDNavierStokes.Vars\nGeophysicalFlows.TwoDNavierStokes.DecayingVars\nGeophysicalFlows.TwoDNavierStokes.ForcedVars\nGeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Params","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Params","text":"struct Params{T} <: AbstractParams\n\nThe parameters for a two-dimensional Navier-Stokes problem:\n\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\nμ::Any: large-scale (hypo)-viscosity coefficient\nnμ::Int64: (hypo)-viscosity order, nμ 0\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.Vars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: TwoDNavierStokesVars\n\nThe variables for two-dimensional Navier-Stokes problem:\n\nζ: relative vorticity\nu: x-component of velocity\nv: y-component of velocity\nζh: Fourier transform of relative vorticity\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.DecayingVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.DecayingVars","text":"DecayingVars(dev, grid)\n\nReturn the variables for unforced two-dimensional Navier-Stokes problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.ForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.TwoDNavierStokes.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional Navier-Stokes on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SingleLayerQG","page":"Private types","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SingleLayerQG.Params\nGeophysicalFlows.SingleLayerQG.BarotropicQGParams\nGeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams\nGeophysicalFlows.SingleLayerQG.Vars\nGeophysicalFlows.SingleLayerQG.DecayingVars\nGeophysicalFlows.SingleLayerQG.ForcedVars\nGeophysicalFlows.SingleLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Params","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Params","text":"struct Params{T, Aphys, Atrans, ℓ} <: SingleLayerQGParams\n\nThe parameters for the SingleLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\ndeformation_radius::Any: Rossby radius of deformation\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.BarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.BarotropicQGParams","text":"BarotropicQGParams(grid, β, eta, μ, ν, nν, calcF)\n\nReturn the parameters for a Barotropic QG problem (i.e., with infinite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.EquivalentBarotropicQGParams","text":"EquivalentBarotropicQGParams(grid, β, deformation_radius, eta, μ, ν, nν, calcF)\n\nReturn the parameters for an Equivalent Barotropic QG problem (i.e., with finite Rossby radius of deformation).\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: SingleLayerQGVars\n\nThe variables for SingleLayer QG:\n\nq: relative vorticity (+ vortex stretching)\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity (+ vortex stretching)\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced single-layer QG problem on grid.\n\n\n\n\n\n","category":"function"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced single-layer QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SingleLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SingleLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#MultiLayerQG","page":"Private types","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.MultiLayerQG.Params\nGeophysicalFlows.MultiLayerQG.SingleLayerParams\nGeophysicalFlows.MultiLayerQG.TwoLayerParams\nGeophysicalFlows.MultiLayerQG.Vars\nGeophysicalFlows.MultiLayerQG.DecayingVars\nGeophysicalFlows.MultiLayerQG.ForcedVars\nGeophysicalFlows.MultiLayerQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Params","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Params","text":"struct Params{T, Aphys3D, Aphys2D, Atrans4D, Trfft} <: AbstractParams\n\nThe parameters for the MultiLayerQG problem.\n\nnlayers::Int64: number of fluid layers\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nb::Tuple: array with Boussinesq buoyancy of each fluid layer\nH::Tuple: array with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Tuple: array with the reduced gravity constants for each fluid interface\nQx::Any: array containing x-gradient of PV due to eta in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nS::Any: array containing coeffients for getting PV from streamfunction\nS⁻¹::Any: array containing coeffients for inverting PV to streamfunction\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.SingleLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.SingleLayerParams","text":"struct SingleLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a single-layer MultiLayerQG problem.\n\nβ::Any: planetary vorticity y-gradient\nU::Any: array with imposed constant zonal flow U(y)\neta::Any: array containing the periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\nQx::Any: array containing x-gradient of PV due to topographic PV\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.TwoLayerParams","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.TwoLayerParams","text":"struct TwoLayerParams{T, Aphys3D, Aphys2D, Trfft} <: AbstractParams\n\nThe parameters for the a two-layer MultiLayerQG problem.\n\nf₀::Any: constant planetary vorticity\nβ::Any: planetary vorticity y-gradient\nb::Tuple: array with Boussinesq buoyancy of each fluid layer\nH::Tuple: tuple with rest height of each fluid layer\nU::Any: array with imposed constant zonal flow U(y) in each fluid layer\neta::Any: array containing periodic component of the topographic PV\ntopographic_pv_gradient::Tuple{T, T} where T: tuple containing the (x y) components of topographic PV large-scale gradient\nμ::Any: linear bottom drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcFq!::Function: function that calculates the Fourier transform of the forcing, F\ng′::Any: the reduced gravity constants for the fluid interface\nQx::Any: array containing x-gradient of PV due to topographic PV in each fluid layer\nQy::Any: array containing y-gradient of PV due to β, U, and topographic PV in each fluid layer\nrfftplan::Any: rfft plan for FFTs\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.Vars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.Vars","text":"struct Vars{Aphys, Atrans, F, P} <: AbstractVars\n\nThe variables for multi-layer QG problem.\n\nq: relative vorticity + vortex stretching\nψ: streamfunction\nu: x-component of velocity\nv: y-component of velocity\nqh: Fourier transform of relative vorticity + vortex stretching\nψh: Fourier transform of streamfunction\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFqh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.DecayingVars","text":"DecayingVars(grid, params)\n\nReturn the variables for an unforced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.ForcedVars","text":"ForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.MultiLayerQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.MultiLayerQG.StochasticForcedVars","text":"StochasticForcedVars(grid, params)\n\nReturn the variables for a forced multi-layer QG problem with grid and params.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#SurfaceQG","page":"Private types","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.SurfaceQG.Params\nGeophysicalFlows.SurfaceQG.Vars\nGeophysicalFlows.SurfaceQG.DecayingVars\nGeophysicalFlows.SurfaceQG.ForcedVars\nGeophysicalFlows.SurfaceQG.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Params","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Params","text":"Params{T}(ν, nν, calcF!)\n\nA struct containing the parameters for Surface QG dynamics. Included are:\n\nν::Any: buoyancy (hyper)-viscosity coefficient\nnν::Int64: buoyancy (hyper)-viscosity order\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.Vars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.Vars","text":"Vars{Aphys, Atrans, F, P}(b, u, v, bh, uh, vh, Fh, prevsol)\n\nThe variables for surface QG problem:\n\nb: buoyancy\nu: x-component of velocity\nv: y-component of velocity\nbh: Fourier transform of buoyancy\nuh: Fourier transform of x-component of velocity\nvh: Fourier transform of y-component of velocity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.DecayingVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.ForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.SurfaceQG.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.SurfaceQG.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced surface QG dynamics on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#BarotropicQGQL","page":"Private types","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/types/","page":"Private types","title":"Private types","text":"GeophysicalFlows.BarotropicQGQL.Params\nGeophysicalFlows.BarotropicQGQL.Vars\nGeophysicalFlows.BarotropicQGQL.DecayingVars\nGeophysicalFlows.BarotropicQGQL.ForcedVars\nGeophysicalFlows.BarotropicQGQL.StochasticForcedVars","category":"page"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Params","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Params","text":"Params{T, Aphys, Atrans}(β, eta, etah, μ, ν, nν, calcF!)\n\nA struct containing the parameters for a barotropic QL QG problem. Included are:\n\nβ::Any: planetary vorticity y-gradient\neta::Any: topographic potential vorticity\netah::Any: Fourier transform of topographic potential vorticity\nμ::Any: linear drag coefficient\nν::Any: small-scale (hyper)-viscosity coefficient\nnν::Int64: (hyper)-viscosity order, nν 1\ncalcF!::Function: function that calculates the Fourier transform of the forcing, F\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.Vars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.Vars","text":"Vars{Aphys, Atrans, F, P}(u, v, U, uzeta, vzeta, zeta, Zeta, psi, Psi, N, NZ, uh, vh, Uh, zetah, Zetah, psih, Psih, Fh, prevsol)\n\nThe variables for barotropic QL QG:\n\nu: x-component of small-scale velocity\nv: y-component of small-scale velocity\nU: x-component of large-scale velocity\nuzeta: small-scale uζ\nvzeta: small-scale vζ\nzeta: small-scale relative vorticity\nZeta: large-scale relative vorticity\npsi: small-scale streamfunction\nPsi: large-scale streamfunction\nNz: small-scale nonlinear term\nNZ: large-scale nonlinear term\nuh: Fourier transform of x-component of small-scale velocity\nvh: Fourier transform of y-component of small-scale velocity\nUh: Fourier transform of x-component of large-scale velocity\nzetah: Fourier transform of small-scale relative vorticity\nZetah: Fourier transform of large-scale relative vorticity\npsih: Fourier transform of small-scale relative vorticity\nPsih: Fourier transform of large-scale relative vorticity\nFh: Fourier transform of forcing\nprevsol: sol at previous time-step\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.DecayingVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.DecayingVars","text":"DecayingVars(grid)\n\nReturn the variables for unforced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.ForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.ForcedVars","text":"ForcedVars(grid)\n\nReturn the variables for forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"lib/types/#GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","page":"Private types","title":"GeophysicalFlows.BarotropicQGQL.StochasticForcedVars","text":"StochasticForcedVars(grid)\n\nReturn the variables for stochastically forced two-dimensional quasi-linear barotropic QG problem on grid.\n\n\n\n\n\n","category":"type"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betadecay.jl\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#singlelayerqg_betadecay_example","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence on a beta plane.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Install-dependencies","page":"Decaying barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie, Printf, Statistics, Random\"","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Let's-begin","page":"Decaying barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.04 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Physical-parameters","page":"Decaying barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.0 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Problem-setup","page":"Decaying barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Setting-initial-conditions","page":"Decaying barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 10 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E₀ = 0.08 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nq₀h = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. q₀h = ifelse(K < 6 * 2π/L, 0, q₀h)\n@. q₀h = ifelse(K > 10 * 2π/L, 0, q₀h)\n@. q₀h[1, :] = 0 # remove any power from zonal wavenumber k=0\nq₀h *= sqrt(E₀ / SingleLayerQG.energy(q₀h, vars, params, grid)) # normalize q₀ to have energy E₀\nq₀ = irfft(q₀h, grid.nx)\n\nSingleLayerQG.set_q!(prob, q₀)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Let's plot the initial vorticity and streamfunction. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"fig = Figure(resolution = (800, 360))\n\naxq = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial vorticity ∂v/∂x-∂u/∂y\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\naxψ = Axis(fig[1, 2];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"initial streamfunction ψ\",\n aspect = 1,\n limits = ((-grid.Lx/2, grid.Lx/2), (-grid.Ly/2, grid.Ly/2))\n )\n\nheatmap!(axq, x, y, Array(vars.q); colormap = :balance)\n\ncontourf!(axψ, x, y, Array(vars.ψ); colormap = :viridis)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Diagnostics","page":"Decaying barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Output","page":"Decaying barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_decayingbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Visualizing-the-simulation","page":"Decaying barotropic QG beta-plane turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We plot the vorticity and streamfunction and their corresponding zonal mean structure.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Lx, Ly = grid.Lx, grid.Ly\n\ntitle_q = Observable(@sprintf(\"vorticity, t = %.2f\", clock.t))\ntitle_ψ = \"streamfunction ψ\"\n\nfig = Figure(resolution=(800, 720))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = title_ψ, axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-2.1, 2.1), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\nq = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\nq̄ₘ = Observable(Array(vec(mean(vars.q, dims=1))))\nūₘ = Observable(Array(vec(mean(vars.u, dims=1))))\n\nheatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-12, 12))\n\nlevels = collect(range(-0.7, stop=0.7, length=20))\n\ncontourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.35, 0.35))\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₘ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle = :dash)\n\nlines!(axū, ūₘ, y; linewidth = 3)\nlines!(axū, 0y, y; lindewidth = 1, linestyle = :dash)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nframes = 0:round(Int, nsteps / nsubs)\n\nrecord(fig, \"singlelayerqg_betadecay.mp4\", frames, framerate = 12) do j\n if j % round(Int, nsteps/nsubs / 4) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n q̄ₘ[] = vec(mean(vars.q, dims=1))\n ūₘ[] = vec(mean(vars.u, dims=1))\n\n title_q[] = @sprintf(\"vorticity, t = %.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.90, E: 0.0800, Q: 4.9303, walltime: 0.00 min\nstep: 0500, t: 20, cfl: 0.75, E: 0.0787, Q: 1.8418, walltime: 0.16 min\nstep: 1000, t: 40, cfl: 0.75, E: 0.0785, Q: 1.2191, walltime: 0.28 min\nstep: 1500, t: 60, cfl: 0.88, E: 0.0784, Q: 1.0377, walltime: 0.40 min\nstep: 2000, t: 80, cfl: 0.82, E: 0.0783, Q: 0.9599, walltime: 0.51 min\n","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betadecay/#Save","page":"Decaying barotropic QG beta-plane turbulence","title":"Save","text":"","category":"section"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"Finally, we can save, e.g., the last snapshot via","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"savename = @sprintf(\"%s_%09d.png\", joinpath(plotpath, plotname), clock.step)\nsavefig(savename)","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betadecay/","page":"Decaying barotropic QG beta-plane turbulence","title":"Decaying barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"modules/barotropicqgql/#BarotropicQGQL","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"","category":"section"},{"location":"modules/barotropicqgql/#Basic-Equations","page":"BarotropicQGQL","title":"Basic Equations","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"This module solves the quasi-linear quasi-geostrophic barotropic vorticity equation on a beta plane of variable fluid depth H - h(x y). Quasi-linear refers to the dynamics that neglects the eddy–eddy interactions in the eddy evolution equation after an eddy–mean flow decomposition, e.g., ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"phi(x y t) = overlinephi(y t) + phi(x y t) ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where overline above denotes a zonal mean, overlinephi(y t) = int phi(x y t) 𝖽x L_x, and prime denotes deviations from the zonal mean. This approximation is used in many process-model studies of zonation, e.g., Farrell and Ioannou (2003), Srinivasan and Young (2012), and Constantinou et al. (2014).","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"As in the SingleLayerQG module, the flow is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). All flow fields can be obtained from the quasi-geostrophic potential vorticity (QGPV). Here, the QGPV is","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"underbracef_0 + beta y_textplanetary PV + underbracepartial_x v\n\t- partial_y u_textrelative vorticity + underbracefracf_0 hH_texttopographic PV ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The dynamical variable is the component of the vorticity of the flow normal to the plane of motion, zeta equiv partial_x v - partial_y u = nabla^2 psi. Also, we denote the topographic PV with eta equiv f_0 h H. After we apply the eddy-mean flow decomposition above, the QGPV dynamics are:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"beginaligned\n\tpartial_t overlinezeta + mathsfJ(overlinepsi overlinezeta + overlineeta) + overlinemathsfJ(psi zeta + eta) = underbrace- leftmu + nu(-1)^n_nu nabla^2n_nu\n\tright overlinezeta _textrmdissipation \n\tpartial_t zeta + mathsfJ(psi overlinezeta + overlineeta) + mathsfJ(overlinepsi zeta + eta) + underbracemathsfJ(psi zeta + eta) - overlinemathsfJ(psi zeta + eta)_textrmEENL + beta partial_x psi = \n\t = underbrace-leftmu + nu(-1)^n_nu nabla^2n_nu right zeta_textrmdissipation + F \nendaligned","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"where mathsfJ(a b) = (partial_x a)(partial_y b) - (partial_y a)(partial_x b). On the right hand side, F(x y t) is forcing (which is assumed to have zero zonal mean, overlineF = 0), mu is linear drag, and nu is hyperviscosity. Plain old viscosity corresponds to n_nu = 1.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Quasi-linear dynamics neglects the term eddy-eddy nonlinearity (EENL) term above.","category":"page"},{"location":"modules/barotropicqgql/#Implementation","page":"BarotropicQGQL","title":"Implementation","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta + eta)^textrmQL + beta fraci k_x𝐤^2 widehatzeta - left ( mu + nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The Jacobian is computed in the conservative form: mathsfJ(f g) = partial_y (partial_x f) g - partial_x (partial_y f) g. The superscript QL on the Jacobian term above denotes that triad interactions that correspond to the EENL term are removed.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.Equation","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.Equation","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional barotropic QG QL problem with parameters params and on grid. Linear operator L includes bottom drag μ, (hyper)-viscosity of order n_ν with coefficient ν and the β term:\n\nL = - μ - ν 𝐤^2 n_ν + i β k_x 𝐤² \n\nNonlinear term is computed via calcN! function.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"and the nonlinear terms are computed via","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.calcN!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.calcN!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ + η)^mathrmQL + F \n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/barotropicqgql/#Parameters-and-Variables","page":"BarotropicQGQL","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/barotropicqgql/#Helper-functions","page":"BarotropicQGQL","title":"Helper functions","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.updatevars!\nGeophysicalFlows.BarotropicQGQL.set_zeta!","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.updatevars!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.updatevars!","text":"updatevars!(sol, vars, params, grid)\nupdatevars!(prob)\n\nUpdate the vars of a problem prob that has grid and params with the solution in sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.set_zeta!","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.set_zeta!","text":"set_zeta!(prob, zeta)\nset_zeta!(sol, vars, grid, zeta)\n\nSet the solution sol as the transform of zeta and update variables vars on the grid.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/#Diagnostics","page":"BarotropicQGQL","title":"Diagnostics","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"The kinetic energy of the fluid is obtained via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.energy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.energy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.energy","text":"energy(sol, grid)\nenergy(prob)\n\nReturn the domain-averaged kinetic energy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"while the enstrophy via:","category":"page"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"GeophysicalFlows.BarotropicQGQL.enstrophy","category":"page"},{"location":"modules/barotropicqgql/#GeophysicalFlows.BarotropicQGQL.enstrophy","page":"BarotropicQGQL","title":"GeophysicalFlows.BarotropicQGQL.enstrophy","text":"enstrophy(sol, grid, vars)\nenstrophy(prob)\n\nReturn the domain-averaged enstrophy of sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"Other diagnostic include: dissipation, drag, and work.","category":"page"},{"location":"modules/barotropicqgql/#Examples","page":"BarotropicQGQL","title":"Examples","text":"","category":"section"},{"location":"modules/barotropicqgql/","page":"BarotropicQGQL","title":"BarotropicQGQL","text":"examples/barotropicqgql_betaforced.jl: Simulate forced-dissipative quasi-linear quasi-geostrophic flow on a beta plane demonstrating zonation. The forcing is temporally delta-correlated and its spatial structure is isotropic with power in a narrow annulus of total radius k_f in wavenumber space. This example demonstrates that the anisotropic inverse energy cascade is not required for zonation.","category":"page"},{"location":"modules/twodnavierstokes/#TwoDNavierStokes","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"modules/twodnavierstokes/#Basic-Equations","page":"TwoDNavierStokes","title":"Basic Equations","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"This module solves two-dimensional incompressible Navier-Stokes equations using the vorticity-streamfunction formulation. The flow bmu = (u v) is obtained through a streamfunction psi as (u v) = (-partial_y psi partial_x psi). The only non-zero component of vorticity is that normal to the plane of motion, partial_x v - partial_y u = nabla^2 psi. The module solves the two-dimensional vorticity equation:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t zeta + mathsfJ(psi zeta) = underbrace-left mu (-nabla^2)^n_mu\n+ nu (-nabla^2)^n_nu right zeta_textrmdissipation + F ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"where mathsfJ(psi zeta) = (partial_x psi)(partial_y zeta) - (partial_y psi)(partial_x zeta) is the two-dimensional Jacobian and F(x y t) is forcing. The Jacobian term is the advection of relative vorticity, mathsfJ(ψ ζ) = bmu cdot nabla zeta. Both ν and μ terms are viscosities; typically the former is chosen to act at small scales (n_ν 1), while the latter at large scales (n_ν 0). Plain old viscocity corresponds to n_ν=1 while n_μ=0 corresponds to linear drag. Values of n_ν 2 or n_μ -1 are referred to as hyper- or hypo-viscosities, respectively.","category":"page"},{"location":"modules/twodnavierstokes/#Implementation","page":"TwoDNavierStokes","title":"Implementation","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The equation is time-stepped forward in Fourier space:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"partial_t widehatzeta = - widehatmathsfJ(psi zeta) - left ( mu 𝐤^2n_mu\n+ nu 𝐤^2n_nu right ) widehatzeta + widehatF ","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The state variable sol is the Fourier transform of vorticity, ζh.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The Jacobian is computed in the conservative form: mathsfJ(a b) = partial_y (partial_x a) b - partial_x(partial_y a) b.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The linear operator is constructed in Equation","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.Equation","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.Equation","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.Equation","text":"Equation(params, grid)\n\nReturn the equation for two-dimensional Navier-Stokes with params and grid. The linear operator L includes (hyper)-viscosity of order n_ν with coefficient ν and hypo-viscocity of order n_μ with coefficient μ,\n\nL = - ν 𝐤^2 n_ν - μ 𝐤^2 n_μ \n\nPlain-old viscocity corresponds to n_ν = 1 while n_μ = 0 corresponds to linear drag.\n\nThe nonlinear term is computed via the function calcN!.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"The nonlinear terms are computed via calcN!,","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.calcN!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.calcN!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.calcN!","text":"calcN!(N, sol, t, clock, vars, params, grid)\n\nCalculate the nonlinear term, that is the advection term and the forcing,\n\nN = - widehat𝖩(ψ ζ) + F \n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"which in turn calls calcN_advection! and addforcing!.","category":"page"},{"location":"modules/twodnavierstokes/#Parameters-and-Variables","page":"TwoDNavierStokes","title":"Parameters and Variables","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"All required parameters are included inside Params and all module variables are included inside Vars.","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"For the decaying case (no forcing, F = 0), variables are constructed with Vars. For the forced case (F ne 0) variables are constructed with either ForcedVars or StochasticForcedVars.","category":"page"},{"location":"modules/twodnavierstokes/#Helper-functions","page":"TwoDNavierStokes","title":"Helper functions","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some helper functions included in the module are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.updatevars!\nGeophysicalFlows.TwoDNavierStokes.set_ζ!","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.updatevars!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.updatevars!","text":"updatevars!(prob)\n\nUpdate problem's variables in prob.vars using the state in prob.sol.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.set_ζ!","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.set_ζ!","text":"set_ζ!(prob, ζ)\n\nSet the solution sol as the transform of ζ and then update variables in prob.vars.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#Diagnostics","page":"TwoDNavierStokes","title":"Diagnostics","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Some useful diagnostics are:","category":"page"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"GeophysicalFlows.TwoDNavierStokes.energy\nGeophysicalFlows.TwoDNavierStokes.enstrophy","category":"page"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.energy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.energy","text":"energy(prob)\n\nReturn the domain-averaged kinetic energy. Since u² + v² = bf ψ², the domain-averaged kinetic energy is\n\nint frac12 bf ψ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ψ² \n\nwhere ψ is the streamfunction.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/#GeophysicalFlows.TwoDNavierStokes.enstrophy","page":"TwoDNavierStokes","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy,\n\nint frac12 ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"Other diagnostic include: energy_dissipation, energy_work, enstrophy_dissipation, and enstrophy_work.","category":"page"},{"location":"modules/twodnavierstokes/#Examples","page":"TwoDNavierStokes","title":"Examples","text":"","category":"section"},{"location":"modules/twodnavierstokes/","page":"TwoDNavierStokes","title":"TwoDNavierStokes","text":"examples/twodnavierstokes_decaying.jl: Simulates decaying two-dimensional turbulence reproducing the results by:\nexamples/twodnavierstokes_stochasticforcing.jl: Simulate forced-dissipative two-dimensional turbulence with isotropic temporally delta-correlated stochastic forcing.\nexamples/twodnavierstokes_stochasticforcing_budgets.jl: Simulate forced-dissipative two-dimensional turbulence demonstrating how we can compute the energy and enstrophy budgets.","category":"page"},{"location":"lib/functions/#Functions","page":"Functions","title":"Functions","text":"","category":"section"},{"location":"lib/functions/#GeophysicalFlows","page":"Functions","title":"GeophysicalFlows","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.GeophysicalFlows","category":"page"},{"location":"lib/functions/#GeophysicalFlows.GeophysicalFlows","page":"Functions","title":"GeophysicalFlows.GeophysicalFlows","text":"Main module for GeophysicalFlows.jl – a collection of solvers for geophysical fluid dynamics problems in periodic domains on CPUs and GPUs. All modules use Fourier-based pseudospectral methods and leverage the functionality of FourierFlows.jl ecosystem.\n\n\n\n\n\n","category":"module"},{"location":"lib/functions/#Exported-functions","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.lambdipole\nGeophysicalFlows.peakedisotropicspectrum","category":"page"},{"location":"lib/functions/#GeophysicalFlows.lambdipole","page":"Functions","title":"GeophysicalFlows.lambdipole","text":"lambdipole(U, R, grid::TwoDGrid; center=(mean(grid.x), mean(grid.y))\n\nReturn the two-dimensional vorticity field of the Lamb dipole with strength U and radius R, centered on center=(xc, yc) and on the grid. Default value for center is the center of the domain.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.peakedisotropicspectrum","page":"Functions","title":"GeophysicalFlows.peakedisotropicspectrum","text":"peakedisotropicspectrum(grid, kpeak, E₀; mask = ones(size(grid.Krsq)), allones = false)\n\nGenerate a random two-dimensional relative vorticity field q(x y) with Fourier spectrum peaked around a central non-dimensional wavenumber kpeak and normalized so that its total kinetic energy is E₀.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#TwoDNavierStokes","page":"Functions","title":"TwoDNavierStokes","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-2","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.Problem\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.energy_work\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity\nGeophysicalFlows.TwoDNavierStokes.enstrophy_work\nGeophysicalFlows.TwoDNavierStokes.palinstrophy","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.Problem","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n ν = 0,\n nν = 1,\n μ = 0,\n nμ = 0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a two-dimensional Navier-Stokes problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Large-scale (hypo)-viscosity coefficient.\nnμ: (Hypo)-viscosity order, nμ 0.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hyperviscosity","text":"energy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation_hypoviscosity","text":"energy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F,\n\n- int ψ F frac𝖽x 𝖽yL_x L_y = - sum_𝐤 ψ F^* \n\nwhere ψ is the stream flow.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hyperviscosity","text":"enstrophy_dissipation_hyperviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the ν (hyper)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation_hypoviscosity","text":"enstrophy_dissipation_hypoviscosity(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the μ (hypo)-viscosity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_work","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F,\n\nint ζ F frac𝖽x 𝖽yL_x L_y = sum_𝐤 ζ F^* \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.palinstrophy","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.palinstrophy","text":"palinstrophy(prob)\n\nReturn the problem's (prob) domain-averaged palinstrophy,\n\nint frac12 bf ζ² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 𝐤² ζ² \n\nwhere ζ is the relative vorticity.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!\nGeophysicalFlows.TwoDNavierStokes.addforcing!\nGeophysicalFlows.TwoDNavierStokes.energy_dissipation\nGeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","category":"page"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.calcN_advection!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ ζ) in conservative form, i.e., - _x(_y ψ)ζ - _y(_x ψ)ζ and store it in N:\n\nN = - widehat𝖩(ψ ζ) = - i k_x widehatu ζ - i k_y widehatv ζ \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.addforcing!","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.energy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.energy_dissipation","text":"energy_dissipation(prob, ξ, νξ)\n\nReturn the domain-averaged energy dissipation rate done by the viscous term,\n\n- ξ (-1)^n_ξ+1 int ψ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2(n_ξ-1) ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.TwoDNavierStokes.enstrophy_dissipation","text":"enstrophy_dissipation(prob, ξ, νξ)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate done by the viscous term,\n\nξ (-1)^n_ξ+1 int ζ ^2n_ξ ζ frac𝖽x 𝖽yL_x L_y = - ξ sum_𝐤 𝐤^2n_ξ ζ² \n\nwhere ξ and nξ could be either the (hyper)-viscosity coefficient ν and its order n_ν, or the hypo-viscocity coefficient μ and its order n_μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SingleLayerQG","page":"Functions","title":"SingleLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-3","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.Problem\nGeophysicalFlows.SingleLayerQG.streamfunctionfrompv!\nGeophysicalFlows.SingleLayerQG.energy_dissipation\nGeophysicalFlows.SingleLayerQG.energy_work\nGeophysicalFlows.SingleLayerQG.energy_drag\nGeophysicalFlows.SingleLayerQG.enstrophy\nGeophysicalFlows.SingleLayerQG.enstrophy_dissipation\nGeophysicalFlows.SingleLayerQG.enstrophy_work\nGeophysicalFlows.SingleLayerQG.enstrophy_drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n deformation_radius = Inf,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a single-layer quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\ndeformation_radius: Rossby radius of deformation; set Inf for purely barotropic.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the Fourier transform of PV qh to obtain the Fourier transform of the streamfunction ψh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_dissipation","text":"energy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged energy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_work","text":"energy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of energy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.energy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.energy_drag","text":"energy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy","text":"enstrophy(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy\n\nint frac12 (q + η)² frac𝖽x 𝖽yL_x L_y = sum_𝐤 frac12 q + η² \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_dissipation","text":"enstrophy_dissipation(prob)\n\nReturn the problem's (prob) domain-averaged enstrophy dissipation rate.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_work","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_work","text":"enstrophy_work(prob)\n\nReturn the problem's (prob) domain-averaged rate of work of enstrophy by the forcing F.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.enstrophy_drag","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.enstrophy_drag","text":"enstrophy_drag(prob)\n\nReturn the problem's (prob) extraction of domain-averaged enstrophy by drag/hypodrag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-2","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SingleLayerQG.calcN_advection!\nGeophysicalFlows.SingleLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ q+η) in conservative form, i.e., - _x(_y ψ)(q+η) - _y(_x ψ)(q+η) and store it in N:\n\nN = - widehat𝖩(ψ q + η) = - i k_x widehatu (q + η) - i k_y widehatv (q + η) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SingleLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SingleLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#MultiLayerQG","page":"Functions","title":"MultiLayerQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-4","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.Problem\nGeophysicalFlows.MultiLayerQG.fwdtransform!\nGeophysicalFlows.MultiLayerQG.invtransform!\nGeophysicalFlows.MultiLayerQG.streamfunctionfrompv!\nGeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.Problem","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.Problem","text":"Problem(nlayers :: Int,\n dev = CPU();\n nx = 128,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n f₀ = 1.0,\n β = 0.0,\n U = zeros(nlayers),\n H = 1/nlayers * ones(nlayers),\n b = -(1 .+ 1/nlayers * Array{Float64}(0:nlayers-1)),\n eta = nothing,\ntopographic_pv_gradient = (0, 0),\n μ = 0,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcFq = nothingfunction,\n stochastic = false,\n linear = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a multi-layer quasi-geostrophic problem with nlayers fluid layers on device dev.\n\nArguments\n\nnlayers: (required) Number of fluid layers.\ndev: (required) CPU() (default) or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nf₀: Constant planetary vorticity.\nβ: Planetary vorticity y-gradient.\nU: The imposed constant zonal flow U(y) in each fluid layer.\nH: Rest height of each fluid layer.\nb: Boussinesq buoyancy of each fluid layer.\neta: Periodic component of the topographic potential vorticity.\ntopographic_pv_gradient: The (x y) components of the topographic PV large-scale gradient.\nμ: Linear bottom drag coefficient.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false (default); boolean denoting whether calcF is temporally stochastic.\nlinear: true or false (default); boolean denoting whether the linearized equations of motions are used.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64 (default); floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.fwdtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.fwdtransform!","text":"fwdtransform!(varh, var, params)\n\nCompute the Fourier transform of var and store it in varh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.invtransform!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.invtransform!","text":"invtransform!(var, varh, params)\n\nCompute the inverse Fourier transform of varh and store it in var.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.streamfunctionfrompv!","text":"streamfunctionfrompv!(ψh, qh, params, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh in each layer from qh using ψh = params.S⁻¹ qh.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::SingleLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a single fluid layer configuration. In this case, ψ = - k² q.\n\n\n\n\n\nstreamfunctionfrompv!(ψh, qh, params::TwoLayerParams, grid)\n\nInvert the PV to obtain the Fourier transform of the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nψ₁ = - k² q₁ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nψ₂ = - k² q₂ + (f₀² g) (q₁ H₂ + q₂ H₁) Δ \n\nwhere Δ = k² k² + f₀² (H₁ + H₂) (g H₁ H₂).\n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.pvfromstreamfunction!","text":"pvfromstreamfunction!(qh, ψh, params, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh in each layer using qh = params.S * ψh.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::SingleLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a single fluid layer configuration. In this case, q = - k² ψ.\n\n\n\n\n\npvfromstreamfunction!(qh, ψh, params::TwoLayerParams, grid)\n\nObtain the Fourier transform of the PV from the streamfunction ψh for the special case of a two fluid layer configuration. In this case we have,\n\nq₁ = - k² ψ₁ + f₀² (g H₁) (ψ₂ - ψ₁) \n\nq₂ = - k² ψ₂ + f₀² (g H₂) (ψ₁ - ψ₂) \n\n(Here, the PV-streamfunction relationship is hard-coded to avoid scalar operations on the GPU.)\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-3","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.MultiLayerQG.LinearEquation\nGeophysicalFlows.MultiLayerQG.calcS!\nGeophysicalFlows.MultiLayerQG.calcS⁻¹!\nGeophysicalFlows.MultiLayerQG.calcNlinear!\nGeophysicalFlows.MultiLayerQG.calcN_advection!\nGeophysicalFlows.MultiLayerQG.calcN_linearadvection!\nGeophysicalFlows.MultiLayerQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.LinearEquation","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.LinearEquation","text":"LinearEquation(params, grid)\n\nReturn the equation for a multi-layer quasi-geostrophic problem with params and grid. The linear opeartor L includes only (hyper)-viscosity and is computed via hyperviscosity(params, grid).\n\nThe nonlinear term is computed via function calcNlinear!.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS!","text":"calcS!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊, which consists of nlayer x nlayer static arrays 𝕊_𝐤 that relate the q_j's and ψ_j's for every wavenumber: q_𝐤 = 𝕊_𝐤 ψ_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcS⁻¹!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcS⁻¹!","text":"calcS⁻¹!(S, Fp, Fm, nlayers, grid)\n\nConstruct the array 𝕊¹, which consists of nlayer x nlayer static arrays (𝕊_𝐤)¹ that relate the q_j's and ψ_j's for every wavenumber: ψ_𝐤 = (𝕊_𝐤)¹ q_𝐤.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcNlinear!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcNlinear!","text":"calcNlinear!(N, sol, t, clock, vars, params, grid)\n\nCompute the nonlinear term of the linearized equations:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j + widehat(_y ψ_j)(_x Q_j)\n- widehat(_x ψ_j)(_y Q_j) + δ_j n μ 𝐤^2 ψ_n + F_j \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_advection!","text":"calcN_advection!(N, sol, vars, params, grid)\n\nCompute the advection term and stores it in N:\n\nN_j = - widehat𝖩(ψ_j q_j) - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.calcN_linearadvection!","text":"calcN_linearadvection!(N, sol, vars, params, grid)\n\nCompute the advection term of the linearized equations and stores it in N:\n\nN_j = - widehatU_j _x Q_j - widehatU_j _x q_j\n + widehat(_y ψ_j)(_x Q_j) - widehat(_x ψ_j)(_y Q_j) \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.MultiLayerQG.addforcing!","page":"Functions","title":"GeophysicalFlows.MultiLayerQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F for each layer and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#SurfaceQG","page":"Functions","title":"SurfaceQG","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-5","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.Problem\nGeophysicalFlows.SurfaceQG.buoyancy_dissipation\nGeophysicalFlows.SurfaceQG.buoyancy_work","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.Problem","page":"Functions","title":"GeophysicalFlows.SurfaceQG.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n Lx = 2π,\n ny = nx,\n Ly = Lx,\n ν = 0,\n nν = 1,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a surface quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_dissipation","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_dissipation","text":"buoyancy_dissipation(prob)\n\nReturn the domain-averaged dissipation rate of surface buoyancy variance due to small scale (hyper)-viscosity,\n\n2 ν (-1)^n_ν int b ^2n_ν b frac𝖽x 𝖽yL_x L_y = - 2 ν sum_𝐤 𝐤^2n_ν b² \n\nwhere ν the (hyper)-viscosity coefficient ν and nν the (hyper)-viscosity order. In SQG, this is identical to twice the rate of kinetic energy dissipation\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.buoyancy_work","page":"Functions","title":"GeophysicalFlows.SurfaceQG.buoyancy_work","text":"buoyancy_work(prob)\nbuoyancy_work(sol, vars, grid)\n\nReturn the domain-averaged rate of work of buoyancy variance by the forcing,\n\nint 2 b F frac𝖽x 𝖽yL_x L_y = sum_𝐤 2 b F^* \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-4","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.SurfaceQG.calcN_advection!\nGeophysicalFlows.SurfaceQG.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.calcN_advection!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term, - 𝖩(ψ b) in conservative form, i.e., - _x(_y ψ)b - _y(_x ψ)b and store it in N:\n\nN = - widehat𝖩(ψ b) = - i k_x widehatu b - i k_y widehatv b \n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.SurfaceQG.addforcing!","page":"Functions","title":"GeophysicalFlows.SurfaceQG.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#BarotropicQGQL","page":"Functions","title":"BarotropicQGQL","text":"","category":"section"},{"location":"lib/functions/#Exported-functions-6","page":"Functions","title":"Exported functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.Problem\nGeophysicalFlows.BarotropicQGQL.dissipation\nGeophysicalFlows.BarotropicQGQL.work\nGeophysicalFlows.BarotropicQGQL.drag","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.Problem","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.Problem","text":"Problem(dev::Device = CPU();\n nx = 256,\n ny = nx,\n Lx = 2π,\n Ly = Lx,\n β = 0.0,\n eta = nothing,\n ν = 0.0,\n nν = 1,\n μ = 0.0,\n dt = 0.01,\n stepper = \"RK4\",\n calcF = nothingfunction,\n stochastic = false,\n aliased_fraction = 1/3,\n T = Float64)\n\nConstruct a quasi-linear barotropic quasi-geostrophic problem on device dev.\n\nArguments\n\ndev: (required) CPU() or GPU(); computer architecture used to time-step problem.\n\nKeyword arguments\n\nnx: Number of grid points in x-domain.\nny: Number of grid points in y-domain.\nLx: Extent of the x-domain.\nLy: Extent of the y-domain.\nβ: Planetary vorticity y-gradient.\neta: Topographic potential vorticity.\nν: Small-scale (hyper)-viscosity coefficient.\nnν: (Hyper)-viscosity order, nν 1.\nμ: Linear drag coefficient.\ndt: Time-step.\nstepper: Time-stepping method.\ncalcF: Function that calculates the Fourier transform of the forcing, F.\nstochastic: true or false; boolean denoting whether calcF is temporally stochastic.\naliased_fraction: the fraction of high-wavenumbers that are zero-ed out by dealias!().\nT: Float32 or Float64; floating point type used for problem data.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.dissipation","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.dissipation","text":"dissipation(prob)\ndissipation(sol, vars, params, grid)\n\nReturn the domain-averaged energy dissipation rate. nν must be >= 1.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.work","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.work","text":"work(prob)\nwork(sol, vars, params, grid)\n\nReturn the domain-averaged rate of work of energy by the forcing, params.Fh.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.drag","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.drag","text":"drag(prob)\ndrag(sol, vars, params, grid)\n\nReturn the extraction of domain-averaged energy by drag μ.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#Private-functions-5","page":"Functions","title":"Private functions","text":"","category":"section"},{"location":"lib/functions/","page":"Functions","title":"Functions","text":"GeophysicalFlows.BarotropicQGQL.calcN_advection!\nGeophysicalFlows.BarotropicQGQL.addforcing!","category":"page"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.calcN_advection!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.calcN_advection!","text":"calcN_advection!(N, sol, t, clock, vars, params, grid)\n\nCalculate the Fourier transform of the advection term for quasi-linear barotropic QG dynamics.\n\n\n\n\n\n","category":"function"},{"location":"lib/functions/#GeophysicalFlows.BarotropicQGQL.addforcing!","page":"Functions","title":"GeophysicalFlows.BarotropicQGQL.addforcing!","text":"addforcing!(N, sol, t, clock, vars, params, grid)\n\nWhen the problem includes forcing, calculate the forcing term F and add it to the nonlinear term N.\n\n\n\n\n\n","category":"function"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"EditURL = \"../../../examples/singlelayerqg_betaforced.jl\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#singlelayerqg_betaforced_example","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"A simulation of forced-dissipative barotropic quasi-geostrophic turbulence on a beta plane. The dynamics include linear drag and stochastic excitation.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Install-dependencies","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CUDA, JLD2, CairoMakie, Statistics\"","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Let's-begin","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"using GeophysicalFlows, CUDA, JLD2, CairoMakie, Random, Printf\n\nusing Statistics: mean\nusing LinearAlgebra: ldiv!\n\nparsevalsum = FourierFlows.parsevalsum\nrecord = CairoMakie.record # disambiguate between CairoMakie.record and CUDA.record","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Choosing-a-device:-CPU-or-GPU","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Numerical-parameters-and-time-stepping-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":" n = 128 # 2D resolution: n² grid points\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 8000 # total number of timesteps\n save_substeps = 10 # number of timesteps after which output is saved\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Physical-parameters","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"L = 2π # domain size\nβ = 10.0 # planetary PV gradient\nμ = 0.01 # bottom drag","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Forcing","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forcing","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We force the vorticity equation with stochastic excitation that is delta-correlated in time and while spatially homogeneously and isotropically correlated. The forcing has a spectrum with power in a ring in wavenumber space of radius k_f (forcing_wavenumber) and width δ_f (forcing_bandwidth), and it injects energy per unit area and per unit time equal to varepsilon. That is, the forcing covariance spectrum is proportional to exp-(bmk - k_f)^2 (2 δ_f^2).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"forcing_wavenumber = 14.0 * 2π/L # the forcing wavenumber, `k_f`, for a spectrum that is a ring in wavenumber space\nforcing_bandwidth = 1.5 * 2π/L # the width of the forcing spectrum, `δ_f`\nε = 0.001 # energy input rate by the forcing\n\ngrid = TwoDGrid(dev; nx=n, Lx=L)\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nforcing_spectrum = @. exp(-(K - forcing_wavenumber)^2 / (2 * forcing_bandwidth^2))\n@CUDA.allowscalar forcing_spectrum[grid.Krsq .== 0] .= 0 # ensure forcing has zero domain-average\n\nε0 = parsevalsum(forcing_spectrum .* grid.invKrsq / 2, grid) / (grid.Lx * grid.Ly)\n@. forcing_spectrum *= ε/ε0 # normalize forcing to inject energy at rate ε","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We reset of the random number generator for reproducibility","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if dev==CPU(); Random.seed!(1234); else; CUDA.seed!(1234); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Next we construct function calcF! that computes a forcing realization every timestep. For that, we call randn! to obtain complex numbers whose real and imaginary part are normally-distributed with zero mean and variance 1/2.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"function calcF!(Fh, sol, t, clock, vars, params, grid)\n randn!(Fh)\n @. Fh *= sqrt(forcing_spectrum) / sqrt(clock.dt)\n return nothing\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Problem-setup","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, β, μ, dt, stepper,\n calcF=calcF!, stochastic=true)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"First let's see how a forcing realization looks like. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"calcF!(vars.Fh, sol, 0.0, clock, vars, params, grid)\n\nfig = Figure()\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"a forcing realization\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nheatmap!(ax, x, y, Array(irfft(vars.Fh, grid.nx));\n colormap = :balance, colorrange = (-8, 8))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Setting-initial-conditions","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Our initial condition is simply fluid at rest.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"SingleLayerQG.set_q!(prob, device_array(dev)(zeros(grid.nx, grid.ny)))","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Diagnostics","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Create Diagnostic – energy and enstrophy are functions imported at the top.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps, freq=save_substeps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps, freq=save_substeps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Output","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"filepath = \".\"\nplotpath = \"./plots_forcedbetaturb\"\nplotname = \"snapshots\"\nfilename = joinpath(filepath, \"singlelayerqg_forcedbeta.jld2\")","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"if isfile(filename); rm(filename); end\nif !isdir(plotpath); mkdir(plotpath); end","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"get_sol(prob) = Array(prob.sol) # extracts the Fourier-transformed solution\n\nfunction get_u(prob)\n vars, grid, sol = prob.vars, prob.grid, prob.sol\n\n @. vars.qh = sol\n\n SingleLayerQG.streamfunctionfrompv!(vars.ψh, vars.qh, params, grid)\n\n ldiv!(vars.u, grid.rfftplan, -im * grid.l .* vars.ψh)\n\n return Array(vars.u)\nend\n\noutput = Output(prob, filename, (:qh, get_sol), (:u, get_u))","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We first save the problem's grid and other parameters so we can use them later.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveproblem(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"and then call saveoutput(output) once to save the initial state.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"saveoutput(output)","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Time-stepping-the-Problem-forward","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We time-step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"startwalltime = time()\n\nwhile clock.step <= nsteps\n if clock.step % 50save_substeps == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n stepforward!(prob, diags, save_substeps)\n SingleLayerQG.updatevars!(prob)\n\n if clock.step % save_substeps == 0\n saveoutput(output)\n end\nend\n\nsavediagnostic(E, \"energy\", output.path)\nsavediagnostic(Z, \"enstrophy\", output.path)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"step: 0000, t: 0, cfl: 0.00, E: 0.0000, Q: 0.0000, walltime: 0.00 min\nstep: 0500, t: 25, cfl: 0.55, E: 0.0182, Q: 2.6371, walltime: 0.04 min\nstep: 1000, t: 50, cfl: 0.61, E: 0.0293, Q: 2.8787, walltime: 0.06 min\nstep: 1500, t: 75, cfl: 0.67, E: 0.0364, Q: 2.8105, walltime: 0.08 min\nstep: 2000, t: 100, cfl: 0.87, E: 0.0403, Q: 2.6290, walltime: 0.10 min\nstep: 2500, t: 125, cfl: 0.83, E: 0.0433, Q: 2.7528, walltime: 0.12 min\nstep: 3000, t: 150, cfl: 0.91, E: 0.0446, Q: 2.6793, walltime: 0.14 min\nstep: 3500, t: 175, cfl: 0.77, E: 0.0455, Q: 2.6078, walltime: 0.16 min\nstep: 4000, t: 200, cfl: 0.71, E: 0.0455, Q: 2.6548, walltime: 0.18 min\nstep: 4500, t: 225, cfl: 0.78, E: 0.0458, Q: 2.6460, walltime: 0.19 min\nstep: 5000, t: 250, cfl: 0.89, E: 0.0473, Q: 2.7878, walltime: 0.21 min\nstep: 5500, t: 275, cfl: 0.90, E: 0.0480, Q: 2.7345, walltime: 0.23 min\nstep: 6000, t: 300, cfl: 0.87, E: 0.0482, Q: 2.8067, walltime: 0.25 min\nstep: 6500, t: 325, cfl: 0.74, E: 0.0478, Q: 2.7029, walltime: 0.27 min\nstep: 7000, t: 350, cfl: 0.86, E: 0.0461, Q: 2.5248, walltime: 0.29 min\nstep: 7500, t: 375, cfl: 0.78, E: 0.0465, Q: 2.6692, walltime: 0.31 min\nstep: 8000, t: 400, cfl: 0.74, E: 0.0456, Q: 2.5986, walltime: 0.33 min\n","category":"page"},{"location":"literated/singlelayerqg_betaforced/#Load-saved-output-and-visualize","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Load saved output and visualize","text":"","category":"section"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We now have output from our simulation saved in singlelayerqg_forcedbeta.jld2 which we can load to create a time series for the fields we are interested in.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"file = jldopen(output.path)\n\niterations = parse.(Int, keys(file[\"snapshots/t\"]))\nt = [file[\"snapshots/t/$i\"] for i ∈ iterations]\n\nqh = [file[\"snapshots/qh/$i\"] for i ∈ iterations]\nu = [file[\"snapshots/u/$i\"] for i ∈ iterations]\n\nE_t = file[\"diagnostics/energy/t\"]\nZ_t = file[\"diagnostics/enstrophy/t\"]\nE_data = file[\"diagnostics/energy/data\"]\nZ_data = file[\"diagnostics/enstrophy/data\"]\n\nx, y = file[\"grid/x\"], file[\"grid/y\"]\nnx, ny = file[\"grid/nx\"], file[\"grid/ny\"]\nLx, Ly = file[\"grid/Lx\"], file[\"grid/Ly\"]\n\nclose(file)","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We create a figure using Makie's Observables","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"n = Observable(1)\n\nqₙ = @lift irfft(qh[$n], nx)\nψₙ = @lift irfft(- Array(grid.invKrsq) .* qh[$n], nx)\nq̄ₙ = @lift real(ifft(qh[$n][1, :] / ny))\nūₙ = @lift vec(mean(u[$n], dims=1))\n\ntitle_q = @lift @sprintf(\"vorticity, μt = %.2f\", μ * t[$n])\n\nenergy = Observable([Point2f(E_t[1], E_data[1])])\nenstrophy = Observable([Point2f(Z_t[1], Z_data[1])])\n\nfig = Figure(resolution=(1000, 600))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\naxψ = Axis(fig[2, 1]; title = \"streamfunction ψ\", axis_kwargs...)\n\naxq̄ = Axis(fig[1, 2],\n xlabel = \"zonal mean vorticity\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-3, 3), (-Ly/2, Ly/2)))\n\naxū = Axis(fig[2, 2],\n xlabel = \"zonal mean u\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-0.5, 0.5), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 3],\n xlabel = \"μ t\",\n ylabel = \"energy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 0.055)))\n\naxZ = Axis(fig[2, 3],\n xlabel = \"μ t\",\n ylabel = \"enstrophy\",\n aspect = 1,\n limits = ((-0.1, 4.1), (0, 3.1)))\n\nheatmap!(axq, x, y, qₙ;\n colormap = :balance, colorrange = (-8, 8))\n\nlevels = collect(-0.32:0.04:0.32)\n\ncontourf!(axψ, x, y, ψₙ;\n levels, colormap = :viridis, colorrange = (-0.22, 0.22))\ncontour!(axψ, x, y, ψₙ;\n levels, color = :black)\n\nlines!(axq̄, q̄ₙ, y; linewidth = 3)\nlines!(axq̄, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axū, ūₙ, y; linewidth = 3)\nlines!(axū, 0y, y; linewidth = 1, linestyle=:dash)\n\nlines!(axE, energy; linewidth = 3)\nlines!(axZ, enstrophy; linewidth = 3, color = :red)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"We are now ready to animate all saved output.","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"frames = 1:length(t)\nrecord(fig, \"singlelayerqg_betaforced.mp4\", frames, framerate = 16) do i\n n[] = i\n\n energy[] = push!(energy[], Point2f(μ * E_t[i], E_data[i]))\n enstrophy[] = push!(enstrophy[], Point2f(μ * Z_t[i], Z_data[i]))\nend","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"","category":"page"},{"location":"literated/singlelayerqg_betaforced/","page":"Forced-dissipative barotropic QG beta-plane turbulence","title":"Forced-dissipative barotropic QG beta-plane turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"gpu/#GPU","page":"GPU","title":"GPU","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"GPU-functionality is enabled via FourierFlows.jl. For more information on how FourierFlows.jl handled with GPUs we urge you to the corresponding FourierFlows.jl documentation section .","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"All GeophysicalFlows.jl modules can be run on GPU by providing GPU() as the device (dev) argument in the problem constructors. For example,","category":"page"},{"location":"gpu/","page":"GPU","title":"GPU","text":"julia> GeophysicalFlows.TwoDNavierStokes.Problem(GPU())\nProblem\n ├─────────── grid: grid (on GPU)\n ├───── parameters: params\n ├────── variables: vars\n ├─── state vector: sol\n ├─────── equation: eqn\n ├────────── clock: clock\n └──── timestepper: RK4TimeStepper","category":"page"},{"location":"gpu/#Selecting-GPU-device","page":"GPU","title":"Selecting GPU device","text":"","category":"section"},{"location":"gpu/","page":"GPU","title":"GPU","text":"FourierFlows.jl can only utilize a single GPU. If your machine has more than one GPU available, then using functionality within CUDA.jl package enables you can choose the GPU device that FourierFlows.jl should use. The user is referred to the CUDA.jl Documentation; in particular, CUDA.devices and CUDA.CuDevice.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"EditURL = \"../../../examples/surfaceqg_decaying.jl\"","category":"page"},{"location":"literated/surfaceqg_decaying/#surfaceqg_decaying_example","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"A simulation of decaying surface quasi-geostrophic turbulence. We reproduce here the initial value problem for an elliptical vortex as done by Held et al. (1995).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/surfaceqg_decaying/#Install-dependencies","page":"Decaying Surface QG turbulence","title":"Install dependencies","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/surfaceqg_decaying/#Let's-begin","page":"Decaying Surface QG turbulence","title":"Let's begin","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean\nusing Random: seed!","category":"page"},{"location":"literated/surfaceqg_decaying/#Choosing-a-device:-CPU-or-GPU","page":"Decaying Surface QG turbulence","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/surfaceqg_decaying/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying Surface QG turbulence","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" n = 256 # 2D resolution = n²\nstepper = \"FilteredETDRK4\" # timestepper\n dt = 0.03 # timestep\n tf = 60 # length of time for simulation\n nsteps = Int(tf / dt) # total number of time-steps\n nsubs = round(Int, nsteps/100) # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/surfaceqg_decaying/#Physical-parameters","page":"Decaying Surface QG turbulence","title":"Physical parameters","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":" L = 2π # domain size\n ν = 1e-19 # hyper-viscosity coefficient\nnν = 4 # hyper-viscosity order","category":"page"},{"location":"literated/surfaceqg_decaying/#Problem-setup","page":"Decaying Surface QG turbulence","title":"Problem setup","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"prob = SurfaceQG.Problem(dev; nx=n, Lx=L, dt, stepper, ν, nν)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's define some shortcuts.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/surfaceqg_decaying/#Setting-initial-conditions","page":"Decaying Surface QG turbulence","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We initialize the buoyancy equation with an elliptical vortex.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"X, Y = gridpoints(grid)\nb₀ = @. exp(-(X^2 + 4Y^2))\n\nSurfaceQG.set_b!(prob, b₀)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's plot the initial condition. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when vars live on the GPU.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (500, 500))\n\nax = Axis(fig[1, 1],\n xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n title = \"buoyancy bₛ\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\nhm = heatmap!(ax, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[1, 2], hm)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Diagnostics","page":"Decaying Surface QG turbulence","title":"Diagnostics","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Create Diagnostics; buoyancy_variance, kinetic_energy and buoyancy_dissipation functions were imported at the top.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"B = Diagnostic(SurfaceQG.buoyancy_variance, prob; nsteps)\nKE = Diagnostic(SurfaceQG.kinetic_energy, prob; nsteps)\nDᵇ = Diagnostic(SurfaceQG.buoyancy_dissipation, prob; nsteps)\ndiags = [B, KE, Dᵇ] # A list of Diagnostics types passed to `stepforward!`. Diagnostics are updated every timestep.","category":"page"},{"location":"literated/surfaceqg_decaying/#Output","page":"Decaying Surface QG turbulence","title":"Output","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files). Define base filename so saved data can be distinguished from other runs","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"base_filename = string(\"SurfaceQG_decaying_n_\", n)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"\"SurfaceQG_decaying_n_256\"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We choose folder for outputing .jld2 files and snapshots (.png files).","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"datapath = \"./\"\nplotpath = \"./\"\n\ndataname = joinpath(datapath, base_filename)\nplotname = joinpath(plotpath, base_filename)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Do some basic file management,","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"if !isdir(plotpath); mkdir(plotpath); end\nif !isdir(datapath); mkdir(datapath); end","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"and then create Output.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nget_u(prob) = irfft(im * prob.grid.l .* sqrt.(prob.grid.invKrsq) .* prob.sol, prob.grid.nx)\n\nout = Output(prob, dataname, (:sol, get_sol), (:u, get_u))","category":"page"},{"location":"literated/surfaceqg_decaying/#Visualizing-the-simulation","page":"Decaying Surface QG turbulence","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We define a function that plots the buoyancy field and the time evolution of kinetic energy and buoyancy variance.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"b = Observable(Array(vars.b))\n\nke = Observable([Point2f(KE.t[1], KE.data[1])])\nb² = Observable([Point2f(B.t[1], B.data[1])])\n\ntitle_b = Observable(\"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t))\n\nfig = Figure(resolution = (900, 600))\n\naxb = Axis(fig[1:2, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = title_b,\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxE = Axis(fig[1, 2];\n xlabel = \"t\",\n limits = ((0, tf), (0, 2e-2)))\n\nheatmap!(axb, x, y, b;\n colormap = :deep, colorrange = (0, 1))\n\nhE = lines!(axE, ke; linewidth = 3)\nhb² = lines!(axE, b²; linewidth = 3)\n\nLegend(fig[2, 2], [hE, hb²], [\"kinetic energy ∫½(uₛ²+vₛ²)dxdy/L²\", \"buoyancy variance ∫bₛ²dxdy/L²\"])\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Time-stepping-the-Problem-forward-and-create-animation-by-updating-the-plot.","page":"Decaying Surface QG turbulence","title":"Time-stepping the Problem forward and create animation by updating the plot.","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"startwalltime = time()\n\nrecord(fig, \"sqg_ellipticalvortex.mp4\", 0:round(Int, nsteps/nsubs), framerate = 14) do j\n if j % (500 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log1 = @sprintf(\"step: %04d, t: %.1f, cfl: %.3f, walltime: %.2f min\",\n clock.step, clock.t, cfl, (time()-startwalltime)/60)\n\n log2 = @sprintf(\"buoyancy variance: %.2e, buoyancy variance dissipation: %.2e\",\n B.data[B.i], Dᵇ.data[Dᵇ.i])\n\n println(log1)\n\n println(log2)\n end\n\n b[] = vars.b\n\n ke[] = push!(ke[], Point2f(KE.t[KE.i], KE.data[KE.i]))\n b²[] = push!(b²[], Point2f(B.t[B.i], B.data[B.i]))\n\n title_b[] = \"buoyancy, t=\" * @sprintf(\"%.2f\", clock.t)\n\n stepforward!(prob, diags, nsubs)\n SurfaceQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"step: 0000, t: 0.0, cfl: 0.639, walltime: 0.00 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.28e-16\nstep: 0500, t: 15.0, cfl: 0.588, walltime: 0.08 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 4.07e-11\nstep: 1000, t: 30.0, cfl: 0.571, walltime: 0.13 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 5.59e-09\nstep: 1500, t: 45.0, cfl: 0.577, walltime: 0.18 min\nbuoyancy variance: 1.83e-02, buoyancy variance dissipation: 1.01e-08\nstep: 2000, t: 60.0, cfl: 0.574, walltime: 0.22 min\nbuoyancy variance: 1.82e-02, buoyancy variance dissipation: 1.12e-08\n","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"Let's see how all flow fields look like at the end of the simulation.","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"fig = Figure(resolution = (800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\naxb = Axis(fig[1, 1]; title = \"bₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxu = Axis(fig[1, 2]; title = \"uₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\naxv = Axis(fig[1, 3]; title = \"vₛ(x, y, t=\" * @sprintf(\"%.2f\", clock.t) * \")\", axis_kwargs...)\n\nhb = heatmap!(axb, x, y, Array(vars.b);\n colormap = :deep, colorrange = (0, 1))\n\nColorbar(fig[2, 1], hb, vertical = false)\n\nhu = heatmap!(axu, x, y, Array(vars.u);\n colormap = :balance, colorrange = (-maximum(abs.(vars.u)), maximum(abs.(vars.u))))\n\nColorbar(fig[2, 2], hu, vertical = false)\n\nhv = heatmap!(axv, x, y, Array(vars.v);\n colormap = :balance, colorrange = (-maximum(abs.(vars.v)), maximum(abs.(vars.v))))\n\nColorbar(fig[2, 3], hv, vertical = false)\n\nfig","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"(Image: )","category":"page"},{"location":"literated/surfaceqg_decaying/#Save","page":"Decaying Surface QG turbulence","title":"Save","text":"","category":"section"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"We can save the output at the end of the simulation by calling","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"saveoutput(out)","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"","category":"page"},{"location":"literated/surfaceqg_decaying/","page":"Decaying Surface QG turbulence","title":"Decaying Surface QG turbulence","text":"This page was generated using Literate.jl.","category":"page"},{"location":"#GeophysicalFlows.jl-Documentation","page":"Home","title":"GeophysicalFlows.jl Documentation","text":"","category":"section"},{"location":"#Overview","page":"Home","title":"Overview","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeophysicalFlows.jl is a collection of modules which leverage the FourierFlows.jl framework to provide solvers for problems in Geophysical Fluid Dynamics, on periodic domains using Fourier-based pseudospectral methods.","category":"page"},{"location":"#Examples","page":"Home","title":"Examples","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Examples aim to demonstrate the main functionalities of each module. Have a look at our Examples collection!","category":"page"},{"location":"","page":"Home","title":"Home","text":"note: Fourier transforms normalization\nFourier-based pseudospectral methods rely on Fourier expansions. Throughout the documentation we denote symbols with hat, e.g., hatu, to be the Fourier transform of u like, e.g.,u(x) = sum_k_x hatu(k_x) e^i k_x x The convention used in the modules is that the Fourier transform of a variable, e.g., u is denoted with uh (where the trailing h is there to imply \"hat\"). Note, however, that uh is obtained via a FFT of u and due to different normalization factors that the FFT algorithm uses, uh is not exactly the same as hatu above. Instead,hatu(k_x) = frac𝚞𝚑n_x e^i k_x x_0 where n_x is the total number of grid points in x and x_0 is the left-most point of our x-grid.Read more in the FourierFlows.jl Documentation; see Grids section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"info: Unicode\nOftentimes unicode symbols are used in modules for certain variables or parameters. For example, ψ is commonly used to denote the streamfunction of the flow, or ∂ is used to denote partial differentiation. Unicode symbols can be entered in the Julia REPL by typing, e.g., \\psi or \\partial followed by the tab key.Read more about Unicode symbols in the Julia Documentation.","category":"page"},{"location":"#Developers","page":"Home","title":"Developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The development of GeophysicalFlows.jl started during the 21st AOFD Meeting 2017 by Navid C. Constantinou and Gregory L. Wagner. Since then various people have contributed, including Lia Siegelman, Brodie Pearson, André Palóczy (see the example in FourierFlows.jl), and others.","category":"page"},{"location":"#Citing","page":"Home","title":"Citing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use GeophysicalFlows.jl in research, teaching, or other activities, we would be grateful if you could mention GeophysicalFlows.jl and cite our paper in JOSS:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Constantinou et al., (2021). GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs & GPUs. Journal of Open Source Software, 6(60), 3053, doi:10.21105/joss.03053.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The bibtex entry for the paper is:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{GeophysicalFlowsJOSS,\n doi = {10.21105/joss.03053},\n url = {https://doi.org/10.21105/joss.03053},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {60},\n pages = {3053},\n author = {Navid C. Constantinou and Gregory LeClaire Wagner and Lia Siegelman and Brodie C. Pearson and André Palóczy},\n title = {GeophysicalFlows.jl: Solvers for geophysical fluid dynamics problems in periodic domains on CPUs \\& GPUs},\n journal = {Journal of Open Source Software}\n}","category":"page"},{"location":"#Papers-using-GeophysicalFlows.jl","page":"Home","title":"Papers using GeophysicalFlows.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Parfenyev, V. (2024) Statistical analysis of vortex condensate motion in two-dimensional turbulence. Physics of Fluids, 36, 015148, doi:10.1063/5.0187030.\nLaCasce, J. H., Palóczy, A., and Trodahl, M. (2024). Vortices over bathymetry. Journal of Fluid Mechanics, 979, A32, doi:10.1017/jfm.2023.1084.\nDrivas, T. D. and Elgindi, T. M. (2023). Singularity formation in the incompressible Euler equation in finite and infinite time. EMS Surveys in Mathematical Sciences, 10(1), 1–100, doi:10.4171/emss/66.\nShokar, I. J. S., Kerswell, R. R., and Haynes, P. H. (2023) Stochastic latent transformer: Efficient modelling of stochastically forced zonal jets. arXiv preprint arXiv:2310.16741, doi:10.48550/arXiv.2310.16741.\nBischoff, T. and Deck, K. (2023) Unpaired downscaling of fluid flows with diffusion bridges. arXiv preprint arXiv:2305.01822, doi:10.48550/arXiv.2305.01822.\nSiegelman, L. and Young, W. R. (2023). Two-dimensional turbulence above topography: Vortices and potential vorticity homogenization. Proceedings of the National Academy of Sciences, 120(44), e2308018120, doi:10.1073/pnas.2308018120.\nBisits, J. I., Stanley G. J., and Zika, J. D. (2023). Can we accurately quantify a lateral diffusivity using a single tracer release? Journal of Physical Oceanography, 53(2), 647–659, doi:10.1175/JPO-D-22-0145.1.\nParfenyev, V. (2022) Profile of a two-dimensional vortex condensate beyond the universal limit. Phys. Rev. E, 106, 025102, doi:10.1103/PhysRevE.106.025102.\nSiegelman, L., Young, W. R., and Ingersoll, A. P. (2022). Polar vortex crystals: Emergence and structure Proceedings of the National Academy of Sciences, 119(17), e2120486119, doi:10.1073/pnas.2120486119.\nDolce, M. and Drivas, T. D. (2022). On maximally mixed equilibria of two-dimensional perfect fluids. Archive for Rational Mechanics and Analysis, 246, 735–770, doi:10.1007/s00205-022-01825-w.\nPalóczy, A. and LaCasce, J. H. (2022). Instability of a surface jet over rough topography. Journal of Physical Oceanography, 52(11), 2725-2740, doi:10.1175/JPO-D-22-0079.1.\nKarrasch, D. and Schilling, N. (2020). Fast and robust computation of coherent Lagrangian vortices on very large two-dimensional domains. The SMAI Journal of Computational Mathematics, 6, 101-124, doi:10.5802/smai-jcm.63.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"EditURL = \"../../../examples/singlelayerqg_decaying_topography.jl\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#singlelayerqg_decay_topography_example","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"An example of decaying barotropic quasi-geostrophic turbulence over topography.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Install-dependencies","page":"Decaying barotropic QG turbulence over topography","title":"Install dependencies","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"First let's make sure we have all required packages installed.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using Pkg\npkg\"add GeophysicalFlows, CairoMakie\"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Let's-begin","page":"Decaying barotropic QG turbulence over topography","title":"Let's begin","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's load GeophysicalFlows.jl and some other packages we need.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"using GeophysicalFlows, CairoMakie, Printf, Random\n\nusing Statistics: mean","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Choosing-a-device:-CPU-or-GPU","page":"Decaying barotropic QG turbulence over topography","title":"Choosing a device: CPU or GPU","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"dev = CPU() # Device (CPU/GPU)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Numerical-parameters-and-time-stepping-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Numerical parameters and time-stepping parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":" n = 128 # 2D resolution = n²\nstepper = \"FilteredRK4\" # timestepper\n dt = 0.05 # timestep\n nsteps = 2000 # total number of time-steps\n nsubs = 10 # number of time-steps for intermediate logging/plotting (nsteps must be multiple of nsubs)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Physical-parameters","page":"Decaying barotropic QG turbulence over topography","title":"Physical parameters","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"L = 2π # domain size","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Define the topographic potential vorticity, eta = f_0 h(x y)H. The topography here is an elliptical mount at (x y) = (1 1), and an elliptical depression at (x y) = (-1 -1).","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"σx, σy = 0.4, 0.8\ntopographicPV(x, y) = 3exp(-(x - 1)^2 / 2σx^2 - (y - 1)^2 / 2σy^2) - 2exp(- (x + 1)^2 / 2σx^2 - (y + 1)^2 / 2σy^2)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Problem-setup","page":"Decaying barotropic QG turbulence over topography","title":"Problem setup","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We initialize a Problem by providing a set of keyword arguments. We use stepper = \"FilteredRK4\". Filtered timesteppers apply a wavenumber-filter at every time-step that removes enstrophy at high wavenumbers and, thereby, stabilize the problem, despite that we use the default viscosity coefficient ν=0. Thus, we choose not to do any dealiasing by providing aliased_fraction=0.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"The topophic PV is prescribed via keyword argument eta.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"prob = SingleLayerQG.Problem(dev; nx=n, Lx=L, eta=topographicPV,\n dt, stepper, aliased_fraction=0)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and define some shortcuts","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"sol, clock, vars, params, grid = prob.sol, prob.clock, prob.vars, prob.params, prob.grid\nx, y = grid.x, grid.y\nLx, Ly = grid.Lx, grid.Ly","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and let's plot the topographic PV. Note that when plotting, we decorate the variable to be plotted with Array() to make sure it is brought back on the CPU when the variable lives on the GPU.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"η = Array(params.eta)\n\nfig = Figure()\nax = Axis(fig[1, 1];\n xlabel = \"x\",\n ylabel = \"y\",\n title = \"topographic PV η=f₀h/H\",\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ncontourf!(ax, x, y, η;\n levels = collect(-3:0.4:3), colormap = :balance, colorrange = (-3, 3))\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Setting-initial-conditions","page":"Decaying barotropic QG turbulence over topography","title":"Setting initial conditions","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Our initial condition consist of a flow that has power only at wavenumbers with 6 fracL2pi sqrtk_x^2 + k_y^2 12 and initial energy E_0. device_array() function returns the array type appropriate for the device, i.e., Array for dev = CPU() and CuArray for dev = GPU().","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E₀ = 0.04 # energy of initial condition\n\nK = @. sqrt(grid.Krsq) # a 2D array with the total wavenumber\n\nRandom.seed!(1234)\nqih = device_array(dev)(randn(Complex{eltype(grid)}, size(sol)))\n@. qih = ifelse(K < 6 * 2π/L, 0, qih)\n@. qih = ifelse(K > 12 * 2π/L, 0, qih)\nqih *= sqrt(E₀ / SingleLayerQG.energy(qih, vars, params, grid)) # normalize qi to have energy E₀\nqi = irfft(qih, grid.nx)\n\nSingleLayerQG.set_q!(prob, qi)","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Let's plot the initial vorticity and streamfunction.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"q = Observable(Array(vars.q))\nψ = Observable(Array(vars.ψ))\n\nfig = Figure(resolution=(800, 380))\n\naxis_kwargs = (xlabel = \"x\",\n ylabel = \"y\",\n aspect = 1,\n limits = ((-Lx/2, Lx/2), (-Ly/2, Ly/2)))\n\ntitle_q = Observable(\"initial vorticity ∂v/∂x-∂u/∂y\")\naxq = Axis(fig[1, 1]; title = title_q, axis_kwargs...)\n\ntitle_ψ = Observable(\"initial streamfunction ψ\")\naxψ = Axis(fig[1, 3]; title = title_ψ, axis_kwargs...)\n\nhm = heatmap!(axq, x, y, q;\n colormap = :balance, colorrange = (-8, 8))\n\nColorbar(fig[1, 2], hm)\n\nlevels = collect(range(-0.28, stop=0.28, length=11))\n\nhc = contourf!(axψ, x, y, ψ;\n levels, colormap = :viridis, colorrange = (-0.28, 0.28),\n extendlow = :auto, extendhigh = :auto)\ncontour!(axψ, x, y, ψ;\n levels, color = :black)\n\nColorbar(fig[1, 4], hc)\n\nfig","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Diagnostics","page":"Decaying barotropic QG turbulence over topography","title":"Diagnostics","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Create Diagnostics – energy and enstrophy functions are imported at the top.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"E = Diagnostic(SingleLayerQG.energy, prob; nsteps)\nZ = Diagnostic(SingleLayerQG.enstrophy, prob; nsteps)\ndiags = [E, Z] # A list of Diagnostics types passed to \"stepforward!\" will be updated every timestep.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Output","page":"Decaying barotropic QG turbulence over topography","title":"Output","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We choose folder for outputing .jld2 files.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"filepath = \".\"\nfilename = joinpath(filepath, \"decayingbetaturb.jld2\")","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"Do some basic file management,","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"if isfile(filename); rm(filename); end","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"and then create Output.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"get_sol(prob) = prob.sol # extracts the Fourier-transformed solution\nout = Output(prob, filename, (:sol, get_sol))","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Visualizing-the-simulation","page":"Decaying barotropic QG turbulence over topography","title":"Visualizing the simulation","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We modify the figure with the initial state slightly by adding the topography contours and mark the time in the title.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"contour!(axq, x, y, η;\n levels = collect(0.5:0.5:3), linewidth = 2, color = (:black, 0.5))\n\ncontour!(axq, x, y, η;\n levels = collect(-2:0.5:-0.5), linewidth = 2, color = (:grey, 0.7), linestyle = :dash)\n\ntitle_q[] = \"vorticity, t=\" * @sprintf(\"%.2f\", clock.t)\ntitle_ψ[] = \"streamfunction ψ\"\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/#Time-stepping-the-Problem-forward","page":"Decaying barotropic QG turbulence over topography","title":"Time-stepping the Problem forward","text":"","category":"section"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"We step the Problem forward in time.","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"startwalltime = time()\n\nrecord(fig, \"singlelayerqg_decaying_topography.mp4\", 0:round(Int, nsteps/nsubs), framerate = 12) do j\n if j % (1000 / nsubs) == 0\n cfl = clock.dt * maximum([maximum(vars.u) / grid.dx, maximum(vars.v) / grid.dy])\n\n log = @sprintf(\"step: %04d, t: %d, cfl: %.2f, E: %.4f, Q: %.4f, walltime: %.2f min\",\n clock.step, clock.t, cfl, E.data[E.i], Z.data[Z.i], (time()-startwalltime)/60)\n\n println(log)\n end\n\n q[] = vars.q\n ψ[] = vars.ψ\n\n title_q[] = \"vorticity, t=\"*@sprintf(\"%.2f\", clock.t)\n title_ψ[] = \"streamfunction ψ\"\n\n stepforward!(prob, diags, nsubs)\n SingleLayerQG.updatevars!(prob)\nend","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"step: 0000, t: 0, cfl: 0.76, E: 0.0385, Q: 3.1410, walltime: 0.00 min\nstep: 1000, t: 50, cfl: 0.67, E: 0.0375, Q: 0.6276, walltime: 0.24 min\nstep: 2000, t: 100, cfl: 0.70, E: 0.0374, Q: 0.3566, walltime: 0.46 min\n","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"(Image: )","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"","category":"page"},{"location":"literated/singlelayerqg_decaying_topography/","page":"Decaying barotropic QG turbulence over topography","title":"Decaying barotropic QG turbulence over topography","text":"This page was generated using Literate.jl.","category":"page"},{"location":"assets/README/#a-placeholder-directory-for-output-generated-by-Docs","page":"-","title":"a placeholder directory for output generated by Docs","text":"","category":"section"}] +} diff --git a/v0.16.1/siteinfo.js b/v0.16.1/siteinfo.js new file mode 100644 index 00000000..afd23cc7 --- /dev/null +++ b/v0.16.1/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v0.16.1"; diff --git a/v0.16.1/stochastic_forcing/index.html b/v0.16.1/stochastic_forcing/index.html new file mode 100644 index 00000000..2e56f3b2 --- /dev/null +++ b/v0.16.1/stochastic_forcing/index.html @@ -0,0 +1,165 @@ + +Stochastic forcing · GeophysicalFlows.jl

    Stochastic Forcing

    Forcing terms are implemented in various modules. Forcing can be either deterministic or stochastic (random). For deterministic forcing the implementation is straightforward; for stochastic forcing there are two main train of thoughts: Itô calculus and Stratonovich calculus.

    Both stochastic calculi give the same results. But once we decide to use one of the two calculi we have to remain consistent and use that calculus throughout. There can be a lot of confusion and oftentimes confusion stems from mixing the two different stochastic calculi in a single computation instead of using one of the two consistently all along.

    Itô or Stratonovich in GeophysicalFlows.jl?

    All modules included in GeophysicalFlows.jl use Stratonovich calculus.

    The choice of Stratonovich calculus for GeophysicalFlows.jl was made since this calculus "works the same" with both stochastic and deterministic forcing, i.e., with Stratonovich calculus we have the same chain rules for differentiation for stochastic functions as the chain rules we learn in normal-deterministic calculus). Therefore, with the Stratonovich calculus the code does not really "care" whether the user implement deterministic or stochastic forcing.

    If you are interested in learning more regarding the two stochastic calculi and how they are numerically implemented then read on; otherwise you can skip this section of the documentation.

    Stochastic Differential Equations (SDEs)

    A differential equation:

    \[ \frac{\mathrm{d} x}{\mathrm{d} t} = f(x) , \quad x(t_0) = 0,\]

    can also be equivalently written in an integral form:

    \[ x(t) = \int_{t_0}^t f(x(s)) \, \mathrm{d} s.\]

    In a similar manner, a stochastic differential equation (SDE),

    \[ \mathrm{d} x = f(x) \, \mathrm{d} t + g(x) \, \mathrm{d} W_t , \quad x(t_0) = 0 ,\]

    with $W_t$ a Brownian motion or Wiener process, can be written in an integral form as:

    \[ x(t) = \int_{t_0}^{t} f(x(s)) \, \mathrm{d} s + \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s .\]

    Wiener process

    A Wiener process is a random variable $W_t$ that depends continuously on $t \ge 0$ and satisfies the following properties:

    1. Independence. For $0 \le s \le t$ the increment $W_t - W_s$ is independent of any prior values, i.e., independent of all $W_\tau$, $\tau \le s$.
    2. Stationarity. The statistical distribution of the increment $W_{t+s} − W_s$ does not depend on $s$ (and so is identical in distribution to $W_t$).
    3. Gaussianity. $W_t$ is a Gaussian process with mean $\langle W_t \rangle = 0$ and covariance $\langle W_t W_s \rangle = \min(t, s)$.
    Notation

    It's common to use notation $x_t$ to denote explicit $t$-dependence of variable $x$. Not to be confused with the other common usage of subscripts for denoting partial differentiation.

    The last integral in the integral representation of a SDE expression above is a stochastic integral (it involves a stochastic differential, $\mathrm{d} W_t$). There is not a single straight-forward way for computing the value of a stochastic integral. The various ways we can approximate the value of a stochastic integral as a Riemannian sum each lead to a different answer. The two most popular ways for computing such stochastic integrals are:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green}\int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left ( x(t_j) \right )(W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} \int_{t_0}^{t} g(x(s)) \, \mathrm{d} W_s \approx \sum_{j} g \left (x \left (\tfrac{1}{2}(t_j + t_{j+1}) \right ) \right)(W_{j+1} - W_j)} . +\end{aligned}\]

    The difference in the two calculi above lies in the point at which we choose to evaluate $g(x)$: we take the start of the time-interval for ${\color{Green} \text{Itô, } t_j}$, while we use the mid-point for ${\color{Magenta}\text{Stratonovich, } \tfrac{1}{2}(t_j+t_{j+1})}$. In the case the stochastic noise is additive, i.e., its prefactor $g$ does not depend on the state $x_t$, then the two interpretations coincide. When the noise does depend on the state of the system, i.e., $g=g(x(t))$, then the two interpretations above give thoroughly different results. This happens because the white noise process is not continuous and, therefore, the two interpretations of the stochastic integrals above do not converge to the same result.

    To overcome this apparent inconsistency, the two choices above come together with different chain rules, i.e., chain rules that are not necessarily the same as those in plain old calculus. Let us see how different choices for computing the stochastic integrals bring about the need for different chain rules.

    An SDE can be written also in differential form. Because we cannot formally form the derivative $\mathrm{d} W / \mathrm{d} t$, since $W$ is nowhere differentiable, we write an SDE in differential form as:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} x_t = f(x_t) \mathrm{d} t + g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The circle in the term ${\color{Magenta}g(x_t) \circ \mathrm{d} W_t}$ is used to differentiate between Itô and Stratonovich calculus.

    Let's now assume we perform a variable change $y = G(x)$. It turns out that according to which interpretation of the stochastic integral one chooses to use, then the following chain rule must be used:

    \[\begin{aligned} +{\color{Green}\text{Itô}} &: {\color{Green}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \mathrm{d} t = \left[ \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) + \frac{1}{2} g(x_t)^2 \frac{\mathrm{d}^2 G}{\mathrm{d} x^2} \right] \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \mathrm{d} W_t} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\mathrm{d} y_t = \frac{\mathrm{d} G}{\mathrm{d} x} \mathrm{d} x_t = \frac{\mathrm{d} G}{\mathrm{d} x} f(x_t) \mathrm{d} t + \frac{\mathrm{d} G}{\mathrm{d} x} g(x_t) \circ \mathrm{d} W_t} . +\end{aligned}\]

    The above are the so-called stochastic chain rules. All derivatives of $G$ are evaluated at $x_t$. For Stratonovich calculus, the chain rule resembles the usual chain rule one learns in calculus; for Itô there exists an additional term, often referred to as the "drift-term": ${\color{Green}\tfrac{1}{2} g^2 \, \mathrm{d}^2G / \mathrm{d} x^2}$.

    It's easy to see that the extra drift-term in Itô's interpretation of the stochastic integral, is exactly equal to the ensemble mean over forcing realizations of the Stratonovich stochastic integral. That's because the Itô stochastic integral has, by construction, zero ensemble mean since at every instant the noise is multiplied with $g$ which is evaluated at a time instance before the action of the noise; $g$ and $\mathrm{d} W$ are uncorrelated and thus:

    \[{\color{Green} \left \langle g(x_t) \mathrm{d} W_t \right \rangle = 0} \quad \text{while} \quad {\color{Magenta} \left \langle g(x_t) \circ \mathrm{d} W_t \right \rangle \ne 0} .\]

    The above is demonstrated by evaluating the simple stochastic integral:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} \left \langle \int_{t_0}^{t} W_s \, \mathrm{d} W_s \right \rangle \approx \sum_{j} \left \langle W_j (W_{j+1} - W_j) \right \rangle} \\ +& \hspace{7.3em} {\color{Green} = \sum_j \left \langle W_j W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \sum_{j} t_j - t_j = 0} , \\ +{\color{Magenta}\text{Stratonovich}} &: {\color{Magenta}\left \langle \int_{t_0}^{t} W_s \circ \mathrm{d} W_s \right \rangle \approx \sum_j \left \langle \frac1{2}(W_j + W_{j+1}) (W_{j+1} - W_j)\right \rangle} \\ +& \hspace{7.3em} {\color{Magenta} = \frac1{2} \sum_j \left \langle W_{j+1} W_{j+1} \right \rangle - \left \langle W_j W_j \right \rangle \sim \frac1{2} \sum_j t_{j+1} - t_j = \frac{t}{2}} . +\end{aligned}\]

    SDEs rarely can be solved in closed form; most often numerical solution of SDEs is brought to the rescue. Itô calculus has the advantage that is very easily implemented numerically. On the other hand, the chain rule in Stratonovich calculus coincides with that in normal calculus. This stems from the fact that in the Stratonovich interpretation the white noise process is as a series of colored noise processes with the de-correlation time tending to zero. This made Stratonovich calculus more popular in the physics community. A nice discussion on the differences and similarities between the two calculi is given by Van Kampen (1981).

    A simple Stochastic Differential Equation: the Ornstein–Uhlenbeck process

    One of the simplest SDEs is the Ornstein–Uhlenbeck process, a variation of which is:

    \[x(t) = - \int_{t_0}^{t} \mu x(s) \, \mathrm{d} s + \int_{t_0}^{t} \sqrt{\sigma} \, \mathrm{d} W_s . \tag{1}\]

    Note that in differential form (1) is written as:

    \[\mathrm{d} x_t = - \mu x_t \, \mathrm{d} t + \sqrt{\sigma} \, \mathrm{d} W_t . \tag{2}\]

    Luckily, for (2) we don't need to distinguish between Itô and Stratonovich, since $g$ is independent of $x(t)$. But note that often this is not the case; that $g$ is independent of $x(t)$ is only a fortuitous coincident for this particular SDE.

    How do we time-step SDE (2) numerically? Let us assume a discretization of time into time-steps of duration $\tau$, i.e., $t_j = (j-1) \tau$, $j=1, 2, \dots$. (What follows is easily generalized to non-uniform time discretizations.) With that in mind, we denote $x_j \equiv x(t_j)$. Then the Euler–Mayorama time-stepping scheme for (2) is

    \[ x_{j+1} = x_j + (-\mu x_j) \tau + \sqrt{\sigma} (W_{j+1} - W_j) .\]

    Now let us ask the following question: How can we compute the work done by the noise? In other words, if we are interested in the evolution of the "energy", defined as $E \equiv \tfrac{1}{2} x^2$, then how does the noise term attribute in the growth of $E$? To answer that we first have to find the SDE that energy $E$ obeys. But, in doing so, it is important to adopt a single interpretation for computing stochastic integrals as now a transformation of variables is needed. That is, depending on whether we choose to interpret the stochastic integrals according to Itô or to Stratonovich calculus, $E$ evolves according to:

    \[\hspace{3.35em} {\color{Green} \text{Itô}} : {\color{Green} \mathrm{d} E_t = \left ( -2 \mu E_t + \tfrac{1}{2} \sigma \right ) \mathrm{d} t + x_t \sqrt{\sigma} \mathrm{d} W_t} , \tag{3}\]

    \[\hspace{-3.35em} {\color{Magenta} \text{Stratonovich}} : {\color{Magenta} \mathrm{d} E_t = -2 \mu E_t \mathrm{d} t + x_t \circ \sqrt{\sigma} \mathrm{d} W_t} . \tag{4}\]

    The term $-2 \mu E_t$ in both cases is the dissipation of energy by the $\mu$ term; the rest of the terms involve the noise. How do we compute the work $P$ done by the noise? Well, it follows that:

    \[\begin{aligned} +{\color{Green} \text{Itô}} &: {\color{Green} P_t = \tfrac{1}{2} \sigma \mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t \approx \tfrac{1}{2} \sigma \, \mathrm{d}t + \sqrt{\sigma} x_j (W_{j+1} - W_j)} , \\ +{\color{Magenta} \text{Stratonovich}} &: {\color{Magenta} P_t = x_t \circ \sqrt{\sigma} \mathrm{d} W_t \approx \sqrt{\sigma} x \left ( \tfrac{1}{2} (t_j + t_{j+1}) \right ) (W_{j+1} - W_j)} . +\end{aligned}\]

    Now let's assume for a moment that we didn't know the rules for transforming Stratonovich to Itô and we were wondering what is the extra drift term we have to include in the Itô formulations, i.e., the $\tfrac{1}{2} \sigma$ term. We can compute the Itô's drift-term using the fact that it is exactly equal to $\langle x_t \circ \sqrt{\sigma} \mathrm{d} W_t \rangle$; and for the latter we can use the "usual" calculus. That is, we rewrite (1) as:

    \[\dot{x} = -\mu x + \xi , \tag{5}\]

    where $\xi(t)$ is understood to be the "continuous" version of the white-noise process (which is formally only understood in terms of distributions). The forcing $\xi$ has the properties:

    \[\left \langle \xi(t) \right \rangle = 0 \quad \text{and} \quad \left \langle \xi(t) \xi(t') \right \rangle = \sigma \delta(t - t') .\]

    Thus we need to compute $\langle P_t \rangle = \langle x(t) \xi(t) \rangle$. But (5) formally has the solution:

    \[x(t) = e^{-\mu t} x(0) + \int_0^t e^{-\mu (t - s)} \xi(s) \, \mathrm{d} s .\]

    and using this solution we get

    \[\langle P_t \rangle = \langle x(t) \xi(t) \rangle = e^{-\mu t} \underbrace{\langle x(0) \xi(t) \rangle}_{=0} + \int_0^t e^{-\mu (t - s)} \langle \xi(t) \xi(s) \rangle \, \mathrm{d} s = \sigma \int_0^t e^{- \mu (t - s)} \delta(t - s) \, \mathrm{d} s = \frac{\sigma}{2} .\]

    Above we used that $\int_0^t \delta(t - s) \mathrm{d} s = \tfrac{1}{2}$, which is consistent with the Stratonovich symmetric interpretation of stochastic integrals.

    Numerical implementation

    How do we time-step the equation for $E$? In the case of Itô's interpretation, (3), we use the Euler–Maruyama time-stepping scheme:

    \[ E_{j+1} = E_j + \left ( -2 \mu E_j + \frac{\sigma}{2} \right ) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j).\]

    However, we cannot use Euler–Maruyama for time-stepping the corresponding Stratonovich version of (4), since the Euler–Maruyama scheme involves "Itô"-thinking. To time-step (4) we have to approximate $g$ in the middle of the time-step. There are many ways to do that, one of which is the, so called, Euler–Heun method:

    \[\begin{aligned} +\widetilde{E}_{j+1} &= E_j + (- 2\mu E_j) \tau + \sqrt{\sigma} x_j (W_{j+1} - W_j), \\ +E_{j+1} &= E_j + \left( -2 \mu \frac{E_j + \widetilde{E}_{j + 1}}{2} \right)\tau + \sqrt{\sigma}\frac{x_j + x_{j+1}}{2} (W_{j+1} - W_j) . +\end{aligned}\]

    Let's apply not Euler–Maruyama and Euler–Heun schemes to time-step (3) and (4) respectively and compare the results with those obtained from time-stepping (2) and computing $E$ a posteriori.

    Figure below compares the energy evolution as predicted by:

    • direct computation from the $x_t$ time-series: $\tfrac{1}{2} x_t^2$,
    • time-integration of (3) using Euler–Maruyama, and
    • time-integration of (4) using Euler–Heun.
    using CairoMakie
    +using Statistics: mean
    +using Random: randn, seed!
    +seed!(1234) # for reproducing the same plots
    +
    +                μ = 0.2
    +                σ = 0.2    # noise strength
    +               dt = 0.01   # timestep
    +           nsteps = 2001   # total timesteps
    +   n_realizations = 1000   # how many forcing realizations
    +some_realizations = 20     # used for plotting to illustrate convergence
    +
    +t = 0:dt:(nsteps-1)*dt 	# time
    +
    +ΔW = randn(nsteps, n_realizations) * sqrt(dt) # noise
    +
    +# Numerical calculation
    +x = zeros(size(ΔW))
    +E_ito = zeros(size(ΔW))
    +E_str = zeros(size(ΔW))
    +E_numerical = zeros(size(ΔW))
    +
    +for j = 2:nsteps # time step the equations
    +
    +  # time-step dx = - μ x dt + √σ dW
    +  @. x[j, :] = x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +
    +  # time-step dE = (- 2μ E + ½σ) dt + √σ x dW
    +  @. E_ito[j, :] = E_ito[j-1, :] + (-2μ * E_ito[j-1, :]
    +	                   + σ/2) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +
    +  # time-step dE = - 2μ E dt + √σ x ∘ dW
    +  xbar = @. x[j-1, :] - μ * x[j-1, :] * dt + sqrt(σ) * ΔW[j-1, :]
    +  Ebar = @. E_str[j-1, :] + (-2μ * E_str[j-1, :]) * dt + sqrt(σ) * x[j-1, :] * ΔW[j-1, :]
    +  @. E_str[j, :] = E_str[j-1, :] + (-2μ * (E_str[j-1, :]
    +		+ Ebar) / 2) * dt + sqrt(σ) * (x[j-1, :] + xbar) / 2 * ΔW[j-1, :]
    +end
    +
    +# direct computation of E from x
    +@. E_numerical = 0.5 * x^2
    +
    +# compare the three E(t) solutions
    +fig = Figure()
    +ax = Axis(fig[1, 1];
    +          xlabel = "μ t",
    +          ylabel = "E",
    +          title = "comparison of E(t) for single realization")
    +
    +hl1 = lines!(ax, μ * t, E_numerical[:, 1];
    +             linewidth = 3, linestyle = :solid)
    +hl2 = lines!(ax, μ * t, E_ito[:, 1];
    +             linewidth = 2, linestyle = :dash)
    +hl3 = lines!(ax, μ * t, E_str[:, 1];
    +             linewidth = 1, linestyle = :dashdot)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3], ["½ xₜ²", "Eₜ (Ito)", "Eₜ (Stratonovich)"])

    energy_comparison

    Now we can further compute the "energy" budgets, i.e., the work done by the noise versus the energy loss by the $μ$ term, using Itô and Stratonovich formalisms. Figures below show the ensemble mean energy budgets (using 1000 ensemble members) as computed using Itô and Stratonovich calculus. For the energy budget to close we have to be consistent: if we time-step the energy equation based on Stratonovich calculus then we must compute the work also according to Stratonovich and vice versa.

    # theoretical results for ⟨E⟩ and d⟨E⟩/dt
    +   E_theory = @. σ/4μ * (1 - exp(-2μ * t))
    +dEdt_theory = @. σ/2  * exp(-2μ * t)
    +
    +# compute d⟨E⟩/dt numerically
    +dEdt_ito = mean(E_ito[2:nsteps, :] .- E_ito[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_ito = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* x[1:nsteps-1, :] .+ σ/2, dims=2)
    +diss_ito = 2μ * (mean(E_ito[1:nsteps-1, :], dims=2))
    +
    +# Ensemble mean energy budgets from the Itô integration
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Ito: 𝖽Eₜ = (-2μ Eₜ + ½σ) 𝖽t + xₜ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_ito[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_ito, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_ito);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_ito .- diss_ito);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Ito

    # compute d⟨E⟩/dt numerically
    +dEdt_str = mean(E_str[2:nsteps, :] .- E_str[1:nsteps-1, :], dims=2) / dt
    +
    +# compute the work and dissipation
    +work_str = mean(sqrt(σ) * ΔW[1:nsteps-1, :] / dt .* (x[1:nsteps-1, :] .+ x[2:nsteps, :])/2, dims=2)
    +diss_str = 2μ * (mean(E_str[1:nsteps-1, :], dims=2))
    +
    +fig = Figure()
    +
    +ax1 = Axis(fig[1, 1];
    +           xlabel = "μ t",
    +           ylabel = "E",
    +           title = "Stratonovich: 𝖽Eₜ = -2μ Eₜ 𝖽t + xₜ ∘ √σ 𝖽Wₜ")
    +
    +hl1 = lines!(ax1, μ * t, E_theory;
    +             linewidth = 3)
    +hl2 = lines!(ax1, μ * t, vec(mean(E_str[:, 1:some_realizations], dims=2));
    +             linewidth = 2)
    +hl3 = lines!(ax1, μ * t, vec(mean(E_str, dims=2)),
    +             linewidth = 1)
    +
    +Legend(fig[1, 2], [hl1, hl2, hl3],
    +                  ["theoretical ⟨E⟩", "⟨E⟩ from $some_realizations ensemble members", "⟨E⟩ from $n_realizations ensemble members"])
    +
    +ax2 = Axis(fig[2, 1];
    +           xlabel = "μ t",
    +           ylabel = "dE/dt")
    +
    +hl1 = lines!(ax2, μ * t[1:nsteps-1], vec(dEdt_str);
    +             linewidth = 2, linestyle = :dash)
    +hl2 = lines!(ax2, μ * t[1:nsteps-1], vec(work_str .- diss_str);
    +             linewidth = 1, linestyle = :dashdot)
    +hl3 = lines!(ax2, μ * t[1:nsteps-1], dEdt_theory[1:nsteps-1];
    +             linewidth = 3, linestyle = :solid)
    +
    +Legend(fig[2, 2], [hl1, hl2, hl3],
    +                  ["numerical 𝖽⟨E⟩/𝖽t", "⟨work - dissipation⟩", "theoretical 𝖽⟨E⟩/𝖽t"])

    energy_budgets_Stratonovich

    A simple Stochastic Partial Differential Equation (SPDE)

    We would like now to transfer all the knowledge we got from the previous sections to PDEs. In particular we'll start by focussing on the simple SPDE:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) , \tag{6}\]

    with periodic boundary conditions in both $x$ and $y$. SPDE (6) is also equivalently written as:

    \[\mathrm{d} \nabla^2 \psi_{t}(\bm{x}) = - \mu \nabla^2 \psi_{t} (\bm{x}) \mathrm{d} t + \sqrt{\sigma} \mathrm{d} W_{t} (\bm{x}) .\]

    The form (6) is the continuous version, similar to (2). In this SPDE, since the forcing is purely additive, i.e., it does not depend on the state of the system, both Itô and Stratonovich interpretations coincide.

    The forcing $\xi$ obeys:

    \[\langle \xi(\bm{x}, t) \rangle = 0 \quad \text{and} \quad \langle \xi(\bm{x}, t) \xi(\bm{x}', t') \rangle = Q(\bm{x} - \bm{x}') \delta(t - t') ,\]

    that is, the forcing is white in time but spatially correlated; its spatial correlation is prescribed by the function $Q$ which is, necessarily, homogeneous in all its arguments (see discussion by Constantinou (2015); Appendix A).

    Equation (6) above describes the vorticity evolution of a two-dimensional fluid $\nabla^2 \psi$ that is stochastically forced while dissipated by linear drag $\mu$. The energy of the fluid is:

    \[E = \tfrac{1}{2} \overline{|\bm{\nabla} \psi|^2}^{x, y} = -\tfrac{1}{2} \overline{\psi \nabla^2 \psi}^{x, y} ,\]

    where the overbar denotes average over $x$ and $y$ and an integration-by-parts was carried through in the last equality. To obtain the energy equation we multiply (6) with $-\psi$ and average over the whole domain. Thus, the work done by the forcing is given by:

    \[P = - \, \overline{\psi \, \xi}^{x, y} ,\]

    but the above is a stochastic integral and it is meaningless without a rule for computing the stochastic integral.

    Numerically, the work done by the forcing at the $j$-th timestep can be obtained Stratonovich-wise via:

    \[\begin{aligned} +P_j = - \, \overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1}) }^{x,y} , +\end{aligned}\]

    or Itô-wise as

    \[\begin{aligned} +P_j = -\, \overline{ \psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1}) }^{x,y} + \text{drift} . +\end{aligned}\]

    But how much is the Itô drift term in this case? As in the previous section, the drift is precisely the ensemble mean of the Stratonovich work, i.e.:

    \[\textrm{Ito drift}= - \overline{\langle \underbrace{\psi(\bm{x}, t) \circ \xi(\bm{x}, t)}_{\textrm{Stratonovich}} \rangle}^{x, y} .\]

    But again, the above can be computed using the "formal" solution of (6):

    \[\psi(\bm{x}, t) = e^{-\mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s ,\]

    which implies

    \[\begin{aligned} +\text{drift} & = -\overline{e^{- \mu t} \underbrace{\left \langle \psi(\bm{x}, 0) \xi(\bm{x}, t) \right \rangle}_{=0}}^{x, y} - \int_0^t e^{- \mu (t - s)} \overline{\nabla^{-2} \left \langle \xi(\bm{x}, s) \xi(\bm{x}, t) \right\rangle}^{x, y} \, \mathrm{d} s \\ +& = - \int_0^t e^{-\mu(t - s)} \overline{\underbrace{\left [ \nabla^{-2} Q (\bm{x}) \right ] \big|_{\bm{x}=0}}_{\text{independent of }x, y} \, \delta(t - s)}^{x,y} \, \mathrm{d} s \\ +& = - \frac1{2} \nabla^{-2} Q(\bm{x}) \big|_{\bm{x}=0} \\ +& = - \frac1{2} \left [ \nabla^{-2} \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \widehat{Q}(\bm{k}) \, e^{i \bm{k} \bm{\cdot} \bm{x}} \right ]_{\bm{x}=0} \\ +& = \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . +\end{aligned}\]

    Thus, the drift, or in this case the mean energy input rate by the stochastic forcing, is precisely determined from the spatial correlation of the forcing, $Q$. Let us denote the drift as:

    \[\varepsilon \equiv \int \frac{\mathrm{d}^2 \bm{k}}{(2\pi)^2} \frac{\widehat{Q}(\bm{k})}{2 |\bm{k}|^2} . \tag{7}\]

    Using the above, the work for a single forcing realization at the $j$-th timestep is numerically computed as:

    \[{\color{Green} \text{Itô}} : {\color{Green} P_j = -\overline{\psi(\bm{x}, t_j) \xi(\bm{x}, t_{j+1})}^{x, y} + \varepsilon} , \tag{8}\]

    \[{\color{Magenta} \text{Stratonovich}} : {\color{Magenta} P_j = -\overline{\frac{\psi(\bm{x}, t_j) + \psi(\bm{x}, t_{j+1})}{2} \xi(\bm{x}, t_{j+1})}^{x, y}} . \tag{9}\]

    Remember, previously the work done by the stochastic forcing was:

    \[\mathrm{d} P_t = {\color{Green} \frac{\sigma}{2}\mathrm{d} t + \sqrt{\sigma} x_t \mathrm{d} W_t} = {\color{Magenta} \sqrt{\sigma} x_t \circ \mathrm{d} W_t} ,\]

    and by sampling over various forcing realizations:

    \[\langle \mathrm{d} P_t \rangle = \frac{\sigma}{2} \mathrm{d} t = \langle \sqrt{\sigma} x_t \circ \mathrm{d} W_t \rangle .\]

    All modules in GeophysicalFlows.jl use Stratonovich calculus. For example, the domain-averaged energy injected per unit time by the forcing in the TwoDNavierStokes module is computed using (9) via the energy_work function.

    A bit more elaborate SPDE

    It turns out everything carries through if in our SPDE above for the 2D vorticity equation we also include the nonlinear advection terms:

    \[\partial_t \nabla^2 \psi(\bm{x}, t) + \mathsf{J}(\psi, \nabla^2 \psi) = - \mu \nabla^2 \psi(\bm{x}, t) + \xi(\bm{x}, t) . \tag{10}\]

    The nonlinearity does not alter the Itô drift; thus the ensemble mean energy input by the stochastic forcing, remains the same. We can easily verify this from the "formal" solution of (10):

    \[\psi(\bm{x}, t) = e^{- \mu t} \psi(\bm{x}, 0) + \int_0^t e^{- \mu (t - s)} \nabla^{-2} \xi(\bm{x}, s) \, \mathrm{d} s - \int_0^t \nabla^{-2} \mathsf{J} \left ( \psi(\bm{x}, s), \nabla^2 \psi(\bm{x}, s) \right ) \mathrm{d} s .\]

    When multiplied with $\xi(\bm{x}, t)$ the last term vanishes since its only non-zero contribution comes from the point $s = t$, which is of measure zero (in the integrated sense).

    A demonstration of how the energy budgets can be computed when we have stochastic forcing is illustrated in an example of the TwoDNavierStokes module.

    diff --git a/v0.16.1/visualize/index.html b/v0.16.1/visualize/index.html new file mode 100644 index 00000000..39cd9803 --- /dev/null +++ b/v0.16.1/visualize/index.html @@ -0,0 +1,2 @@ + +Visualize output · GeophysicalFlows.jl

    Visualize output

    In the examples we use Makie.jl for plotting.

    Makie comes with a few backends. In the documented examples we use CairoMakie since this backend works well on headless devices, that is, devices without monitor. Since the documentation is automatically built via GitHub actions the CairoMakie backend is necessary. Users that run GeophysicalFlows.jl on devices with a monitor might want to change to GLMakie that displays figures in an interactive window.

    In GeophysicalFlows.jl simulations, we can either visualize the fields on-the-fly as the problem is stepped forward or we can save output onto a .jld2 file and after simulation is done load the output and visualize it. Most examples do the former. For a demonstration for how one can save output and load later to process and visualize it have a look at the SingeLayerQG beta-plane forced-dissipative example. For more information about saving output to .jld2 files, files see the Output section in FourierFlows.jl Documentation might be useful.

    diff --git a/versions.js b/versions.js index d190be85..bb778ac0 100644 --- a/versions.js +++ b/versions.js @@ -1,8 +1,27 @@ var DOC_VERSIONS = [ "stable", + "dev", + "v0.16.1", + "v0.16.0", + "v0.15.4", + "v0.15.3", + "v0.15.2", + "v0.15.1", "v0.15.0", "v0.14.1", - "dev", + "v0.13.1", + "v0.12.3", + "v0.11.7", + "v0.10.0", + "v0.9.1", + "v0.8.5", + "v0.7.0", + "v0.6.1", + "v0.5.2", + "v0.4.2", + "v0.3.1", + "v0.2.0", + "v0.1.0", ]; -var DOCUMENTER_NEWEST = "v0.15.0"; +var DOCUMENTER_NEWEST = "v0.16.1"; var DOCUMENTER_STABLE = "stable";